Skip to content

Commit 115f500

Browse files
committed
pdf: rebalance the CV across two pages
The one-page layout was held together by negative \vspace throughout - after the name, after every section heading, after every list - which is what made it feel cramped. With the phase 1 content it spilled onto a second page anyway, badly: page one packed, page two at a quarter. Replaced the compression with real spacing: - Margins go from 1.2/1.1/1.0/1.1cm to 1.6/1.3/1.6/1.5cm. - Section headings use \titlespacing instead of negative offsets around the rule. - List item separation, entry dividers and the gaps around nested engagements all get room to breathe. - Footer carries the name and "page / of", via lastpage. Tuned in two passes: the first relaxation ran to three pages with a single orphaned skills line, so the added spacing was scaled back until it settled at two. The break now falls on the Education heading - a section boundary, not mid-entry - leaving experience whole on page one. Compiles clean, zero overfull boxes. Regenerated the committed PDF and its thumbnail with the workflow's own pdftoppm invocation. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012ubYyHTXGyiRAqPMqeQgJE
1 parent 37ff67c commit 115f500

5 files changed

Lines changed: 37 additions & 44 deletions

File tree

docs/RubenBrito-CV.pdf

1.02 KB
Binary file not shown.

docs/assets/cv-preview.png

-53.7 KB
Loading

main.tex

Lines changed: 17 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,14 @@
4040
\definecolor{boxBg}{HTML}{FBFBFA} % Page-tone box background
4141

4242
% Page layout
43+
\usepackage{lastpage}
4344
\pagestyle{fancy}
4445
\fancyhf{}
45-
\fancyfoot{}
4646
\renewcommand{\headrulewidth}{0pt}
4747
\renewcommand{\footrulewidth}{0pt}
48-
\geometry{left=1.2cm, top=1.1cm, right=1.0cm, bottom=1.1cm}
49-
\setlength{\footskip}{5pt}
48+
\fancyfoot[C]{\footnotesize\color{mutedGray}Rubén Brito~~$\cdot$~~\thepage\,/\,\pageref{LastPage}}
49+
\geometry{left=1.6cm, top=1.3cm, right=1.6cm, bottom=1.5cm}
50+
\setlength{\footskip}{24pt}
5051

5152
% Hyperlink setup
5253
\usepackage[hidelinks]{hyperref}
@@ -89,9 +90,11 @@
8990
\setlength{\tabcolsep}{0in}
9091

9192
% Section formatting
92-
\titleformat{\section}{
93-
\vspace{-2pt}\bfseries\raggedright\large\color{primaryColor}
94-
}{}{0em}{}[\vspace{-2pt}{\color{accentColor}\titlerule[1.2pt]} \vspace{-7pt}]
93+
\titleformat{\section}
94+
{\bfseries\raggedright\large\color{primaryColor}}
95+
{}{0em}{}
96+
[{\color{accentColor}\titlerule[1pt]}]
97+
\titlespacing*{\section}{0pt}{4.2mm}{1.8mm}
9598

