A LaTeX resume can parse perfectly well in an applicant tracking system, but whether it does depends on the template, not on LaTeX itself. We tested that on 18 October 2026: we put the same invented resume into three popular LaTeX templates (Jake's Resume, Awesome-CV and AltaCV), compiled each one, and ran the PDFs through three open-source text extractors. The single-column template came out almost clean. The others showed every problem people worry about: ligatures that turn "office" into "office", two columns shuffled into one, contact icons extracted as junk characters, and dates that drift away from the job they belong to. Each problem has a setting or a layout change that fixes it, and those are listed below with the ones we tested marked.
No ATS publishes its parser, so the extractors here stand in for the text extraction step every ATS runs first. They are not any one vendor's system.
Why engineers use LaTeX
LaTeX resumes are common among software engineers and researchers for reasons that have little to do with ATS parsing.
- The source is plain text. You can keep it in git, diff it, and keep one master file with a branch per kind of role.
- The typesetting is consistent. Spacing, alignment and hyphenation are handled by the engine, not by dragging boxes around in a word processor.
- The templates are free and popular. On 18 October 2026, the GitHub API showed 28,739 stars for Awesome-CV, 7,047 for sb2nov/resume (the template Jake's Resume is based on), 3,355 for latexcv, 2,827 for Jake's Resume and 1,583 for AltaCV. Overleaf's CV and resume gallery ran to 36 pages the same day.
The cost is that a PDF's appearance and its extractable text are two separate things, and LaTeX gives you full control of the first and very little visibility into the second. One fact surprised us: when we read the bullet lines of all three PDFs with space inference turned off, they contained no space characters at all. Every word break in the extracted text was inferred by the extractor from the gap between letters, which is one reason layout choices matter so much.
Our parse test: three templates through pdftotext
Method. We wrote one invented resume (a software engineer named Renée Lindqvist, with a placeholder phone number and an example.com email) and set it in each template using the template's own commands. The bullets were chosen to catch common failures:
Cut office workflow time 30% by fixing fifty financial filings in the official file. Built C++ and C# tools; shipped Node.js and .NET services with 99.9% uptime. Saved $1.2M in cloud spend by moving batch jobs to Kubernetes.
We compiled on TeXLive.net, which ran TeX Live 2026
(pdfTeX 1.40.29). Jake's Resume and AltaCV were compiled with pdfLaTeX.
Awesome-CV's README tells you to compile with XeLaTeX, but XeLaTeX on that
server could not find its fonts by name, so we compiled it with LuaLaTeX. We
then extracted the text with Poppler's pdftotext 26.04.0 (default, -layout
and -raw modes), pdfminer.six 20231228 and PyMuPDF 1.23.21.
| Template, version tested | Engine | Layout | Result |
|---|---|---|---|
| Jake's Resume, commit of 14 September 2020 | pdfLaTeX | One column, dates right-aligned in a table | Text, ligatures and symbols intact. Right-aligned dates and locations detached from their jobs in two tools. Accented "é" split in two tools. |
| Awesome-CV, commit of 14 September 2026 | LuaLaTeX | One column, icons, custom fonts | Ligatures and accents intact. Icons became emoji and words in two tools. Dates and skill labels detached in two tools. Spaces lost in pdftotext's raw mode. |
| AltaCV v1.7.4 | pdfLaTeX | Two columns, icons, custom fonts | Ligatures broke in all three tools. Columns interleaved in two tools. Icons became junk characters in two tools. |
What came through everywhere: C++, C#, .NET, $1.2M, 99.9% and the email address survived in every template and every tool. Ordinary text in LaTeX is not the problem. Layout and fonts are.
Ligatures, columns and icon fonts
Ligatures
A ligature joins letter pairs such as "fi" into one glyph. In the PDF, each glyph needs a map back to the letters it stands for. When that map points at a single Unicode ligature character instead of the separate letters, a keyword search for "office" may not match what the parser stored.
- AltaCV (Lato font, pdfLaTeX): all three extractors returned "Cut office workflow time 30% by fixing fifty financial filings in the official file". Every "ffi", "fl" and "fi" came out as one ligature character.
- Jake's Resume with its optional Roboto font: the same failure, eight ligature characters in pdftotext. Jake's template offers six commented-out font packages. We tried each: Fira Sans, Noto Sans, Source Sans Pro, Cormorant Garamond and Charter extracted "office" correctly; Roboto did not.
- Jake's Resume with its default Computer Modern font: clean, because the
template adds
\input{glyphtounicode}and\pdfgentounicode=1, under a comment saying they make the PDF "machine readable/ATS parsable".
That last pair of lines matters less than it used to. On TeX Live 2026, a bare
pdfLaTeX document already reports \pdfgentounicode as 1, and removing both
lines from Jake's template produced the same fonts with Unicode maps. When we
switched the setting off on purpose (\pdfgentounicode=0) to mimic an older
installation, pdftotext still read "office", but pdfminer.six and PyMuPDF
returned "Office" style ligatures and "Ren´ee" with the accent split off. Keep
the two lines; they are harmless on new systems and protect you on old ones.
Columns and right-aligned dates
pdftotext's default mode and pdfminer.six read a page by grouping nearby text into blocks. Text that sits far to the right becomes its own block.
- AltaCV's two columns were interleaved. In pdftotext's default mode, the
right column's headings landed inside the left column's bullets. The first
bullet was cut after "in the", followed by the "LANGUAGES" heading, then the
second bullet, then "English" and "Swedish", and only then "official file."
pdfminer.six interleaved them in a similar way. PyMuPDF and pdftotext's
-rawmode read the left column first and then the right, as written. - Right-aligned dates drifted. Jake's template puts the job title on the
left and the dates on the right of a table row. In pdftotext's default mode,
the experience dates and location came out after all three bullets, and the
education dates came out at the very end of the page, after the skills
section. pdfminer.six collected every date and location at the end. Awesome-CV did the same, and also separated its
skill labels ("Languages", "Tools") from the skill lists next to them.
-layoutmode and PyMuPDF kept each date on its own line.
The pattern is the point. The same PDF read correctly in one tool and out of order in another, and you do not get to choose the tool. Greenhouse's help article on an unsuccessful resume parse lists "resumes that have a columned layout", "complex resumes with tables, headers, and footers" and resumes with the name and contact information in a header or text box among the causes.
Icon fonts
Both icon templates draw the phone, email, LinkedIn and GitHub symbols with Font Awesome. Both also attach replacement text to the icons, which only pdftotext used.
- AltaCV: pdftotext returned labelled lines such as "email: mailto:" before the address and "phone: tel:" before the number. pdfminer.six returned "(cid:131)" before the phone number, "§" before the GitHub handle and "*" before the location. PyMuPDF returned similar stray characters. The LinkedIn and GitHub URLs shrank to the bare handle in both.
- Awesome-CV: pdftotext returned "tel:", "mailto:", "GitHub: @" and "LinkedIn: /in/" prefixes. pdfminer.six and PyMuPDF returned a mobile phone emoji, an envelope symbol, and the words "GITHUB-SQUARE" and "LINKEDIN" in front of the handles.
A parser looking for a phone number will usually still find the digits. A parser filling a "LinkedIn URL" field from "LINKEDIN renee-sample" may not.
Two smaller findings
- Fake small caps split words. Jake's template sets the name and section headings in small caps. With the Charter font option, which has no true small caps, pdftotext returned "R EN ÉE L INDQVIST" and "E XPERIENCE", the same split that letter-spaced headings cause in our resume font test. Greenhouse lists "a resume with spaces between the letters" as a parse failure too.
- Spaces vanished in one mode. In pdftotext's
-rawmode, the Awesome-CV file lost many word breaks ("Cutoffice", "time30%byfixingfifty"). The default mode and both other tools kept them. This is the cost of every space being inferred, described above.
Settings that fix each problem
We retested each fix marked "tested" on the same content.
| Problem | Fix | Status |
|---|---|---|
| Accents split ("Ren´ee") in pdfminer.six and PyMuPDF | Add \usepackage[T1]{fontenc} and \usepackage{lmodern} to the preamble | Tested on Jake's Resume: "Renée" in all three tools |
| Ligature characters ("office") | Add \usepackage{microtype} and \DisableLigatures{encoding = *, family = *} | Tested with pdfLaTeX on AltaCV and on Jake's Resume with Roboto: "office" in all three tools |
| Missing Unicode maps on an older TeX install | Keep \input{glyphtounicode} and \pdfgentounicode=1 | Tested by switching it off and on |
| Dates and locations detached from the job | Put them on the same line as the title with a separator, for example Software Engineer | Jun 2023 to Present, instead of a right-aligned table cell | Tested: inline dates stayed with the job in all three tools. Using \hfill on one line did not help |
| Two columns interleaved | Use one column. No compile setting fixes reading order across parsers | Observed: one-column templates kept sections in order |
| Icon junk in the contact line | Delete the icon commands and write plain text: the number, the email, linkedin.com/in/yourname | Plain text in Jake's template extracted cleanly everywhere |
| Fake small caps splitting words | Replace \scshape with \bfseries in the section and name formatting | Tested with Charter: "Experience" intact |
Two notes on the table. \DisableLigatures was tested with pdfLaTeX only.
Under LuaLaTeX, Awesome-CV's ligatures already extracted correctly, so we had
nothing to fix there. And the inline-date fix moved the bullet symbols slightly
out of place in pdftotext's default mode, while the bullet text stayed
correct; the dates were worth it.
Templates worth starting from
| Template | Layout | Engine | Start here if |
|---|---|---|---|
| Jake's Resume | One column, no icons | pdfLaTeX | You want the safest base. Add the T1 encoding and move dates inline |
| sb2nov/resume | One column | pdfLaTeX | You want the original that Jake's is based on (not tested here) |
| Awesome-CV | One column, icons, colored accents | XeLaTeX or LuaLaTeX | You like the design and will replace the icons with plain text |
| AltaCV | Two columns, icons, skill ratings | pdfLaTeX, XeLaTeX or LuaLaTeX | You need a visual CV for a person to read, not for an upload form |
| latexcv | Several, including sidebar and two-column | Varies | You want options; for uploads, pick a layout without a sidebar or second column (not tested here) |
AltaCV's own README is honest about this. Under "Is this template
ATS-friendly?", it says "no actual claims are made, because we don't really
know how each ATS system works", and suggests running pdftotext -raw to see
the text-only version. That is good advice for any template.
For the rest of the layout choices (section names, order, length), see our guide to the ATS friendly resume format and the software engineer resume guide.
When to skip LaTeX
- The employer or recruiter wants Word. Greenhouse accepts .doc, .docx, .pdf, .rtf and .txt, so a PDF is fine there, but agency recruiters often want to edit your file. LaTeX does not export a clean DOCX, so you would maintain two versions.
- You will tailor heavily. Rewriting bullets for each posting is slower when every edit is a compile, and slower again if a template error stops the build. Our guide on how to tailor a resume covers what to change per job.
- You are on Overleaf's free plan with a heavy template. Overleaf announced in June 2025 that free compiles time out after 10 seconds, against 4 minutes on premium plans. A one-page resume is usually fine; a template that loads many fonts, images or a bibliography may not be.
- You want a two-column design for uploads. Our test and Greenhouse's documentation point the same way. Keep the two-column version for handing to people, and upload a one-column one.
If none of those apply, LaTeX is a fine choice. Most of the problems above are one line in the preamble or a layout decision.
Check your own LaTeX PDF
- Run
pdftotext resume.pdf -and read the output top to bottom. Each job's title, employer, dates and bullets should appear together and in order. - Run
pdftotext -raw resume.pdf -and check that words are still separated. - Search the output for "fi" or "ffi". If either appears, add the ligature fix.
- Read your contact line. There should be no stray symbols, emoji or icon names before the phone, email or links.
- If you have Python,
python -c "import fitz; print(fitz.open('resume.pdf')[0].get_text())"shows what PyMuPDF reads. Agreement between two tools is a good sign.
ApplyEze, the product this blog belongs to, writes a resume and cover letter for every posting, as PDF and DOCX, and reads each one back with a parser check before upload.
