13 bullets, validator PASS, compiles to exactly 2 pages, rendered PDF inspected clean - no clipping, orphans, header wrapping or bad breaks. Built at the user's direction with the working-model question still open. That block stands: if the Zurich seat is 5-day onsite, this package does not get submitted. Recorded in the session file rather than quietly dropped. Three Phase 2 decisions the user left open, taken and marked reversible. VZ-1 is in - it is the only canonical evidence pairing C++ with a distributed backend and this JD names both, hedged verb preserved. A Personal Project section carries PP-1, labelled three separate ways and with no performance figure of any kind; PP-2 appears as supporting coursework, never as a credential. Generali is kept against the Phase 1 "omit" recommendation, because dropping it opened an unexplained May 2015 to Jun 2017 employment gap that costs more than the weak bullet. Cadence sits at 7/12 (58%), above the section 7a guide of ~50%, down from 75% after reshaping two bullets. The rest are legitimate technology enumerations - "Oracle, Kafka, Python and Teradata", "Elasticsearch, Logstash, Kibana and Kafka". The checker added yesterday cannot tell a rhetorical rule-of-three from a list of tools actually used, which is a real limitation of the pattern rather than a defect in this document. Cutting them would delete accurate ATS-relevant names, which section 7a itself forbids. Left deliberately. Also walked into the trap the SBB .tex header warns about: the first draft named the excluded non-canonical tools in a comment explaining why they were excluded, and the validator errored on all three because it scans raw file text. Comment rewritten without naming them. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MHtzyTKBcg6BWhD5qFegtK
60 lines
1.4 KiB
OpenEdge ABL
60 lines
1.4 KiB
OpenEdge ABL
\ProvidesClass{resume}[2026/07/27 Evidence-first professional resume]
|
|
\LoadClass[11pt,a4paper]{article}
|
|
|
|
\RequirePackage{enumitem}
|
|
\RequirePackage{ifthen}
|
|
\RequirePackage{lastpage}
|
|
\RequirePackage{parskip}
|
|
\RequirePackage{needspace}
|
|
|
|
\pagestyle{empty}
|
|
\setlength{\parindent}{0pt}
|
|
|
|
\def\@resumename{}
|
|
\def\@resumeheadline{}
|
|
\def\@resumecontact{}
|
|
|
|
\newcommand{\name}[1]{\def\@resumename{#1}}
|
|
\newcommand{\headline}[1]{\def\@resumeheadline{#1}}
|
|
\newcommand{\contactline}[1]{\def\@resumecontact{#1}}
|
|
|
|
\newcommand{\printresumeheader}{%
|
|
{\LARGE\bfseries \@resumename}\par
|
|
\vspace{0.15em}
|
|
\ifthenelse{\equal{\@resumeheadline}{}}{}{\@resumeheadline\par}
|
|
\vspace{0.1em}
|
|
{\small \@resumecontact}\par
|
|
\vspace{0.45em}
|
|
}
|
|
|
|
\AtBeginDocument{\printresumeheader}
|
|
|
|
\newenvironment{rSection}[1]{%
|
|
\vspace{0.35em}
|
|
{\bfseries #1}\par
|
|
\vspace{0.1em}\hrule\vspace{0.35em}
|
|
}{%
|
|
\vspace{0.2em}
|
|
}
|
|
|
|
% Arguments: employer, dates, formal title, location.
|
|
\newenvironment{rSubsection}[4]{%
|
|
\Needspace{6\baselineskip}%
|
|
{\bfseries #1}\hfill{\small #2}\par
|
|
{\itshape #3}\hfill{\itshape #4}\par
|
|
\vspace{0.1em}
|
|
\begin{itemize}[leftmargin=1.25em,label=\textbullet,itemsep=0.18em,topsep=0.15em,parsep=0pt,partopsep=0pt]
|
|
}{%
|
|
\end{itemize}
|
|
\vspace{0.25em}
|
|
}
|
|
|
|
\newcommand{\skillline}[2]{%
|
|
\textbf{#1:} #2\par
|
|
\vspace{0.08em}
|
|
}
|
|
|
|
\newcommand{\compactentry}[2]{%
|
|
\textbf{#1}\hfill #2\par
|
|
}
|