11 Commits

Author SHA1 Message Date
Pedro Cabral
90d02bc82c added commit message 2026-07-17 15:57:03 +02:00
Pedro Cabral
3d9a27d85c auto build only run after save 2026-07-17 13:20:46 +02:00
Pedro Cabral
3752b38db4 changed README.md
removed link to self variant and marked main CV variant
2026-07-17 13:07:18 +02:00
Pedro Cabral
56a414a675 added other CV variants to README.md 2026-07-17 13:03:39 +02:00
Pedro Cabral
799d21386e added script to propagate commits across CV branches 2026-07-17 12:50:52 +02:00
Pedro Cabral
27b9b9cf53 deleting auto-generated files, iff pdf was successfully rendered 2026-07-17 12:39:15 +02:00
Pedro Cabral
40371a39c8 renamed files 2026-07-17 11:47:47 +02:00
Pedro Cabral
1a9df92f3d merged .gitignore file 2026-07-17 11:47:37 +02:00
Pedro Cabral
8478f78d09 moved files to root directory 2026-07-15 00:09:12 +02:00
Pedro Cabral
67457d4d16 removed moderncv 2026-07-15 00:07:25 +02:00
Pedro Cabral
675b3e9b8f removed awesome-cv 2026-07-15 00:07:00 +02:00
8 changed files with 329 additions and 353 deletions

2
.gitignore vendored
View File

