Compare commits
12 Commits
3df51b7340
...
moderncv
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
95998e0f68 | ||
|
|
1fd4071d45 | ||
|
|
ca399ec592 | ||
|
|
3e187326fa | ||
|
|
1579c0aca8 | ||
|
|
5ddc2ead8e | ||
|
|
8feae90435 | ||
|
|
279ae8d509 | ||
|
|
3c963ca5af | ||
|
|
c1f0db6566 | ||
|
|
c093c5ef0e | ||
|
|
d62d696b20 |
6
.gitignore
vendored
6
.gitignore
vendored
@@ -1,14 +1,14 @@
|
||||
# Ignore all files
|
||||
|
||||
*.*
|
||||
|
||||
# Whitelist
|
||||
|
||||
!.gitignore
|
||||
!*.cls
|
||||
!*.tex
|
||||
!*.pdf
|
||||
!*.cls
|
||||
!*.jpg
|
||||
!*.md
|
||||
!.vscode
|
||||
!.vscode/
|
||||
!.vscode/**
|
||||
!build/*.*
|
||||
|
||||
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
@@ -16,5 +16,6 @@
|
||||
}
|
||||
],
|
||||
"latex-workshop.latex.recipe.default": "Smart LaTeX Build",
|
||||
"latex-workshop.formatting.latex": "latexindent"
|
||||
"latex-workshop.formatting.latex": "latexindent",
|
||||
"latex-workshop.latex.autoBuild.run": "onSave"
|
||||
}
|
||||
|
||||
Binary file not shown.
@@ -1,24 +1,84 @@
|
||||
\documentclass{custom-cv}
|
||||
|
||||
\usepackage{fontawesome6} % for icons
|
||||
\documentclass[11pt,a4paper,sans]{pedro-moderncv}
|
||||
\moderncvstyle{classic} % Style options: 'casual', 'classic', 'oldstyle', 'banking'
|
||||
\moderncvcolor{blue} % Color options: 'blue', 'orange', 'green', 'red', 'purple', 'grey', 'black'
|
||||
|
||||
% \cvdebugtrue
|
||||
\usepackage[scale=0.75]{geometry}
|
||||
|
||||
\setcvtitle{Pedro Miguel \textbf{Pessoa Cabral}}
|
||||
\setcvauthor{\faMobile\quad +49-(0)-176-57909188 \quad \faEnvelope\quad \href{mailto:pmpcabral@gmail.com}{pmpcabral@posteo.de}}
|
||||
\setcvphoto{me_m_8x8_4x.jpg} % Try commenting this out to see layout adapt
|
||||
% Personal data
|
||||
\name{Pedro Miguel}{Pessoa Cabral}
|
||||
\title{Curriculum Vitae}
|
||||
\address{Rittmeisterkoppel 14C}{22359 Hamburg}{Germany}
|
||||
\phone[mobile]{+49-(0)-17657-909188}
|
||||
\email{pmpcabral@posteo.de}
|
||||
\homepage{git.sueo.de/pcabral}
|
||||
\social[]{} % Optional: GitHub, LinkedIn, etc.
|
||||
\photo[3.5cm][0pt]{me_m_8x8_4x.jpg}
|
||||
|
||||
\hyphenation{interpersonal}
|
||||
|
||||
\linespread{1.05}
|
||||
|
||||
\begin{document}
|
||||
\maketitle
|
||||
|
||||
\section{Languages}
|
||||
\cvitem{Portuguese}{First Language}{}
|
||||
\cvitem{German}{Fluent}{}
|
||||
\cvitem{English}{Fluent}{}
|
||||
\cvitem{Spanish}{Good}{}
|
||||
\cvitem{French}{Basic}{}
|
||||
\makecvtitle
|
||||
|
||||
\begin{minipage}[t]{0.48\textwidth}
|
||||
\section{Profile}
|
||||
\cvitem{Date of Birth}{January 17\textsuperscript{th}, 1988}
|
||||
\cvitem{Place of Birth}{Setúbal, Portugal}
|
||||
\cvitem{Nationality}{Portuguese}
|
||||
\end{minipage}\hfill
|
||||
\begin{minipage}[t]{0.48\textwidth}
|
||||
\section{Languages}
|
||||
\cvitemwithcomment{Portuguese}{First Language}{}
|
||||
\cvitemwithcomment{German}{Fluent}{}
|
||||
\cvitemwithcomment{English}{Fluent}{}
|
||||
\cvitemwithcomment{Spanish}{Good}{}
|
||||
\cvitemwithcomment{French}{Basic}{}
|
||||
\end{minipage}\hfill
|
||||
|
||||
\section{Experience}
|
||||
\cventry{2017 -- Present}{Software Developer}{HR4YOU AG}{PHP, JavaScript, SQL}
|
||||
\cventry{Apr 2025 -- Present}{Professional Sabbatical}{}{}{}{
|
||||
Dedicated time to personal development and family life following an intensive period in my career. Used this
|
||||
opportunity to recharge, reassess long-term goals, and return with renewed focus and motivation for software
|
||||
engineering.
|
||||
}
|
||||
\cventry{Jun 2021 -- Apr 2025}{Software Developer}{For Sale Digital Internet-Agentur GmbH}{Hamburg, Germany}{}{
|
||||
PHP (\textit{native, Laravel, WordPress}), JavaScript (\textit{Vanilla, jQuery}), MySQL, Google Cloud Platform, TypeScript, React, Jenkins, ShipIt, Docker, Shopify.
|
||||
}
|
||||
\cventry{Feb 2017 -- May 2021}{Software Developer}{HR4YOU AG}{Großefehn, Germany}{}{
|
||||
PHP, JavaScript (\textit{Vanilla, jQuery}), MySQL, CSS, LESS.
|
||||
}
|
||||
\cventry{Sep 2014 -- Apr 2016}{Support \& Operations}{SAFIRA/KPMG}{Carnaxide, Portugal}{}{
|
||||
IBM Business Process Management, Forefront Identity Manager (\textit{FIM}).
|
||||
}
|
||||
\cventry{Apr 2013 -- Sep 2014}{Software Developer}{SAFIRA}{Carnaxide, Portugal}{}{
|
||||
IBM BPM, IBM WebSphere Message Broker, SQL.
|
||||
}
|
||||
|
||||
\section{Education}
|
||||
\cventry{2013}{Bachelor of Science}{Faculdade de Ciências e Tecnologia, Universidade Nova de Lisboa}{Caparica, Portugal}{}{}
|
||||
|
||||
\section{Skills}
|
||||
\cvitem{Languages}{PHP, JavaScript (\textit{Vanilla}), TypeScript, MySQL, CSS, SCSS, HTML}
|
||||
\cvitem{Frameworks \& Libraries}{Laravel, React, jQuery, Bootstrap}
|
||||
\cvitem{Content Management Systems}{WordPress, Shopify}
|
||||
\cvitem{Development Tools}{PHPStorm, Visual Studio Code, Git, Composer, npm, Vite}
|
||||
\cvitem{DevOps \& Automation Tools}{Jenkins, ShipIt, Docker, Kubernetes, Google Cloud Platform}
|
||||
\cvitem{Software Development Practices}{Test-Driven Development (TDD), Object-Oriented Programming (OOP), Mobile-First Design}
|
||||
\cvitem{Soft Skills}{Effective team player, collaborator, and mentor; strong communication and interpersonal skills; experienced moderator}
|
||||
|
||||
\section{About me}
|
||||
|
||||
I believe there are no stupid questions --- only opportunities to learn, improve, and build better things together.
|
||||
|
||||
\bigskip % bigger gap before Personal section
|
||||
|
||||
When I'm not coding, you'll usually find me taking care of and entertaining my two lovely kids.
|
||||
|
||||
\medskip % slightly smaller gap within Personal block
|
||||
|
||||
I also love singing, acting, playing the didgeridoo, and chopping wood. I regularly take cold showers (or ice baths when temperatures drop below zero) in the morning.
|
||||
|
||||
\end{document}
|
||||
|
||||
@@ -1,7 +1,10 @@
|
||||
# Curriculum-Vitae
|
||||
|
||||
This project contains my *curriculum vitae* writen in `TeX` and the class
|
||||
`custom-cv.cls` has been completley designed by me.
|
||||
This project contains my *curriculum vitae* writen in `TeX` using a slightly
|
||||
adapted version of [`moderncv`](https://github.com/moderncv/moderncv), which
|
||||
renders a circular profile picture.
|
||||
|
||||
> :information_source: This is my official current CV version
|
||||
|
||||
## Install TeX
|
||||
|
||||
@@ -17,7 +20,7 @@ If you are using VS Code, I highly recommend to install [LaTeX Workshop](https:/
|
||||
|
||||
- [Article](../article/)
|
||||
- [Awesome-CV](../awesome-cv/)
|
||||
- [ModernCV](../moderncv) (**main CV variant**)
|
||||
- [Pedro-CV](../pedro-cv/)
|
||||
|
||||
##
|
||||
Developed with ♥ by Pedro Pessoa Cabral
|
||||
|
||||
@@ -29,6 +29,7 @@ if ! git rev-parse --verify --quiet "${COMMIT}^{commit}" >/dev/null; then
|
||||
fi
|
||||
|
||||
COMMIT="$(git rev-parse --short "$COMMIT")"
|
||||
COMMIT_MSG="$(git log -1 --pretty=format:%s "$COMMIT")"
|
||||
PARENT_COUNT="$(git rev-list --parents -n 1 "$COMMIT" | wc -w | tr -d ' ')"
|
||||
|
||||
if [[ "$PARENT_COUNT" -gt 2 ]]; then
|
||||
@@ -59,7 +60,7 @@ handle_error() {
|
||||
|
||||
trap handle_error ERR
|
||||
|
||||
echo -e "${BLUE}Replicating commit ${COMMIT} from '${START_BRANCH}' to local branches.${RESET}"
|
||||
echo -e "${BLUE}Propagating commit ${BOLD}'${COMMIT}: ${COMMIT_MSG}'${RESET}${BLUE} from '${START_BRANCH}' to local branches.${RESET}"
|
||||
|
||||
while IFS= read -r BRANCH; do
|
||||
if [[ "$BRANCH" == "$START_BRANCH" ]]; then
|
||||
|
||||
189
custom-cv.cls
189
custom-cv.cls
@@ -1,189 +0,0 @@
|
||||
% =========================
|
||||
% custom-cv.cls (2025-08-13)
|
||||
% =========================
|
||||
\NeedsTeXFormat{LaTeX2e}
|
||||
\ProvidesClass{custom-cv}[2025/08/13 Custom CV class]
|
||||
|
||||
% Base class
|
||||
\LoadClass[11pt,a4paper]{article}
|
||||
|
||||
% Packages
|
||||
\RequirePackage[a4paper,margin=1in]{geometry}
|
||||
\RequirePackage{xcolor}
|
||||
\RequirePackage{graphicx}
|
||||
\RequirePackage{tikz}
|
||||
\RequirePackage{titlesec}
|
||||
\RequirePackage{enumitem}
|
||||
\RequirePackage{hyperref}
|
||||
\RequirePackage{draftwatermark}
|
||||
\RequirePackage{fontspec}
|
||||
\RequirePackage{pgf} % for watermark autoscale
|
||||
|
||||
% ---------------------------
|
||||
% Fonts (with fallback)
|
||||
% ---------------------------
|
||||
\IfFontExistsTF{Helvetica Neue}{
|
||||
\setmainfont{Helvetica Neue}
|
||||
}{
|
||||
\IfFontExistsTF{TeX Gyre Heros}{\setmainfont{TeX Gyre Heros}}{\setmainfont{Latin Modern Roman}}
|
||||
}
|
||||
|
||||
% ---------------------------
|
||||
% Colors
|
||||
% ---------------------------
|
||||
\definecolor{cvblue}{HTML}{1A4E8A}
|
||||
|
||||
% Debug colors & borders
|
||||
\definecolor{debugtext}{HTML}{E0F7FA}
|
||||
\definecolor{debugtextborder}{HTML}{0D47A1}
|
||||
\definecolor{debugphoto}{HTML}{FFEBEE}
|
||||
\definecolor{debugphotoborder}{HTML}{B71C1C}
|
||||
|
||||
% ---------------------------
|
||||
% Debug flag & helpers
|
||||
% ---------------------------
|
||||
\newif\ifcvdebug
|
||||
\cvdebugfalse
|
||||
|
||||
\newcommand{\debugboxtext}[1]{%
|
||||
\ifcvdebug
|
||||
\fcolorbox{debugtextborder}{debugtext}{\parbox{\dimexpr\linewidth-2\fboxsep-2\fboxrule}{#1}}%
|
||||
\else
|
||||
#1%
|
||||
\fi
|
||||
}
|
||||
|
||||
\newcommand{\debugboxphoto}[1]{%
|
||||
\ifcvdebug
|
||||
\fcolorbox{debugphotoborder}{debugphoto}{\parbox{\dimexpr\linewidth-2\fboxsep-2\fboxrule}{#1}}%
|
||||
\else
|
||||
#1%
|
||||
\fi
|
||||
}
|
||||
|
||||
% ---------------------------
|
||||
% CV storage + setters
|
||||
% ---------------------------
|
||||
\newcommand{\cvtitle}{} % main title (name)
|
||||
\newcommand{\cvauthor}{} % contact line
|
||||
\newcommand{\cvphoto}{} % photo path
|
||||
|
||||
\newcommand{\setcvtitle}[1]{\renewcommand{\cvtitle}{#1}}
|
||||
\newcommand{\setcvauthor}[1]{\renewcommand{\cvauthor}{#1}}
|
||||
\newcommand{\setcvphoto}[1]{\renewcommand{\cvphoto}{#1}}
|
||||
|
||||
% ---------------------------
|
||||
% Robust "is empty?" test (trim spaces)
|
||||
% ---------------------------
|
||||
\makeatletter
|
||||
\newcommand{\IfNotEmpty}[3]{%
|
||||
\edef\cv@tmp{\zap@space\detokenize{#1} \@empty}%
|
||||
\ifx\cv@tmp\@empty
|
||||
#3%
|
||||
\else
|
||||
#2%
|
||||
\fi
|
||||
}
|
||||
\makeatother
|
||||
|
||||
% ---------------------------
|
||||
% Hyperlinks & lists
|
||||
% ---------------------------
|
||||
\hypersetup{
|
||||
colorlinks=true,
|
||||
urlcolor=cvblue,
|
||||
linkcolor=cvblue
|
||||
}
|
||||
\setlength{\parskip}{0.4em}
|
||||
\setlist[itemize]{noitemsep,topsep=0pt}
|
||||
|
||||
% ---------------------------
|
||||
% Section formatting
|
||||
% ---------------------------
|
||||
\titleformat{\section}
|
||||
{\large\bfseries\color{cvblue}}
|
||||
{}{0em}
|
||||
{\debugboxtext}
|
||||
[\titlerule]
|
||||
|
||||
\titleformat{\subsection}
|
||||
{\normalsize\bfseries\color{cvblue}}
|
||||
{}{0em}
|
||||
{}
|
||||
|
||||
\setcounter{secnumdepth}{0}
|
||||
|
||||
% ---------------------------
|
||||
% CV content commands
|
||||
% ---------------------------
|
||||
\newcommand{\cvitem}[2]{%
|
||||
\debugboxtext{%
|
||||
\noindent\textbf{#1:} #2
|
||||
}\par
|
||||
}
|
||||
|
||||
% \cventry{Title}{Date/Place}{Subtitle/Role}{Details}
|
||||
\newcommand{\cventry}[4]{%
|
||||
\debugboxtext{%
|
||||
\noindent\textbf{#2} \hfill {\small #1}\\
|
||||
\IfNotEmpty{#3}{\textit{#3}\par}{}%
|
||||
#4%
|
||||
}\par\vspace{0.8em}
|
||||
}
|
||||
|
||||
% ---------------------------
|
||||
% maketitle with adaptive layout
|
||||
% ---------------------------
|
||||
\renewcommand{\maketitle}{%
|
||||
\IfNotEmpty{\cvtitle}{%
|
||||
\begin{center}
|
||||
\IfNotEmpty{\cvphoto}{%
|
||||
% Text + Photo
|
||||
\begin{minipage}[c]{0.75\textwidth}
|
||||
\debugboxtext{%
|
||||
{\LARGE \textbf{\cvtitle}}%
|
||||
\IfNotEmpty{\cvauthor}{\\[0.5em]\cvauthor}{}%
|
||||
}
|
||||
\end{minipage}%
|
||||
\hfill
|
||||
\begin{minipage}[c]{0.23\textwidth}
|
||||
\debugboxphoto{%
|
||||
\begin{tikzpicture}
|
||||
\clip (0,0) circle (1.75cm);
|
||||
\node at (0,0) {\includegraphics[height=3.5cm]{\cvphoto}};
|
||||
\end{tikzpicture}
|
||||
}
|
||||
\end{minipage}
|
||||
}{%
|
||||
% No photo: full-width text
|
||||
\begin{minipage}[c]{\textwidth}
|
||||
\debugboxtext{%
|
||||
{\LARGE \textbf{\cvtitle}}%
|
||||
\IfNotEmpty{\cvauthor}{\\[0.5em]\cvauthor}{}%
|
||||
}
|
||||
\end{minipage}
|
||||
}%
|
||||
\end{center}
|
||||
\vspace{1em}
|
||||
}{}%
|
||||
}
|
||||
|
||||
% ---------------------------
|
||||
% Watermark (auto-scale)
|
||||
% ---------------------------
|
||||
\newlength{\cvWatermarkWidth}
|
||||
\newcommand{\cvsetwatermark}{%
|
||||
\ifcvdebug
|
||||
\SetWatermarkText{DEBUG MODE}%
|
||||
{%
|
||||
\fontsize{5cm}{5cm}\selectfont
|
||||
\settowidth{\cvWatermarkWidth}{DEBUG MODE}%
|
||||
}%
|
||||
\pgfmathsetmacro{\cvScale}{min(\paperwidth,\paperheight)/\cvWatermarkWidth*0.9}%
|
||||
\SetWatermarkScale{\cvScale}%
|
||||
\SetWatermarkColor[gray]{0.85}%
|
||||
\else
|
||||
\SetWatermarkText{}%
|
||||
\fi
|
||||
}
|
||||
\AtBeginDocument{\cvsetwatermark}
|
||||
32
pedro-moderncv.cls
Normal file
32
pedro-moderncv.cls
Normal file
@@ -0,0 +1,32 @@
|
||||
\NeedsTeXFormat{LaTeX2e}
|
||||
\ProvidesClass{pedro-moderncv}[2026/02/24 Custom moderncv wrapper]
|
||||
|
||||
\LoadClassWithOptions{moderncv}
|
||||
|
||||
\RequirePackage{tikz}
|
||||
\RequirePackage{etoolbox}
|
||||
|
||||
\AtBeginDocument{%
|
||||
\makeatletter
|
||||
|
||||
% Safe scaled length
|
||||
\newlength{\@photowidthscaled}
|
||||
|
||||
\patchcmd{\makecvhead}
|
||||
{\includegraphics[width=\@photowidth]{\@photo}}
|
||||
{%
|
||||
% Copy original width
|
||||
\setlength{\@photowidthscaled}{\@photowidth}
|
||||
% Scale safely (no calc/dimexpr/TikZ parser issues)
|
||||
\setlength{\@photowidthscaled}{1.2\@photowidthscaled}
|
||||
|
||||
\begin{tikzpicture}
|
||||
\clip (0, 0) circle (\@photowidth/2);
|
||||
\node at (-0.2cm, -0.3cm) {
|
||||
\includegraphics[width=\@photowidthscaled]{\@photo}
|
||||
};
|
||||
\end{tikzpicture}
|
||||
}
|
||||
{}{}
|
||||
\makeatother
|
||||
}
|
||||
Reference in New Issue
Block a user