Files
ai-job-search/cv/main_example.tex
Ayobami Adegoke 73d52e0991 fix(verify_pdf): fold LaTeX's typographic substitutions before --contains; guard T1 fontenc for pdflatex (#385, #384) (#458)
`normalize_text()` folded whitespace only, so `--contains` compared what a
user types against what LaTeX renders. The stock CV compiled with the
documented lualatex command turns `'` into U+2019 and `--` into U+2013, so
`--contains "Master's degree"` and `--contains "2016-2024"` both reported
the keyword missing from a document that plainly contains it, through both
extractors. The documented remedy for a missing keyword is to add it, which
is the one thing the ATS section forbids.

Fold both sides at comparison time: NFC, then curly apostrophes and quotes
to ASCII, en/em dashes to `-`, no-break space to space. `--dump-text` still
writes the raw layer - that is what an ATS parses, and the date-range rule
in 05-cv-templates.md needs the raw en-dash visible there.

Separately, pdflatex without T1 font encoding stores accents decomposed
(`e` + U+0300). NFC repairs the pdftotext side of that, but pypdf reads the
same layer as `Z¨ urich` with a spacing accent, which no fold recovers.
moderncv 2.5 loads T1 itself under pdflatex; the apt-packaged 2.3.1 does
not - reproduced by compiling the template against moderncv v2.3.1 with
pdflatex (before: U+0308/U+0300 in pdftotext, `Z¨ urich` in pypdf; after:
U+00FC/U+00E8 in both). The template and the guide's preamble gain
`\ifpdftex\usepackage[T1]{fontenc}\fi`; the lualatex text layer is
byte-identical before and after.

Tests: ten new cases in test_verify_pdf.py (the fold-through and
normalize_text ones fail on the whitespace-only code) and a
test_latex_guidance.py guard that the fontenc line exists and stays inside
the pdflatex branch. framework_version 1.4.3 -> 1.4.4 on 05-cv-templates.md.

Reported and diagnosed by 9scorp4 in Discussions #385 and #384.
2026-09-14 18:30:50 +02:00

191 lines
6.8 KiB
TeX