@@ -4,10 +4,10 @@
# Whitelist # Whitelist
!.gitignore !.gitignore
!*.cls
!*.tex !*.tex
!*.pdf !*.pdf
!*.jpg !*.jpg
!*.md
!.vscode !.vscode
!.vscode/** !.vscode/**
!build/*.* !build/*.*

View File

@@ -16,5 +16,6 @@
} }
], ],
"latex-workshop.latex.recipe.default": "Smart LaTeX Build", "latex-workshop.latex.recipe.default": "Smart LaTeX Build",
"latex-workshop.formatting.latex": "latexindent" "latex-workshop.formatting.latex": "latexindent",
"latex-workshop.latex.autoBuild.run": "onSave"
} }

File diff suppressed because one or more lines are too long

View File

@@ -1,24 +1,75 @@
\documentclass{custom-cv}
\usepackage{fontawesome6} % for icons \documentclass[11pt,a4paper]{article}
\usepackage[margin=1in]{geometry}
\usepackage{titlesec}
\usepackage{enumitem}
\usepackage{parskip}
\usepackage{hyperref}
\usepackage{fontspec}
\usepackage{graphicx}
% \cvdebugtrue \setmainfont{Helvetica Neue}
\setcvtitle{Pedro Miguel \textbf{Pessoa Cabral}} \titleformat{\section}{\large\bfseries}{}{0em}{}[\titlerule]
\setcvauthor{\faMobile\quad +49-(0)-176-57909188 \quad \faEnvelope\quad \href{mailto:pmpcabral@gmail.com}{pmpcabral@posteo.de}} \titleformat{\subsection}{\normalsize\bfseries}{}{0em}{}
\setcvphoto{me_m_8x8_4x.jpg} % Try commenting this out to see layout adapt
\pagestyle{empty}
\begin{document} \begin{document}
\maketitle
\section{Languages} \begin{center}
\cvitem{Portuguese}{First Language}{} \begin{minipage}{0.75\textwidth}
\cvitem{German}{Fluent}{} {\LARGE \textbf{Pedro Miguel Pessoa Cabral}}\\
\cvitem{English}{Fluent}{} \vspace{0.5em}
\cvitem{Spanish}{Good}{} +49-(0)-17657-909188\\
\cvitem{French}{Basic}{} \href{mailto:pmpcabral@gmail.com}{pmpcabral@gmail.com}\\
Rittmeisterkoppel 14-C, 22359 Hamburg
\end{minipage}%
\begin{minipage}{0.23\textwidth}
\includegraphics[width=\linewidth]{me_m_8x8_4x.jpg}
\end{minipage}
\end{center}
\section{Experience}
\cventry{2017 -- Present}{Software Developer}{HR4YOU AG}{PHP, JavaScript, SQL} \vspace{1em}
\section*{Profile}
\begin{tabular}{rl}
Date and Place of Birth: & January 17\textsuperscript{th}, 1988, Setúbal, Portugal \\
Nationality: & Portuguese \\
Languages: & Portuguese (First language), German (Fluent), English (Fluent),\\
& Spanish (Good), French (Basic)
\end{tabular}
\vspace{1em}
\section*{Experience}
\noindent
\textbf{Software Developer, HR4YOU AG} \hfill Großefehn, Germany \\
\textit{Feb 2017 Present} \\
Technologies: PHP, JavaScript, SQL
\vspace{0.5em}
\noindent
\textbf{Support \& Operations, SAFIRA/KPMG} \hfill Carnaxide, Portugal \\
\textit{Sep 2014 Apr 2016} \\
Worked with IBM Business Process Management and Forefront Identity Manager (FIM)
\vspace{0.5em}
\noindent
\textbf{Software Developer, SAFIRA} \hfill Carnaxide, Portugal \\
\textit{Apr 2013 Sep 2014} \\
Worked with IBM Business Process Management, IBM WebSphere Message Broker, SQL
\vspace{1em}
\section*{Education}
\textbf{Faculdade de Ciências e Tecnologia, Universidade Nova de Lisboa} \hfill Caparica, Portugal \\
Bachelor of Science \hfill 2013
\vspace{1em}
\section*{Skills}
PHP, OOP, JavaScript, jQuery, CSS, SQL, SOAP, REST, PL/SQL, XML
\end{document} \end{document}

View File

@@ -1,7 +1,7 @@
# Curriculum-Vitae # Curriculum-Vitae
This project contains my *curriculum vitae* writen in `TeX` and the class This project contains my *curriculum vitae* writen in `TeX` using the base
`custom-cv.cls` has been completley designed by me. class `article`.
## Install TeX ## Install TeX
@@ -13,5 +13,11 @@ Go to https://tug.org/texlive/ and install the correct TeX for your operating sy
If you are using VS Code, I highly recommend to install [LaTeX Workshop](https://marketplace.visualstudio.com/items?itemName=James-Yu.latex-workshop). If you are using VS Code, I highly recommend to install [LaTeX Workshop](https://marketplace.visualstudio.com/items?itemName=James-Yu.latex-workshop).
## Other CV variants
- [Awesome-CV](../awesome-cv/)
- [ModernCV](../moderncv) (**main CV**)
- [Pedro-CV](../pedro-cv/)
## ##
Developed with ♥ by Pedro Pessoa Cabral Developed with ♥ by Pedro Pessoa Cabral

View File

@@ -19,6 +19,9 @@ FILE="$1"
# append .tex file extension, iff not already passed # append .tex file extension, iff not already passed
[[ "$FILE" != *.tex ]] && FILE="${FILE}.tex" [[ "$FILE" != *.tex ]] && FILE="${FILE}.tex"
# remove the .tex extension from the file name to get the base name
BASE="${FILE%.tex}"
# Check that the file exists # Check that the file exists
if [[ ! -f "$FILE" ]]; then if [[ ! -f "$FILE" ]]; then
echo -e "${BOLD}${RED}Error${RESET}${RED}: File '$FILE' not found.${RESET}" echo -e "${BOLD}${RED}Error${RESET}${RED}: File '$FILE' not found.${RESET}"
@@ -28,8 +31,24 @@ fi
# Detect active \usepackage{fontspec} (ignore commented lines) # Detect active \usepackage{fontspec} (ignore commented lines)
if grep -Eq '^[^%]*\\usepackage\{fontspec\}' "$FILE"; then if grep -Eq '^[^%]*\\usepackage\{fontspec\}' "$FILE"; then
echo -e "${BLUE}Detected fontspec → Using XeLaTeX${RESET}" echo -e "${BLUE}Detected fontspec → Using XeLaTeX${RESET}"
xelatex -synctex=1 -interaction=nonstopmode -file-line-error "$FILE" LATEX_CMD=(xelatex -synctex=1 -interaction=nonstopmode -file-line-error "$FILE")
else else
echo -e "${BLUE}No active fontspec → Using pdfLaTeX${RESET}" echo -e "${BLUE}No active fontspec → Using pdfLaTeX${RESET}"
pdflatex -synctex=1 -interaction=nonstopmode -file-line-error "$FILE" LATEX_CMD=(pdflatex -synctex=1 -interaction=nonstopmode -file-line-error "$FILE")
fi fi
"${LATEX_CMD[@]}"
rm -f \
"${BASE}.aux" \
"${BASE}.bbl" \
"${BASE}.bcf" \
"${BASE}.blg" \
"${BASE}.fdb_latexmk" \
"${BASE}.fls" \
"${BASE}.log" \
"${BASE}.out" \
"${BASE}.run.xml" \
"${BASE}.synctex.gz" \
"${BASE}.toc" \
"${BASE}.xdv"

View File

@@ -0,0 +1,96 @@
#!/bin/bash
set -euo pipefail
# Color definitions
BOLD='\033[1m'
RED='\033[31m'
BLUE='\033[34m'
GREEN='\033[32m'
YELLOW='\033[33m'
RESET='\033[0m'
if [[ $# -ne 1 ]]; then
echo -e "${BOLD}${RED}Error${RESET}${RED}: No commit hash provided.${RESET}"
echo "Usage: $0 <commit-hash>"
exit 1
fi
COMMIT="$1"
START_BRANCH="$(git branch --show-current)"
if [[ -z "$START_BRANCH" ]]; then
echo -e "${BOLD}${RED}Error${RESET}${RED}: Detached HEAD is not supported.${RESET}"
exit 1
fi
if ! git rev-parse --verify --quiet "${COMMIT}^{commit}" >/dev/null; then
echo -e "${BOLD}${RED}Error${RESET}${RED}: Commit '$COMMIT' not found.${RESET}"
exit 1
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
echo -e "${BOLD}${RED}Error${RESET}${RED}: Merge commits are not supported.${RESET}"
exit 1
fi
if [[ -n "$(git status --porcelain)" ]]; then
echo -e "${BOLD}${RED}Error${RESET}${RED}: Working tree is not clean.${RESET}"
echo "Commit, stash, or discard local changes before replicating a commit."
exit 1
fi
restore_branch() {
git switch --quiet "$START_BRANCH"
}
handle_error() {
echo -e "${BOLD}${RED}Error${RESET}${RED}: Replication failed on branch '$(git branch --show-current)'.${RESET}"
if [[ -f "$(git rev-parse --git-path CHERRY_PICK_HEAD 2>/dev/null || true)" ]]; then
git cherry-pick --abort >/dev/null 2>&1 || true
fi
restore_branch
exit 1
}
trap handle_error ERR
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
continue
fi
git switch --quiet "$BRANCH"
if git merge-base --is-ancestor "$COMMIT" HEAD; then
echo -e "${YELLOW}Skipping ${BRANCH}: commit is already present.${RESET}"
continue
fi
echo -e "${BLUE}Cherry-picking ${COMMIT} onto ${BRANCH}.${RESET}"
if ! git cherry-pick "$COMMIT"; then
if git diff --quiet && git diff --cached --quiet; then
echo -e "${YELLOW}Skipping ${BRANCH}: commit is already applied as an equivalent patch.${RESET}"
git cherry-pick --skip
continue
fi
false
fi
echo -e "${GREEN}Commit successfully cherry-picked to ${BRANCH}.${RESET}"
git push
echo -e "${GREEN}Branch ${BRANCH} successfully pushed.${RESET}"
done < <(git for-each-ref --format='%(refname:short)' refs/heads)
restore_branch
echo -e "${GREEN}Done. Returned to '${START_BRANCH}'.${RESET}"

View File

@@ -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}