Compare commits
24 Commits
95e8a944a7
...
1.0.0
| Author | SHA1 | Date | |
|---|---|---|---|
| 782919356b | |||
|
|
9a3654f810 | ||
|
|
d930d7f685 | ||
|
|
adf7b4c275 | ||
|
|
adcd386bf8 | ||
|
|
3cc39f12f4 | ||
|
|
80c8ee1961 | ||
|
|
bc57fbf58b | ||
|
|
02b1c7bbf5 | ||
|
|
c9d7332fc8 | ||
|
|
b3482178e7 | ||
| b30b348ce4 | |||
|
|
753ac09b04 | ||
|
|
4e97205c67 | ||
|
|
84cb871785 | ||
|
|
c04b37aedd | ||
|
|
b3f68dd240 | ||
|
|
f5edda4fe2 | ||
|
|
8b3ba57a7d | ||
|
|
65fb952d6a | ||
| 0b21d4d1b7 | |||
|
|
2de6dccfa8 | ||
|
|
c3cbc61406 | ||
|
|
0df5a0a64c |
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
.DS_Store
|
||||||
19
.vscode/settings.json
vendored
19
.vscode/settings.json
vendored
@@ -1,3 +1,20 @@
|
|||||||
{
|
{
|
||||||
"latex-workshop.latex.recipe.default": "latexmk (xelatex)"
|
"latex-workshop.latex.recipes": [
|
||||||
|
{
|
||||||
|
"name": "Smart LaTeX Build",
|
||||||
|
"tools": ["smart-build"]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"latex-workshop.latex.tools": [
|
||||||
|
{
|
||||||
|
"name": "smart-build",
|
||||||
|
"command": "bash",
|
||||||
|
"args": [
|
||||||
|
"%WORKSPACE_FOLDER%/build/build-latex-smart.sh",
|
||||||
|
"%DOC%"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"latex-workshop.latex.recipe.default": "Smart LaTeX Build",
|
||||||
|
"latex-workshop.formatting.latex": "latexindent"
|
||||||
}
|
}
|
||||||
|
|||||||
34
.vscode/tasks.json
vendored
Normal file
34
.vscode/tasks.json
vendored
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
{
|
||||||
|
"version": "2.0.0",
|
||||||
|
"tasks": [
|
||||||
|
{
|
||||||
|
"label": "Build Current File (XeLaTeX)",
|
||||||
|
"type": "shell",
|
||||||
|
"command": "xelatex",
|
||||||
|
"args": [
|
||||||
|
"-synctex=1",
|
||||||
|
"-interaction=nonstopmode",
|
||||||
|
"-file-line-error",
|
||||||
|
"${file}"
|
||||||
|
],
|
||||||
|
"group": {
|
||||||
|
"kind": "build",
|
||||||
|
"isDefault": true
|
||||||
|
},
|
||||||
|
"problemMatcher": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Build Current File (pdfLaTeX)",
|
||||||
|
"type": "shell",
|
||||||
|
"command": "pdflatex",
|
||||||
|
"args": [
|
||||||
|
"-synctex=1",
|
||||||
|
"-interaction=nonstopmode",
|
||||||
|
"-file-line-error",
|
||||||
|
"${file}"
|
||||||
|
],
|
||||||
|
"group": "build",
|
||||||
|
"problemMatcher": []
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
35
build/build-latex-smart.sh
Executable file
35
build/build-latex-smart.sh
Executable file
@@ -0,0 +1,35 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# Color definitions
|
||||||
|
BOLD='\033[1m'
|
||||||
|
RED='\033[31m'
|
||||||
|
BLUE='\033[34m'
|
||||||
|
RESET='\033[0m'
|
||||||
|
|
||||||
|
# Ensure a file parameter is passed
|
||||||
|
if [[ $# -lt 1 ]]; then
|
||||||
|
echo -e "${BOLD}${RED}Error${RESET}${RED}: No .tex file provided.${RESET}"
|
||||||
|
echo "Usage: $0 <file.tex>"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
FILE="$1"
|
||||||
|
|
||||||
|
# append .tex file extension, iff not already passed
|
||||||
|
[[ "$FILE" != *.tex ]] && FILE="${FILE}.tex"
|
||||||
|
|
||||||
|
# Check that the file exists
|
||||||
|
if [[ ! -f "$FILE" ]]; then
|
||||||
|
echo -e "${BOLD}${RED}Error${RESET}${RED}: File '$FILE' not found.${RESET}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Detect active \usepackage{fontspec} (ignore commented lines)
|
||||||
|
if grep -Eq '^[^%]*\\usepackage\{fontspec\}' "$FILE"; then
|
||||||
|
echo -e "${BLUE}Detected fontspec → Using XeLaTeX${RESET}"
|
||||||
|
xelatex -synctex=1 -interaction=nonstopmode -file-line-error "$FILE"
|
||||||
|
else
|
||||||
|
echo -e "${BLUE}No active fontspec → Using pdfLaTeX${RESET}"
|
||||||
|
pdflatex -synctex=1 -interaction=nonstopmode -file-line-error "$FILE"
|
||||||
|
fi
|
||||||
1
moderncv/.gitignore
vendored
1
moderncv/.gitignore
vendored
@@ -4,3 +4,4 @@
|
|||||||
!.gitignore
|
!.gitignore
|
||||||
!*.tex
|
!*.tex
|
||||||
!*.pdf
|
!*.pdf
|
||||||
|
!*.cls
|
||||||
Binary file not shown.
@@ -1,5 +1,5 @@
|
|||||||
|
|
||||||
\documentclass[11pt,a4paper,sans]{moderncv}
|
\documentclass[11pt,a4paper,sans]{pedro-moderncv}
|
||||||
\moderncvstyle{classic} % Style options: 'casual', 'classic', 'oldstyle', 'banking'
|
\moderncvstyle{classic} % Style options: 'casual', 'classic', 'oldstyle', 'banking'
|
||||||
\moderncvcolor{blue} % Color options: 'blue', 'orange', 'green', 'red', 'purple', 'grey', 'black'
|
\moderncvcolor{blue} % Color options: 'blue', 'orange', 'green', 'red', 'purple', 'grey', 'black'
|
||||||
|
|
||||||
@@ -10,33 +10,43 @@
|
|||||||
\title{Curriculum Vitae}
|
\title{Curriculum Vitae}
|
||||||
\address{Rittmeisterkoppel 14C}{22359 Hamburg}{Germany}
|
\address{Rittmeisterkoppel 14C}{22359 Hamburg}{Germany}
|
||||||
\phone[mobile]{+49-(0)-17657-909188}
|
\phone[mobile]{+49-(0)-17657-909188}
|
||||||
\email{pmpcabral@gmail.com}
|
\email{pmpcabral@posteo.de}
|
||||||
\homepage{https://git.sueo.de/pcabral}
|
\homepage{git.sueo.de/pcabral}
|
||||||
\social[]{} % Optional: GitHub, LinkedIn, etc.
|
\social[]{} % Optional: GitHub, LinkedIn, etc.
|
||||||
\photo{../me_m_8x8_4x.jpg}
|
\photo[3.5cm][0pt]{../me_m_8x8_4x.jpg}
|
||||||
|
|
||||||
|
\hyphenation{interpersonal}
|
||||||
|
|
||||||
|
\linespread{1.05}
|
||||||
|
|
||||||
\begin{document}
|
\begin{document}
|
||||||
|
|
||||||
\makecvtitle
|
\makecvtitle
|
||||||
|
|
||||||
|
\begin{minipage}[t]{0.48\textwidth}
|
||||||
\section{Profile}
|
\section{Profile}
|
||||||
\cvitem{Date of Birth}{January 17\textsuperscript{th}, 1988}
|
\cvitem{Date of Birth}{January 17\textsuperscript{th}, 1988}
|
||||||
\cvitem{Place of Birth}{Setúbal, Portugal}
|
\cvitem{Place of Birth}{Setúbal, Portugal}
|
||||||
\cvitem{Nationality}{Portuguese}
|
\cvitem{Nationality}{Portuguese}
|
||||||
|
\end{minipage}\hfill
|
||||||
|
\begin{minipage}[t]{0.48\textwidth}
|
||||||
\section{Languages}
|
\section{Languages}
|
||||||
\cvitemwithcomment{Portuguese}{First Language}{}
|
\cvitemwithcomment{Portuguese}{First Language}{}
|
||||||
\cvitemwithcomment{German}{Fluent}{}
|
\cvitemwithcomment{German}{Fluent}{}
|
||||||
\cvitemwithcomment{English}{Fluent}{}
|
\cvitemwithcomment{English}{Fluent}{}
|
||||||
\cvitemwithcomment{Spanish}{Good}{}
|
\cvitemwithcomment{Spanish}{Good}{}
|
||||||
\cvitemwithcomment{French}{Basic}{}
|
\cvitemwithcomment{French}{Basic}{}
|
||||||
|
\end{minipage}\hfill
|
||||||
|
|
||||||
\section{Experience}
|
\section{Experience}
|
||||||
\cventry{Feb 2017 -- Present}{Software Developer}{HR4YOU AG}{Großefehn, Germany}{}{
|
\cventry{Jun 2021 -- Jan 2025}{Software Developer}{For Sale Digital Internet-Agentur GmbH}{Hamburg, Germany}{}{
|
||||||
PHP, JavaScript, SQL.
|
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}{}{
|
\cventry{Sep 2014 -- Apr 2016}{Support \& Operations}{SAFIRA/KPMG}{Carnaxide, Portugal}{}{
|
||||||
IBM Business Process Management, Forefront Identity Manager (FIM).
|
IBM Business Process Management, Forefront Identity Manager (\textit{FIM}).
|
||||||
}
|
}
|
||||||
\cventry{Apr 2013 -- Sep 2014}{Software Developer}{SAFIRA}{Carnaxide, Portugal}{}{
|
\cventry{Apr 2013 -- Sep 2014}{Software Developer}{SAFIRA}{Carnaxide, Portugal}{}{
|
||||||
IBM BPM, IBM WebSphere Message Broker, SQL.
|
IBM BPM, IBM WebSphere Message Broker, SQL.
|
||||||
@@ -46,6 +56,24 @@
|
|||||||
\cventry{2013}{Bachelor of Science}{Faculdade de Ciências e Tecnologia, Universidade Nova de Lisboa}{Caparica, Portugal}{}{}
|
\cventry{2013}{Bachelor of Science}{Faculdade de Ciências e Tecnologia, Universidade Nova de Lisboa}{Caparica, Portugal}{}{}
|
||||||
|
|
||||||
\section{Skills}
|
\section{Skills}
|
||||||
\cvitem{Languages \& Tools}{PHP, OOP, JavaScript, jQuery, CSS, SQL, SOAP, REST, PL/SQL, XML}
|
\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}
|
\end{document}
|
||||||
|
|||||||
32
moderncv/pedro-moderncv.cls
Normal file
32
moderncv/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