%% Example CV - [YOUR_NAME]
%% Comprehensive overview of all competencies, experience, and achievements.
%% Use as a master reference when tailoring role-specific CVs.
%%
%% SETUP: Run /setup to populate this with your actual information.
%% Compile with: lualatex main_example.tex
%% (pdflatex often fails on modern MiKTeX with fontawesome5 font-expansion errors.)
\documentclass[11pt,a4paper,sans]{moderncv}
\moderncvstyle{banking}
\moderncvcolor{blue}
% Force the name and section headings to render in moderncv blue (color1).
% Default banking leaves them black: moderncvstylebanking.sty's \colorlet
% copies (not aliases) the pre-scheme accent colour, so the name colours are
% frozen before \moderncvcolor runs. Re-let them after. \namefont is the hook
% every name-style macro routes through, so this also works on moderncv 2.3.1
% (Debian/Ubuntu apt), which has no \firstnamestyle/\lastnamestyle at all.
\renewcommand*{\namefont}{\fontsize{34}{36}\bfseries\upshape}
\colorlet{firstnamecolor}{color1}
\colorlet{lastnamecolor}{color1}
\colorlet{namecolor}{color1}
\renewcommand*{\sectionstyle}[1]{{\sectionfont\color{color1}#1}}
\usepackage[utf8]{inputenc}
% pdflatex fallback only (the documented engine is lualatex, which skips this
% branch). Without T1 font encoding pdflatex builds accented letters with
% \accent, and the PDF text layer stores them decomposed - `e` + U+0300 rather
% than U+00E8 - so an ATS keyword match on "Genève" fails while the page looks
% right. moderncv 2.5 loads T1 itself under pdflatex; 2.3.1 (Debian/Ubuntu apt)
% does not. \ifpdftex comes from iftex, which every moderncv version loads.
\ifpdftex\usepackage[T1]{fontenc}\fi
% moderncv loads hyperref itself in an \AtEndPreamble hook, so \hypersetup
% must go in an \AtEndPreamble of our own: on moderncv < 2.4 a top-level
% \usepackage{hyperref} clashes with the class's own
% \RequirePackage[unicode]{hyperref}. From 2.4.0 the class passes its options
% through \PassOptionsToPackage instead, which is what removes that clash.
\AtEndPreamble{\hypersetup{
colorlinks=true,
linkcolor=blue,
filecolor=magenta,
urlcolor=blue,
pdftitle={[YOUR_NAME] - CV},
% Keep pdfpagemode=UseNone: this block runs after moderncv's own
% \AtEndPreamble (moderncv.cls sets pdfpagemode there), so a FullScreen
% value here would win and open every CV in fullscreen presentation mode.
pdfpagemode=UseNone,
}}
\usepackage[scale=0.80]{geometry}
\usepackage{import}
% personal data
\name{[First]}{[Last]}
% If you have no address to list, DELETE this whole line. \address{}{}{} fails
% with "There's no line here to end" on every moderncv version.
\address{[Your Address, City, Country]}{}{}
\phone[mobile]{[+XX XXXXXXXXXX]}
\email{[your.email@example.com]}
\extrainfo{\href{[https://linkedin.com/in/your-profile]}{LinkedIn}, \href{[https://github.com/your-username]}{GitHub}}
\begin{document}
\makecvtitle
% ============================================================
% PROFILE STATEMENT
% ============================================================
\vspace{6pt}
\small{[Write a 3-5 line profile statement tailored to the role you're applying for. Focus on what makes you uniquely qualified. Example: "Data scientist with a PhD in [field] and X years of industry experience. Combines deep domain expertise in [domain] with strong applied machine learning and Python development skills. Experienced in developing end-to-end ML pipelines, from data ingestion to stakeholder-facing dashboards."]}
% ============================================================
% CORE COMPETENCIES
% ============================================================
\section{Core Competencies}
\vspace{1pt}
\begin{itemize}
\item \textbf{[Skill Category 1]}: [Specific skills, frameworks, tools. Be concrete.]
\item \textbf{[Skill Category 2]}: [Specific skills, frameworks, tools.]
\item \textbf{[Skill Category 3]}: [Specific skills, frameworks, tools.]
\item \textbf{[Skill Category 4]}: [Domain expertise, methods, approaches.]
\item \textbf{[Skill Category 5]}: [Tools, platforms, software.]
\end{itemize}
% ============================================================
% PROFESSIONAL EXPERIENCE
% ============================================================
\section{Professional Experience}
\vspace{3pt}
\begin{itemize}
% --- Most Recent Role ---
\item{\cventry{[YYYY-Present]}{[Job Title]}{[Company]}{[City, Country]}{}{\vspace{1pt}
\begin{itemize}
\item {[Achievement or responsibility 1 - be specific, use numbers where possible]}
\item {[Achievement or responsibility 2]}
\item {[Achievement or responsibility 3]}
\item {[Achievement or responsibility 4]}
\end{itemize}}}
\vspace{3pt}
% --- Previous Role ---
\item{\cventry{[YYYY-YYYY]}{[Job Title]}{[Company]}{[City, Country]}{}{\vspace{1pt}
\begin{itemize}
\item {[Achievement or responsibility 1]}
\item {[Achievement or responsibility 2]}
\item {[Achievement or responsibility 3]}
\end{itemize}}}
\vspace{3pt}
% --- Earlier Role ---
\item{\cventry{[YYYY-YYYY]}{[Job Title]}{[Company]}{[City, Country]}{}{\vspace{1pt}
\begin{itemize}
\item {[Achievement or responsibility 1]}
\item {[Achievement or responsibility 2]}
\end{itemize}}}
\end{itemize}
% ============================================================
% EDUCATION
% ============================================================
\section{Education}
\vspace{1pt}
\begin{itemize}
\item{\cventry{[YYYY-YYYY]}{[Degree] in [Field]}{[Institution]}{[City, Country]}{}{\vspace{1pt}
Thesis: ``[Thesis Title].'' [Brief description of research focus.]
}}
\vspace{3pt}
\item{\cventry{[YYYY-YYYY]}{[Degree] in [Field]}{[Institution]}{[City, Country]}{}{\vspace{1pt}
[Brief description or key topics.]
}}
\end{itemize}
% ============================================================
% LANGUAGES
% ============================================================
\section{Languages}
\vspace{1pt}
\begin{itemize}
\item {[Language 1] (native), [Language 2] (fluent), [Language 3] (intermediate).}
\end{itemize}
% ============================================================
% PUBLICATIONS (optional)
% ============================================================
\section{Publications}
\vspace{1pt}
\begin{itemize}
\item {[Author(s)] ([Year]). [Title]. [Journal/Conference]. \href{[DOI_URL]}{DOI link}}
\end{itemize}
% ============================================================
% HONORS AND AWARDS (optional)
% ============================================================
\section{Honors and Awards}
\vspace{1pt}
\begin{itemize}
\item{\textbf{[Award Name]} -- [Event/Organization] ([Year]).}
\end{itemize}
% ============================================================
% REFERENCES
% ============================================================
\section{References}
\vspace{1pt}
\begin{itemize}
\item{Available upon request.}
\end{itemize}
\end{document}