9699
% Badge for skills/tags
97100
\newtcbox{\venuebadge}{on line, colback=badgeBg, colframe=accentColor,
@@ -104,7 +107,7 @@
104107
\newcommand{\accIcon}[2]{\BeginAccSupp{method=plain,ActualText=#2}#1\EndAccSupp{}}
105108

106109
% Subtle hairline divider between individual entries within a list.
107-
\newcommand{\entryDivider}{\vspace{0.3mm}{\color{mutedGray!30}\hrule height 0.3pt}\vspace{0.3mm}}
110+
\newcommand{\entryDivider}{\vspace{1.1mm}{\color{mutedGray!30}\hrule height 0.3pt}\vspace{1.1mm}}
108111

109112
\newcommand{\resumeItem}[2]{
110113
\item{
@@ -117,7 +120,7 @@
117120
\begin{tabular*}{0.98\textwidth}[t]{l@{\extracolsep{\fill}}r}
118121
\textbf{\large{\color{primaryColor}#1}}~{\color{black}$\bullet$}~{\color{black}\textbf{\textit{#2}}} & \textit{\footnotesize{\color{mutedGray}#3}}
119122
\end{tabular*}
120-
\vspace{-1.4mm}
123+
\vspace{-0.4mm}
121124
}
122125

123126
\newcommand{\resumeEduheading}[4]{
@@ -126,16 +129,16 @@
126129
\textbf{\color{primaryColor}#1} & \textit{\footnotesize{\color{mutedGray}#4}} \\
127130
\textit{\small{#3}} & \footnotesize{\color{mutedGray}#2}\\
128131
\end{tabular*}
129-
\vspace{-2.4mm}
132+
\vspace{-1.0mm}
130133
}
131134

132-
\newcommand{\resumeSubHeadingListStart}{\begin{itemize}[leftmargin=*,labelsep=1mm,label={},itemsep=0.3mm,topsep=0pt]}
133-
\newcommand{\resumeItemListStart}{\begin{itemize}[leftmargin=*,labelsep=1mm,itemsep=0.3mm,label=\textcolor{accentWarm}{\textbullet}]}
134-
\newcommand{\resumeSubHeadingListEnd}{\end{itemize}\vspace{1mm}}
135-
\newcommand{\resumeItemListEnd}{\end{itemize}\vspace{-2mm}}
135+
\newcommand{\resumeSubHeadingListStart}{\begin{itemize}[leftmargin=*,labelsep=1mm,label={},itemsep=1.1mm,topsep=0pt]}
136+
\newcommand{\resumeItemListStart}{\begin{itemize}[leftmargin=*,labelsep=1mm,itemsep=0.7mm,label=\textcolor{accentWarm}{\textbullet}]}
137+
\newcommand{\resumeSubHeadingListEnd}{\end{itemize}\vspace{2mm}}
138+
\newcommand{\resumeItemListEnd}{\end{itemize}\vspace{0.4mm}}
136139

137140
% Client engagement nested inside a consulting role.
138-
\newcommand{\resumeEngagementListStart}{\begin{itemize}[leftmargin=4mm,labelsep=1mm,itemsep=0.2mm,topsep=0.4mm,label=\textcolor{mutedGray}{\textbullet}]}
141+
\newcommand{\resumeEngagementListStart}{\begin{itemize}[leftmargin=4mm,labelsep=1mm,itemsep=0.5mm,topsep=0.7mm,label=\textcolor{mutedGray}{\textbullet}]}
139142
\newcommand{\resumeEngagementListEnd}{\end{itemize}\vspace{0.3mm}}
140143
\newcommand{\resumeEngagement}[2]{\item \textbf{#1}\hfill{\footnotesize\textit{\color{mutedGray}#2}}}
141144

@@ -169,13 +172,10 @@
169172

170173
\phantomsection\pdfbookmark[1]{Summary}{sec:summary}
171174
\section{\faUser~~\MakeUppercase{Summary}}
172-
\vspace{-0.4mm}
173175
Software Engineer with 11 years across banking, telecom and consulting, based in Madrid. At Santander UK since 2019, on the credit risk and scoring systems behind retail and corporate lending -- owned end to end, from architecture and API contracts through delivery pipelines to how the services run in production: autoscaling, resource tuning and monitoring. Delivered one of Santander's earliest Machine Learning proofs of concept in risk decisioning in 2017--2018; today, custom MCP agents take the repetitive engineering work off the team.
174-
\vspace{-4mm}
175176

176177
\phantomsection\pdfbookmark[1]{Work Experience}{sec:work-experience}
177178
\section{\faBriefcase~~\MakeUppercase{Work Experience}}
178-
\vspace{-0.4mm}
179179
\resumeSubHeadingListStart
180180

181181
\begin{samepage}
@@ -230,11 +230,9 @@ \section{\faBriefcase~~\MakeUppercase{Work Experience}}
230230
\end{samepage}
231231

232232
\resumeSubHeadingListEnd
233-
\vspace{-6mm}
234233

235234
\phantomsection\pdfbookmark[1]{Education}{sec:education}
236235
\section{\faGraduationCap~~\MakeUppercase{Education}}
237-
\vspace{-0.4mm}
238236
\resumeSubHeadingListStart
239237

240238
\begin{samepage}
@@ -256,20 +254,16 @@ \section{\faGraduationCap~~\MakeUppercase{Education}}
256254
\end{samepage}
257255

258256
\resumeSubHeadingListEnd
259-
\vspace{-6mm}
260257

261258
\phantomsection\pdfbookmark[1]{Languages}{sec:languages}
262259
\section{\faGlobe~~\MakeUppercase{Languages}}
263-
\vspace{-0.4mm}
264260
\resumeSubHeadingListStart
265261
\resumeItem{Spanish}{Native}
266262
\resumeItem{English}{Professional working proficiency}
267263
\resumeSubHeadingListEnd
268-
\vspace{-6mm}
269264

270265
\phantomsection\pdfbookmark[1]{Technical Skills}{sec:technical-skills}
271266
\section{\faCode~~\MakeUppercase{Technical Skills}}
272-
\vspace{-0.4mm}
273267
\resumeSubHeadingListStart
274268
\resumeItem{Languages}{Java, Python, JavaScript / Node.js, R}
275269
\resumeItem{Platform \& Runtime}{OpenShift, Docker, AWS (S3, Lambda, Athena, CloudWatch), Terraform, Autoscaling \& resource tuning, Load balancing}

tools/preamble.tex

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,14 @@
3737
\definecolor{boxBg}{HTML}{FBFBFA} % Page-tone box background
3838

3939
% Page layout
40+
\usepackage{lastpage}
4041
\pagestyle{fancy}
4142
\fancyhf{}
42-
\fancyfoot{}
4343
\renewcommand{\headrulewidth}{0pt}
4444
\renewcommand{\footrulewidth}{0pt}
45-
\geometry{left=1.2cm, top=1.1cm, right=1.0cm, bottom=1.1cm}
46-
\setlength{\footskip}{5pt}
45+
\fancyfoot[C]{\footnotesize\color{mutedGray}{{PDF_FOOTER_NAME}}~~$\cdot$~~\thepage\,/\,\pageref{LastPage}}
46+
\geometry{left=1.6cm, top=1.3cm, right=1.6cm, bottom=1.5cm}
47+
\setlength{\footskip}{24pt}
4748

4849
% Hyperlink setup
4950
\usepackage[hidelinks]{hyperref}
@@ -86,9 +87,11 @@
8687
\setlength{\tabcolsep}{0in}
8788

8889
% Section formatting
89-
\titleformat{\section}{
90-
\vspace{-2pt}\bfseries\raggedright\large\color{primaryColor}
91-
}{}{0em}{}[\vspace{-2pt}{\color{accentColor}\titlerule[1.2pt]} \vspace{-7pt}]
90+
\titleformat{\section}
91+
{\bfseries\raggedright\large\color{primaryColor}}
92+
{}{0em}{}
93+
[{\color{accentColor}\titlerule[1pt]}]
94+
\titlespacing*{\section}{0pt}{4.2mm}{1.8mm}
9295

9396
% Badge for skills/tags
9497
\newtcbox{\venuebadge}{on line, colback=badgeBg, colframe=accentColor,
@@ -101,7 +104,7 @@
101104
\newcommand{\accIcon}[2]{\BeginAccSupp{method=plain,ActualText=#2}#1\EndAccSupp{}}
102105

103106
% Subtle hairline divider between individual entries within a list.
104-
\newcommand{\entryDivider}{\vspace{0.3mm}{\color{mutedGray!30}\hrule height 0.3pt}\vspace{0.3mm}}
107+
\newcommand{\entryDivider}{\vspace{1.1mm}{\color{mutedGray!30}\hrule height 0.3pt}\vspace{1.1mm}}
105108

106109
\newcommand{\resumeItem}[2]{
107110
\item{
@@ -114,7 +117,7 @@
114117
\begin{tabular*}{0.98\textwidth}[t]{l@{\extracolsep{\fill}}r}
115118
\textbf{\large{\color{primaryColor}#1}}~{\color{black}$\bullet$}~{\color{black}\textbf{\textit{#2}}} & \textit{\footnotesize{\color{mutedGray}#3}}
116119
\end{tabular*}
117-
\vspace{-1.4mm}
120+
\vspace{-0.4mm}
118121
}
119122

120123
\newcommand{\resumeEduheading}[4]{
@@ -123,16 +126,16 @@
123126
\textbf{\color{primaryColor}#1} & \textit{\footnotesize{\color{mutedGray}#4}} \\
124127
\textit{\small{#3}} & \footnotesize{\color{mutedGray}#2}\\
125128
\end{tabular*}
126-
\vspace{-2.4mm}
129+
\vspace{-1.0mm}
127130
}
128131

129-
\newcommand{\resumeSubHeadingListStart}{\begin{itemize}[leftmargin=*,labelsep=1mm,label={},itemsep=0.3mm,topsep=0pt]}
130-
\newcommand{\resumeItemListStart}{\begin{itemize}[leftmargin=*,labelsep=1mm,itemsep=0.3mm,label=\textcolor{accentWarm}{\textbullet}]}
131-
\newcommand{\resumeSubHeadingListEnd}{\end{itemize}\vspace{1mm}}
132-
\newcommand{\resumeItemListEnd}{\end{itemize}\vspace{-2mm}}
132+
\newcommand{\resumeSubHeadingListStart}{\begin{itemize}[leftmargin=*,labelsep=1mm,label={},itemsep=1.1mm,topsep=0pt]}
133+
\newcommand{\resumeItemListStart}{\begin{itemize}[leftmargin=*,labelsep=1mm,itemsep=0.7mm,label=\textcolor{accentWarm}{\textbullet}]}
134+
\newcommand{\resumeSubHeadingListEnd}{\end{itemize}\vspace{2mm}}
135+
\newcommand{\resumeItemListEnd}{\end{itemize}\vspace{0.4mm}}
133136

134137
% Client engagement nested inside a consulting role.
135-
\newcommand{\resumeEngagementListStart}{\begin{itemize}[leftmargin=4mm,labelsep=1mm,itemsep=0.2mm,topsep=0.4mm,label=\textcolor{mutedGray}{\textbullet}]}
138+
\newcommand{\resumeEngagementListStart}{\begin{itemize}[leftmargin=4mm,labelsep=1mm,itemsep=0.5mm,topsep=0.7mm,label=\textcolor{mutedGray}{\textbullet}]}
136139
\newcommand{\resumeEngagementListEnd}{\end{itemize}\vspace{0.3mm}}
137140
\newcommand{\resumeEngagement}[2]{\item \textbf{#1}\hfill{\footnotesize\textit{\color{mutedGray}#2}}}
138141

tools/render-tex.mjs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,7 @@ const slug = (s) => s.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g
1616

1717
function sectionHead(key, title) {
1818
return `\\phantomsection\\pdfbookmark[1]{${title}}{sec:${slug(title)}}
19-
\\section{${SECTION_ICONS[key]}~~\\MakeUppercase{${title}}}
20-
\\vspace{-0.4mm}`;
19+
\\section{${SECTION_ICONS[key]}~~\\MakeUppercase{${title}}}`;
2120
}
2221

2322
function badges(stack) {
@@ -76,7 +75,8 @@ export function renderTex(cv, locale = cv.meta.defaultLocale, preamblePath) {
7675
.replace('{{PDF_AUTHOR}}', profile.name)
7776
.replace('{{PDF_SUBJECT}}', cv.pdf.subject)
7877
.replace('{{PDF_KEYWORDS}}', cv.pdf.keywords)
79-
.replace('{{PDF_LANG}}', locale === 'es' ? 'es-ES' : 'en-US');
78+
.replace('{{PDF_LANG}}', locale === 'es' ? 'es-ES' : 'en-US')
79+
.replace('{{PDF_FOOTER_NAME}}', escTex(profile.name));
8080

8181
const roles = cv.experience
8282
.map((r, i) => roleEntry(r, locale, dl, i === cv.experience.length - 1))
@@ -125,29 +125,25 @@ ${preamble}
125125
126126
${sectionHead('summary', tr(S.summary))}
127127
${escTex(tr(cv.summary))}
128-
\\vspace{-4mm}
129128
130129
${sectionHead('experience', tr(S.experience))}
131130
\\resumeSubHeadingListStart
132131
133132
${roles}
134133
135134
\\resumeSubHeadingListEnd
136-
\\vspace{-6mm}
137135
138136
${sectionHead('education', tr(S.education))}
139137
\\resumeSubHeadingListStart
140138
141139
${edu}
142140
143141
\\resumeSubHeadingListEnd
144-
\\vspace{-6mm}
145142
146143
${sectionHead('languages', tr(S.languages))}
147144
\\resumeSubHeadingListStart
148145
${languages}
149146
\\resumeSubHeadingListEnd
150-
\\vspace{-6mm}
151147
152148
${sectionHead('skills', tr(S.skills))}
153149
\\resumeSubHeadingListStart

0 commit comments

Comments
 (0)