3 Commits

Author SHA1 Message Date
Pedro Cabral
95e8a944a7 added tasks to compile manually 2026-02-21 00:13:56 +01:00
Pedro Cabral
f681d5b6fe added smart build 2026-02-21 00:13:56 +01:00
Pedro Cabral
9d485a8cc4 ignore .DS_Store
added blank line to gitignore

added blank line to settings
2026-02-21 00:12:59 +01:00
15 changed files with 8423 additions and 156 deletions

14
.gitignore vendored
View File

@@ -1,13 +1 @@
# Ignore all files
*.*
# Whitelist
!.gitignore
!*.tex
!*.pdf
!*.jpg
!*.md
!.vscode
!.vscode/**
!build/*.*
.DS_Store

View File

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

View File

@@ -1,7 +1,6 @@
# Curriculum-Vitae
This project contains my *curriculum vitae* writen in `TeX` using the base
class `article`.
This project contains my *curriculum vitae* writen in `TeX`.
## Install TeX
@@ -13,11 +12,5 @@ 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).
## Other CV variants
- [Awesome-CV](../awesome-cv/)
- [ModernCV](../moderncv) (**main CV**)
- [Pedro-CV](../pedro-cv/)
##
Developed with ♥ by Pedro Pessoa Cabral

6
article/.gitignore vendored Normal file
View File

@@ -0,0 +1,6 @@
# Ignore all auto-generated files, except for PDF
*.*
!.gitignore
!*.tex
!*.pdf

View File

@@ -3431,22 +3431,23 @@ endobj
24 0 obj
<</Filter/FlateDecode/Length 352>>
stream
xÚ]okƒ0Æßû)ò²c5þé
"T­ÌÁºn¶À&g'Ô¢úí§w®/Ðð;ïò<ñÎN¬PÍÀì£éD «% ôÝh° \e¹œÉF á[´•¶ìô½Ò‡ªfgŸÉÛéðü
·Q`„uÒÝäú|ÊÝ<C38A>I¨)ýt×ÀøÂEVÞûÚBÕ"1ûk:½Ì<>­v²»ÀÓû0L£®luNKŒ”£Ö7hA ̱â<18>sÉŸè$ôº`*u+r¦³(ŸVl<56>ÿ¾»K٥ߕÁôlJwÆ3¹QJåD ’ç#ñ$ßEò¤` q¢„ˆBRØ<52>Â~‡”ú³õÄqÑúâ1üsü¸!ß‘Rñ=¬õHÅÛP<C39B>ļ-SrÇÉëâ|OFèA@)Tî)HåAŽÛ†/¶ÈÈüsç±xL…<18>™Z„³ƒÍŸûÔ(xŒ—îô\…Ï/>­±‚
xÚ]Moƒ0 †ïüŠ;M>ºJ©@Ù8¬«F»;ML‡TB`RÿýÀf=,D<>±ó¾Á¶Ó"+T30ûh:QÂÀêFI}7ì×FY.g²ÃBøm¥-;}¯ô¡j<C2A1>Ù‡,?½>¿Áí†FTa<>t7¹>Ÿr7djJ?Ý50¾p•÷~€¶PuÇ¢ÈbÌþœNïsg«<67>ì.ð4Ç>ŒÓ¨+[<5B>Ó#å¨õ ZPs¬8Æã\ò': ½®˜J]ÁŠœiÅ,ʧ[ ä¿ïîRv©Åwe0=›Ò‡‡ñL®G”…D9QäùHüÉw|)Ø"DáBœ(!"…<>6¤°ß!¥þl=q\´¾x ÿ?nÈwd„T|k=Rñ6$1oKÁ”Üqòº8ß“º@P
•‡{
Ry<EFBFBD>ã¶á-22ÿÜy,S!Fc¦áì`óç>5
ã¥;=Wáó Nz±‰
endstream
endobj
25 0 obj
<</Filter/FlateDecode/Length 315>>
<</Filter/FlateDecode/Length 316>>
stream
xÚ]Ûjƒ@†ï}йL)ÅCb B¢•z´fÓ…¸.ëZÈÛWgL.º°.ßï?fÜ$Os%-¸Zh¤ª öÝ`¯R9~µv&úŠ¶ÒŽ›+}ªZ÷x(÷Çòõo¿h¥¨N8àÛ¹Ìü5ÔØ°³¼k„`æ<-î½Å6WM¸ßcâÞš;,öuwÁ—Iû45©®°8')Å õ [T<'Ž)<29>Ï­‰®Æ^WM¥®èDÞxbˆ²ñĪúßÿ5G]ñSrg£Ûóm<ï1íˆïDᆉ<E280A0>!;·Q¶gJ‰R®9gµž­ùøü(6Ø-Y\y\lÉâ<C389>Å„ÄÕöÑÏô¬}Ãw¾ æ¸æ4€ikÏ¥‰Á˜´ZZÐ4K©ð¹}Ýé)Šî”‡<E2809D>Ñ
xÚ]Mkƒ@†ïþŠ9¦”¢kb>@„Dkë¡i¨ =uL…¸òïëΘº°.Ïë;̸qdªîÁ=˜VæØCU«Ò`×F"œñR+GøPÖ²Ÿˆ¾²)´ãÆ…Þ ‚»=íâï·çw¼þb_Ëb<C38B>¾œŽ©XB‰;<3B>7<EFBFBD>àOœ%ù­ë±ÉTÕB:îט¸ëÍ fÛ²=ã“Õ>M‰¦V˜<>✔|ÐúŠ ª<'Š(<28>àÖd[b§ ‰¦PtBo<„éx"Uùïÿ£Î•ü) ¹ÓÑíyþ:²$<¦ Ñü•(X1±3`çÚ'J·L QÂ5§ìÁ½Ö£5ÁA¾àgG±þŠhÎâÂãbsw,Æ$.Ö÷~ì³$&î|åOpM;»µÇÒä`Ì8FZ--ÈβVøØ¾nµ<6E>¢û~<1F>Å
endstream
endobj
26 0 obj
<</Filter/FlateDecode/Length 324>>
<</Filter/FlateDecode/Length 323>>
stream
xÚ]Qkƒ0…ßýE“V»<56>­¶Ô‡uc¶/{K“k¨1Ä8ðßOs]Pø®÷<1C>÷æeQjåHøa[Q<>#µÒÒB×öV¹ÂMé€2"•p3ù»h¸ Âü<C382>o€„»ý×±(Ÿ<>pÿ§?AËÒñ»ËËù@"¡FÁy0@ØÌeQ <0A>ƒ¦ÔuKÒ4 $üý;g²ØÊö
OSíÝJ°JßÈâW¾RõÆÜ¡íHd™·£˜P´X®o¤Ñx2Æ“ å¿çt]kñÍíÔN±=ŠVIæi<C3A6>´ñÄ^<­)v®±sl™(Ž<>¶H+OëWO CÊbOqŒ´GB— ºìXDW>úœ‘ý%~|!EÝaVÔÆøÎ6[ hÄ´ÄÇEoí8N¿i¿¨i¦JÃãg0­™Tþú%}¡‡
xÚ]akƒ0†¿û+òqc<14>­vZÛ2 ëÊl@šœ] Æã ÿ~IÎõßóÞóÍ]âªÞÔJZ°¤•JúÑp ¸JÑ”ÉíDáÉ;¦£¸ú`úÀ: îmÜí_ÞáöVrv€fµe7ÉgçÓŽæD@‹‚Ó]I'®7Í}°ÐÕªíIQD„Ä_®þ`Í<><­D<44>gû4ŒTWòt®šiF­<6F>²$‰Ê2”£è<C2A3>÷Í8¦®‰[%)vn•(ñï;<3B>d—3ãÓ鯥'É</m<E28098>Ò×@ Š„™ Ìt)ž²i…4´x ”§HR<>¶HXe‰UÖ¹£4¡ó`}ò˜þ9~œ<>¢ˆ®Ñ+j3üg†Áe:•@o„âc†|4Ƶ3L: Ê÷T*x\Ýk¯
û-0¡
endstream
endobj
29 0 obj
@@ -3565,18 +3566,21 @@ endobj
9 0 obj
<</Type/ObjStm/N 24/First 168/Filter/FlateDecode/Length 1308>>
stream
­VÙnÛF}ÏWÌ[$gá, £ZâZm»¶Ò¸aø@­D
"•Úßs‡²á­†ƒD<35>»Î9—rŒ3!™P |µa3iŽ)®™H˜RIÁ”N˜TLYËðë4“Å"¦¥a%˜¢d ¦
ÛÂÄ 2ìÇJ³ž8gX93ÒâB38Æ!8qp<71>QɈa4vìÍhvµöѰªê6:Û^´´zWVÿD£zSøMÊ)“,:Œ¦Ñ A!Ô΢§Szz«¼\¶õëõj=Ï/6ùò—í æõª¿¿<1F>úyZ3Ðpi¹pÊʹ<C38A>´<49>q.ÛßFÓñx”7¾@rpy𽀓ƒºjiÈ<>BBa Î<>/þ†œ›® ÚmŸlêù™oÓèdrÍüe q¾ðãnuÔ|Có}¾òMÚÔó½³6ß´}”fzkœˆB¢8ƒùèü¯OÌJfM2p «¶ËevG$˜ãv€;<L|Ó6„Ý‹ÔÝ$yêz»™û† BÂ<>œÀ3~6¾j ´?F5°lRŠ<>u·Ö|:£×·Iº Žo¡+¢ßË¢ébË¢#_”ù¨¾ ת=ž\,<2C>Ä®ã<>ÏÛzÓ{—Ïü9û·l¿²¯0¹Ùø/}*i±<69>ûMï²øV®/«Kö¹'¹Ô\rý¹ßï´Ëºšä­ïM^Cd¸šs!TüŠË—œ¿ìwŽŽ×¾Îéð®ne…È<E280A6>êÂG¼m—e…DÂåWèXÈíº"!ÛqÞæËzAE*5Ng"I¥u™”©²"“6ÕÚd1²X¦6ŒèD1
ÒZ&:Ó<µ0NÛ ·aÛZÇŒ±™¶Adâ$3œŒd&NI`eªmœÙ¸  ·ÊOÁ¶Ì9 S<>ÂtæT7Z#;oÐpÀ4ö2!\0L  ¹N2l™1R#œ(UIê ¥œ<C2A5>&£H-<2D>ÈyÈ{dL$Ó2u@i8f:µ0B5”Þ<>L<13>B†ˆ5Äyk”‰ ')O²M…UhtYv•¸NXA *¡³D¥4µžÀ4Ì)Wº!”3Ö!y­SDi«Bᨸ(<28>³é-«±Áª BS×D þqÓÕÆÓ ­I #j5A:ùcôÛìý«C¿üæÛrž¿÷[¿7ª—EPr FPŸ $œNήšÖ¯¦Õ—:°wQ6íæª7,ê ß<>Ž©kÕ¢7-ÀÕ²½ê#€õzéWÄdŽÆ4ùH5<48>>R[ßYœÕ¿N'Gù:ºVºEæ»aDÃfN†«©¥„ùž6:CH2a4ø°>ôåâk6G绹ƙá·ÅDz¥cëݵ‚=Áq{TE¼Hðþ€v4©Êù°Z,=ãÑÁ2_€uFÌpuµôï$¯êÆ¿áôxW¼û$xâ}äJNˆ¾O”™
êÑã’® @á \z‰×ä½®vç2i‡?çßVóºÀ}Ü”vïpW¸"‡«šú©îšã¬þP•8홌Ÿòý8<C3BD>ŽF³áÑìn÷1¤ÄÏÃz0¤ä`HËÛR; 9û,Åö-vJð/CpkG<>ù_ðèðÈày´´;Ü(u7ñwàæQËÏ<C38B>Œ}ýý<C3BD>½ýt8™ÞCmW¶ÈÑ?9æG<C3A6>c9ñmäà]Ò!GãUõ9{Bî°cù3Àó°ó<Uäk Ùû<72>¡§<Jâaû1;÷ÿ÷…
­VÛnÛF}ÏWì[$÷½0ŒêRÅJãØð%vËð<C38B>6
[‰Dʵÿ¾g²áØ®á DíevæÌÌžÊ1΄dBY&ðÕ†IΤL8¦¸f"aJI&S:aR1e-ïÓLJˆ˜–† f”`Ò1KŠ%˜*l 3X
ʰ+Íb qΰr2f¤Å…f–ÆÁ€8@`Ô1ŒÆŽ½{<17>Þ¬}4(˪‰N¶— ­>å?ѰÚÌý&åIíGÓh„… Åj'ÑÙñ”žÎ*/Mõv½ZÏòËM¾ümA;ýYµêîíEÇ~Ö¤Öô5 -}NQ9×—V#(Õ7Îe{{¯Òh: óÚÏ <20>³W™TeCƒ@tØ&
…I3 \œ®à ÚmmªÙ‰oÒèh<‰Nýuq¾ð£v¶Ã”°¡ù)_ù:팫Yï¤É7M醙Îgú¢ë"—ÈÏ`>ºøó/f%³&黄•Ûå2ûN$˜ã¶<C3A3>[ƾnjbAðîUêî<öuµÝÌ|MT! áFŽ€ŒŸ<C592>/¢í<><C3AD> ,ëT„$dí­ÕDŸÖèímn<E28099>ã[èŠè<C5A0>b^·¾eÑ<65>Ÿù°ºתÝŸ\,Ä.£<>ÏjÓù˜Ÿú öoÑ|cß`r³ñ_»”Òùvæ7<C3A6>ëùU±ž]]³/É¥æ’ë/Ýn«]Tå8o|gü6ˆœB)+ä._sþºÛ®}9˜Ñá]Þ&E“Ϫ¹<C2AA>Îj¸mE‰@ÂåP­Ð±ÛmFB´£¼É—Õ*TjœÎDJë2)SàfÒ¦Z,æAËÔÆÑcP:QÌ¢i-<13>ižZ§í„Û°m­cÆØLÛ 2qNF2§$°2Õ6ÎlÜ”·ÊOQm™ r¦:…éÌ%©o´¢ŠlÑ4¨áÀiìeB¸`
œ&Pä:ɰiPàˆŒr¢TV%©ƒ”bB˜Œ<µ<fÕDà!Fì1-LËÔ<C38B>¥á˜iÕÂÕ<> ™&(VXÂ×àç½Q&&œ¤8É6%¥B£Óˆ²ÍÄmÀ
JðP <09>%*¥©Õ@B¥aN±Ò !<21>±Ák<C381>“L»0XGÉEœMïY<C3AF><59>V%:˜º-êw]m4Óš2¢V¤ŸÆ“³Ïïßìûå•oŠYþÉo}oX-çAU;ÛkTõÙP„ÓñÉMÝøÕ´üZ…ê]u³¹é æÕ¥ïF‡Ô5rÑ™ÎQ«EsÓ…ëõÒ¯¨9Óøœr<1A>S[ßY<­ÞOÇù:ºUºWÌß» êJ¬¦æ=)lt—>3a4êa½ïÅ·m(Ž.vs<76>3ƒ«Åy1GIÇÖ»Cj=Áq=Ê"^$xP;š¢¨ŠÙ \,=ãÑd™/PuF
Íu³ôpï(/«Ú¿ãôxW¼ý$xâ=ÄJ T¾Ï¤™êÑã’¶ @aR,½ÄkòAWûî2i‡¿ä/gÕ÷q—ÚÞþ.qóPõSÝ6ÇÓê¬,pÚ3?‡ý4gÃÑùrH‰_Ç!ô4pHÉŸà<C5B8>÷9¤vröEŠí=
%Zì”à_†àÖ>Í ó¿äÑwä<C3A4>Èódjw¼Qê!oâàÍ“_Bûˆ2úÇ)3:øp4ùð€µmÚ1Gÿr星aŽýæÄ÷™ƒwIË<1C>WÕcæô„ÜqÇò<17>çqçy.É·²9ä~€Cϼ„Jâqû1;øÿI†…
endstream
endobj
39 0 obj
<</Type/XRef/ID[<765b7fb7bb798aaaa9806ab72fde8369><765b7fb7bb798aaaa9806ab72fde8369>]/Root
<</Type/XRef/ID[<3a1b4c7b60f7c9ae08f52c7c6822c489><3a1b4c7b60f7c9ae08f52c7c6822c489>]/Root
1 0 R/Info 2 0 R/Size 40/W[1 3 2]/Filter/FlateDecode/Length 139>>
stream
xÚ-Î1QÆñov±óv¨ÜÃ1D£Ò*4.å*!¯àÔ¢_;_¦ùeòOf2жPbLGtH#­hC§¨ÌÝ`ÁaëóÎE¯'/íÑ>Í逖´½½ºz?š<>ŸïÖt"šÎÖÓÓûŒªèûbý“{_Ð !6ömÜë ð~
xÚ-Î1QÆñov±óv¨ÜÃ1D£Ò*4.å*!¯àÔõÚù2Í/“2“€¶Í€c:¢CiE<>°J<C2B0>@eî¾»[Ÿ—t.z=yÉh<C389>öiN´¤…èíÕÝÔûÑ|ü|·¦Ñt¶žžÞgTEßëŸÜû‚ ±±oãÞ\o€?~ç
endstream
endobj
startxref

View File

@@ -26,7 +26,7 @@
Rittmeisterkoppel 14-C, 22359 Hamburg
\end{minipage}%
\begin{minipage}{0.23\textwidth}
\includegraphics[width=\linewidth]{me_m_8x8_4x.jpg}
\includegraphics[width=\linewidth]{../me_m_8x8_4x.jpg}
\end{minipage}
\end{center}

7
awesome-cv/.gitignore vendored Normal file
View File

@@ -0,0 +1,7 @@
# Ignore all auto-generated files, except for PDF
*.*
!.gitignore
!awesome-cv.cls
!*.tex
!*.pdf

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,86 @@
\documentclass[11pt, a4paper]{awesome-cv}
% Configure page margins
\geometry{left=1.4cm, top=1.4cm, right=1.4cm, bottom=1.4cm, footskip=.5cm}
% Specify the location of the included fonts
\fontdir[fonts/]
% Color for highlights
\colorlet{awesome}{awesome-skyblue}
% Personal Information
\name{Pedro Miguel Pessoa}{Cabral}
\mobile{+49-(0)-17657-909188}
\email{pmpcabral@gmail.com}
\address{Rittmeisterkoppel 14-C, 22359 Hamburg, Germany}
% \github{}
% \linkedin{}
\photo{../me_m_8x8_4x.jpg}
\begin{document}
% Make the header
\makecvheader
% Profile
\cvsection{Profile}
\begin{cvparagraph}
Date of Birth: January 17th, 1988 | Place of Birth: Setúbal, Portugal | Nationality: Portuguese
Languages: Portuguese (First language), German (Fluent), English (Fluent), Spanish (Good), French (Basic)
\end{cvparagraph}
% Experience
\cvsection{Experience}
\cventry
{Feb 2017 -- Present}
{Software Developer}
{HR4YOU AG}
{Großefehn, Germany}
{
\begin{cvitems}
\item {PHP, JavaScript, SQL}
\end{cvitems}
}
\cventry
{Sep 2014 -- Apr 2016}
{Support \& Operations}
{SAFIRA/KPMG}
{Carnaxide, Portugal}
{
\begin{cvitems}
\item {IBM Business Process Management, Forefront Identity Manager (FIM)}
\end{cvitems}
}
\cventry
{Apr 2013 -- Sep 2014}
{Software Developer}
{SAFIRA}
{Carnaxide, Portugal}
{
\begin{cvitems}
\item {IBM Business Process Management, IBM WebSphere Message Broker, SQL}
\end{cvitems}
}
% Education
\cvsection{Education}
\cventry
{2013}
{Bachelor of Science}
{Faculdade de Ciências e Tecnologia, Universidade Nova de Lisboa}
{Caparica, Portugal}
{}
% Skills
\cvsection{Skills}
\begin{cvskills}
\cvskill{Programming}{PHP, OOP, JavaScript, jQuery, CSS, SQL, SOAP, REST, PL/SQL, XML}
\end{cvskills}
\end{document}

823
awesome-cv/awesome-cv.cls Normal file
View File

@@ -0,0 +1,823 @@
%% Start of file `awesome-cv.cls'.
% Awesome CV Class File
%
% This class has been downloaded from:
% https://github.com/posquit0/Awesome-CV
%
% Author:
% Claud D. Park <posquit0.bj@gmail.com>
% http://www.posquit0.com
%
% Notes:
% 1) This class file defines the structure and layout of the template file (cv.tex, resume.tex).
% 2) It has been written in such a way that under most circumstances you
% should not need to edit it.
%
% Class license:
% LPPL v1.3c (http://www.latex-project.org/lppl)
%
%-------------------------------------------------------------------------------
% Identification
%-------------------------------------------------------------------------------
\ProvidesClass{awesome-cv}[2017/02/05 v1.6.1 Awesome Curriculum Vitae Class]
\NeedsTeXFormat{LaTeX2e}
%-------------------------------------------------------------------------------
% Class options
%
% (need to be done before the external package loading, for example because
% we need \paperwidth, \paperheight and \@ptsize to be defined before loading
% geometry and fancyhdr)
%-------------------------------------------------------------------------------
% Options for draft or final
\DeclareOption{draft}{\setlength\overfullrule{5pt}}
\DeclareOption{final}{\setlength\overfullrule{0pt}}
% Inherit options of article
\DeclareOption*{%
\PassOptionsToClass{\CurrentOption}{article}
}
\ProcessOptions\relax
\LoadClass{article}
%-------------------------------------------------------------------------------
% 3rd party packages
%-------------------------------------------------------------------------------
% Needed to make fixed length table
\RequirePackage{array}
% Needed to handle list environment
\RequirePackage{enumitem}
% Needed to handle text alignment
\RequirePackage{ragged2e}
% Needed to configure page layout
\RequirePackage{geometry}
% Needed to make header & footer efficiently
\RequirePackage{fancyhdr}
% Needed to manage colors
\RequirePackage{xcolor}
% Needed to use \ifxetex-\else-\fi statement
\RequirePackage{ifxetex}
% Needed to use \if-\then-\else statement
\RequirePackage{xifthen}
% Needed to strip chars from telephone number
\RequirePackage{xstring}
% Needed to use a toolbox of programming tools
\RequirePackage{etoolbox}
% Needed to change line spacing in specific environment
\RequirePackage{setspace}
% Needed to manage fonts
\RequirePackage[quiet]{fontspec}
% To support LaTeX quoting style
\defaultfontfeatures{Ligatures=TeX}
% Needed to manage math fonts
\RequirePackage{unicode-math}
% Needed to use icons from font-awesome
\RequirePackage{fontawesome6}
\RequirePackage{roboto}
\RequirePackage[default,opentype]{sourcesanspro}
% Needed for the photo ID
\RequirePackage[skins]{tcolorbox}
% Needed to deal a paragraphs
\RequirePackage{parskip}
% Needed to deal hyperlink
\RequirePackage[hidelinks,unicode,pdfpagelabels=false]{hyperref}
\hypersetup{%
pdftitle={},
pdfauthor={},
pdfsubject={},
pdfkeywords={}
}
% Solves issues Warning: File `cv.out' has changed
\RequirePackage{bookmark}
%-------------------------------------------------------------------------------
% Configuration for directory locations
%-------------------------------------------------------------------------------
% Configure an optional directory location for fonts(default: 'fonts/')
% Not required anymore but left in place for backward compatability.
\newcommand*{\fontdir}[1][fonts/]{\def\@fontdir{#1}}
%-------------------------------------------------------------------------------
% Configuration for layout
%-------------------------------------------------------------------------------
%% Page Layout
% Configure page margins with geometry
\geometry{left=2.0cm, top=1.5cm, right=2.0cm, bottom=2.0cm, footskip=.5cm}
%% Header & Footer
% Set offset to each header and footer
\fancyhfoffset{0em}
% Remove head rule
\renewcommand{\headrulewidth}{0pt}
% Clear all header & footer fields
\fancyhf{}
% Enable if you want to make header or footer using fancyhdr
\pagestyle{fancy}
%-------------------------------------------------------------------------------
% Configuration for colors
%-------------------------------------------------------------------------------
% Gray-scale colors
\definecolor{white}{HTML}{FFFFFF}
\definecolor{black}{HTML}{000000}
\definecolor{darkgray}{HTML}{333333}
\definecolor{gray}{HTML}{5D5D5D}
\definecolor{lightgray}{HTML}{999999}
% Basic colors
\definecolor{green}{HTML}{C2E15F}
\definecolor{orange}{HTML}{FDA333}
\definecolor{purple}{HTML}{D3A4F9}
\definecolor{red}{HTML}{FB4485}
\definecolor{blue}{HTML}{6CE0F1}
% Text colors
\definecolor{darktext}{HTML}{414141}
\colorlet{text}{darkgray}
\colorlet{graytext}{gray}
\colorlet{lighttext}{lightgray}
\colorlet{sectiondivider}{gray}
% Awesome colors
\definecolor{awesome-emerald}{HTML}{00A388}
\definecolor{awesome-skyblue}{HTML}{0395DE}
\definecolor{awesome-red}{HTML}{DC3522}
\definecolor{awesome-pink}{HTML}{EF4089}
\definecolor{awesome-orange}{HTML}{FF6138}
\definecolor{awesome-nephritis}{HTML}{27AE60}
\definecolor{awesome-concrete}{HTML}{95A5A6}
\definecolor{awesome-darknight}{HTML}{131A28}
\colorlet{awesome}{awesome-red}
% Boolean value to switch section color highlighting
\newbool{acvSectionColorHighlight}
\setbool{acvSectionColorHighlight}{true}
% Awesome section color
\def\@sectioncolor#1#2#3{%
\ifbool{acvSectionColorHighlight}{{\color{awesome}#1#2#3}}{#1#2#3}%
}
%-------------------------------------------------------------------------------
% Configuration for fonts
%-------------------------------------------------------------------------------
\newcommand*{\headerfont}{\roboto}
\newcommand*{\headerfontlight}{\robotolight}
\newcommand*{\footerfont}{\sourcesanspro}
\newcommand*{\bodyfont}{\sourcesanspro}
\newcommand*{\bodyfontlight}{\sourcesansprolight}
%-------------------------------------------------------------------------------
% Configuration for styles
%-------------------------------------------------------------------------------
% Configure styles for each CV elements
% For fundamental structures
\newcommand*{\headerfirstnamestyle}[1]{{\fontsize{32pt}{1em}\headerfontlight\color{graytext} #1}}
\newcommand*{\headerlastnamestyle}[1]{{\fontsize{32pt}{1em}\headerfont\bfseries\color{text} #1}}
\newcommand*{\headerpositionstyle}[1]{{\fontsize{7.6pt}{1em}\bodyfont\scshape\color{awesome} #1}}
\newcommand*{\headeraddressstyle}[1]{{\fontsize{8pt}{1em}\headerfont\itshape\color{lighttext} #1}}
\newcommand*{\headersocialstyle}[1]{{\fontsize{6.8pt}{1em}\headerfont\color{text} #1}}
\newcommand*{\headerquotestyle}[1]{{\fontsize{9pt}{1em}\bodyfont\itshape\color{darktext} #1}}
\newcommand*{\footerstyle}[1]{{\fontsize{8pt}{1em}\footerfont\scshape\color{lighttext} #1}}
\newcommand*{\sectionstyle}[1]{{\fontsize{16pt}{1em}\bodyfont\bfseries\color{text}\@sectioncolor #1}}
\newcommand*{\subsectionstyle}[1]{{\fontsize{12pt}{1em}\bodyfont\scshape\textcolor{text}{#1}}}
\newcommand*{\paragraphstyle}{\fontsize{9pt}{1em}\bodyfontlight\upshape\color{text}}
% For elements of entry
\newcommand*{\entrytitlestyle}[1]{{\fontsize{10pt}{1em}\bodyfont\bfseries\color{darktext} #1}}
\newcommand*{\entrypositionstyle}[1]{{\fontsize{8pt}{1em}\bodyfont\scshape\color{graytext} #1}}
\newcommand*{\entrydatestyle}[1]{{\fontsize{8pt}{1em}\bodyfontlight\slshape\color{graytext} #1}}
\newcommand*{\entrylocationstyle}[1]{{\fontsize{9pt}{1em}\bodyfontlight\slshape\color{awesome} #1}}
\newcommand*{\descriptionstyle}[1]{{\fontsize{9pt}{1em}\bodyfontlight\upshape\color{text} #1}}
% For elements of subentry
\newcommand*{\subentrytitlestyle}[1]{{\fontsize{8pt}{1em}\bodyfont\mdseries\color{graytext} #1}}
\newcommand*{\subentrypositionstyle}[1]{{\fontsize{7pt}{1em}\bodyfont\scshape\color{graytext} #1}}
\newcommand*{\subentrydatestyle}[1]{{\fontsize{7pt}{1em}\bodyfontlight\slshape\color{graytext} #1}}
\newcommand*{\subentrylocationstyle}[1]{{\fontsize{7pt}{1em}\bodyfontlight\slshape\color{awesome} #1}}
\newcommand*{\subdescriptionstyle}[1]{{\fontsize{8pt}{1em}\bodyfontlight\upshape\color{text} #1}}
% For elements of honor
\newcommand*{\honortitlestyle}[1]{{\fontsize{9pt}{1em}\bodyfont\color{graytext} #1}}
\newcommand*{\honorpositionstyle}[1]{{\fontsize{9pt}{1em}\bodyfont\bfseries\color{darktext} #1}}
\newcommand*{\honordatestyle}[1]{{\fontsize{9pt}{1em}\bodyfont\color{graytext} #1}}
\newcommand*{\honorlocationstyle}[1]{{\fontsize{9pt}{1em}\bodyfontlight\slshape\color{awesome} #1}}
% For elements of skill
\newcommand*{\skilltypestyle}[1]{{\fontsize{10pt}{1em}\bodyfont\bfseries\color{darktext} #1}}
\newcommand*{\skillsetstyle}[1]{{\fontsize{9pt}{1em}\bodyfontlight\color{text} #1}}
% For elements of the cover letter
\newcommand*{\lettersectionstyle}[1]{{\fontsize{14pt}{1em}\bodyfont\bfseries\color{text}\@sectioncolor #1}}
\newcommand*{\recipientaddressstyle}[1]{{\fontsize{9pt}{1em}\bodyfont\scshape\color{graytext} #1}}
\newcommand*{\recipienttitlestyle}[1]{{\fontsize{11pt}{1em}\bodyfont\bfseries\color{darktext} #1}}
\newcommand*{\lettertitlestyle}[1]{{\fontsize{10pt}{1em}\bodyfontlight\bfseries\color{darktext} \underline{#1}}}
\newcommand*{\letterdatestyle}[1]{{\fontsize{9pt}{1em}\bodyfontlight\slshape\color{graytext} #1}}
\newcommand*{\lettertextstyle}{\fontsize{10pt}{1.4em}\bodyfontlight\upshape\color{graytext}}
\newcommand*{\letternamestyle}[1]{{\fontsize{10pt}{1em}\bodyfont\bfseries\color{darktext} #1}}
\newcommand*{\letterenclosurestyle}[1]{{\fontsize{10pt}{1em}\bodyfontlight\slshape\color{lighttext} #1}}
%-------------------------------------------------------------------------------
% Commands for personal information
%-------------------------------------------------------------------------------
% Define photo ID
% Usage: \photo[circle|rectangle,edge|noedge,left|right]{<path-to-image>}
\newcommand{\photo}[2][circle,edge,left]{%
\def\@photo{#2}
\@for\tmp:=#1\do{%
\ifthenelse{\equal{\tmp}{circle} \or \equal{\tmp}{rectangle}}%
{\let\@photoshape\tmp}{}%
\ifthenelse{\equal{\tmp}{edge} \or \equal{\tmp}{noedge}}%
{\let\@photoedge\tmp}{}%
\ifthenelse{\equal{\tmp}{left} \or \equal{\tmp}{right}}%
{\let\@photoalign\tmp}{}%
}%
}
\def\@photoshape{circle}
\def\@photoedge{edge}
\def\@photoalign{left}
% Define writer's name
% Usage: \name{<firstname>}{<lastname>}
% Usage: \firstname{<firstname>}
% Usage: \lastname{<lastname>}
% Usage: \familyname{<familyname>}
\newcommand*{\name}[2]{\def\@firstname{#1}\def\@lastname{#2}}
\newcommand*{\firstname}[1]{\def\@firstname{#1}}
\newcommand*{\lastname}[1]{\def\@lastname{#1}}
\newcommand*{\familyname}[1]{\def\@lastname{#1}}
\def\@familyname{\@lastname}
% Define writer's address
% Usage: \address{<address>}
\newcommand*{\address}[1]{\def\@address{#1}}
% Define writer's position
% Usage: \position{<position>}
\newcommand*{\position}[1]{\def\@position{#1}}
% Defines writer's mobile (optional)
% Usage: \mobile{<mobile number>}
\newcommand*{\mobile}[1]
{
\def\@mobile{#1}
\def\@teluri{tel:\@mobile}
% Strip unwanted characters
\StrDel{\@teluri}{ }[\@teluri]%
\StrDel{\@teluri}{-}[\@teluri]%
\StrDel{\@teluri}{(}[\@teluri]%
\StrDel{\@teluri}{)}[\@teluri]%
}
% Defines writer's email (optional)
% Usage: \email{<email address>}
\newcommand*{\email}[1]{\def\@email{#1}}
% Defines writer's date of birth (optional)
% Usage: \dateofbirth{<date>}
\newcommand*{\dateofbirth}[1]{\def\@dateofbirth{#1}}
% Defines writer's homepage (optional)
% Usage: \homepage{<url>}
\newcommand*{\homepage}[1]{\def\@homepage{#1}}
% Defines writer's github (optional)
% Usage: \github{<github-nick>}
\newcommand*{\github}[1]{\def\@github{#1}}
% Defines writer's gitlab (optional)
% Usage: \gitlab{<gitlab-nick>}
\newcommand*{\gitlab}[1]{\def\@gitlab{#1}}
% Defines writer's bitbucket (optional)
% Usage: \bitbucket{<bitbucket-nick>}
\newcommand*{\bitbucket}[1]{\def\@bitbucket{#1}}
% Defines writer's stackoverflow profile (optional)
% Usage: \stackoverflow{<so userid>}{<so username>}
% e.g.https://stackoverflow.com/users/123456/sam-smith
% would be \stackoverflow{123456}{sam-smith}
\newcommand*{\stackoverflow}[2]{\def\@stackoverflowid{#1}\def\@stackoverflowname{#2}}
% Defines writer's linked-in (optional)
% Usage: \linkedin{<linked-in-nick>}
\newcommand*{\linkedin}[1]{\def\@linkedin{#1}}
% Defines writer's orcid (optional)
% Usage: \orcid{<orcid-num>}
\newcommand*{\orcid}[1]{\def\@orcid{#1}}
% Defines writer's twitter (optional)
% Usage: \twitter{<twitter handle>}
\newcommand*{\twitter}[1]{\def\@twitter{#1}}
% Defines writer's x (formerly twitter) (optional)
% Usage: \x{<x account>}
\newcommand*{\x}[1]{\def\@x{#1}}
% Defines writer's Mastodon (optional)
% Usage: \mastodon{<instance>}{<mastodon-nick>}
\newcommand*{\mastodon}[2]{\def\@mastodoninstance{#1}\def\@mastodonname{#2}}
% Defines writer's resarchgate (optional)
% Usage: \researchgate{<researchgate-account>}
\newcommand*{\researchgate}[1]{\def\@researchgate{#1}}
% Defines writer's skype (optional)
% Usage: \skype{<skype account>}
\newcommand*{\skype}[1]{\def\@skype{#1}}
% Defines writer's reddit (optional)
% Usage: \reddit{<reddit account>}
\newcommand*{\reddit}[1]{\def\@reddit{#1}}
% Defines writer's xing (optional)
% Usage: \xing{<xing name>}
\newcommand*{\xing}[1]{\def\@xing{#1}}
% Defines writer's medium profile (optional)
% Usage: \medium{<medium account>}
\newcommand*{\medium}[1]{\def\@medium{#1}}
% Defines writer's kaggle (optional)
% Usage: \kaggle{<kaggle handle>}
\newcommand*{\kaggle}[1]{\def\@kaggle{#1}}
% Defines writer's Hackerrank (optional)
% Usage: \hackerrank{<Hackerrank profile name>}
\newcommand*{\hackerrank}[1]{\def\@hackerrank{#1}}
% Defines writer's Telegram (optional)
% Usage: \telegram{<Telegram username>}
\newcommand*{\telegram}[1]{\def\@telegram{#1}}
% Defines writer's google scholar profile (optional)
% Usage: \googlescholar{<googlescholar userid>}{<googlescholar username>}
% e.g.https://scholar.google.co.uk/citations?user=wpZDx1cAAAAJ
% would be \googlescholar{wpZDx1cAAAAJ}{Name-to-display-next-icon}
% If 'googlescholar-name' is not provided than it defaults to
% '\firstname \lastname'
\newcommand*{\googlescholar}[2]{%
\def\@googlescholarid{#1}%
\ifthenelse{\equal{#2}{}}{%
\def\@googlescholarname{\@firstname~\@lastname}%
}{%
\def\@googlescholarname{#2}%
}%
}
% Defines writer's extra information (optional)
% Usage: \extrainfo{<extra information>}
\newcommand*{\extrainfo}[1]{\def\@extrainfo{#1}}
% Defines writer's quote (optional)
% Usage: \quote{<quote>}
\renewcommand*{\quote}[1]{\def\@quote{#1}}
% Defines recipient's information (cover letter only)
% Usage: \recipient{<recipient name>}{<recipient address>}
% Usage: \recipientname{<recipient name>}
% Usage: \recipientaddress{<recipient address>}
\newcommand*{\recipient}[2]{\def\@recipientname{#1}\def\@recipientaddress{#2}}
\newcommand*{\recipientname}[1]{\def\@recipientname{#1}}
\newcommand*{\recipientaddress}[1]{\def\@recipientaddress{#1}}
% Defines the title for letter (cover letter only, optional)
% Usage: \lettertitle{<title>}
\newcommand*{\lettertitle}[1]{\def\@lettertitle{#1}}
% Defines the date for letter (cover letter only)
% Usage: \letterdate{<date>}
\newcommand*{\letterdate}[1]{\def\@letterdate{#1}}
% Defines a message of opening for letter (cover letter only)
% Usage: \letteropening{<message>}
\newcommand*{\letteropening}[1]{\def\@letteropening{#1}}
% Defines a message of closing for letter (cover letter only)
% Usage: \letterclosing{<message>}
\newcommand*{\letterclosing}[1]{\def\@letterclosing{#1}}
% Defines an enclosure for letter (cover letter only, optional)
% Usage: \letterenclosure[<enclosure name>]{<enclosure>}
\newcommand*{\letterenclname}[1][Enclosure]{\def\@letterenclname{#1}}
\newcommand*{\letterenclosure}[2][]{%
% if an optional argument is provided, use it to redefine \enclname
\ifthenelse{\equal{#1}{}}{}{\def\@letterenclname{#1}}
\def\@letterenclosure{#2}
}
%-------------------------------------------------------------------------------
% Commands for extra
%-------------------------------------------------------------------------------
%% Define helper macros a user can change easily
% Header
\newcommand{\acvHeaderNameDelim}{\space}
\newcommand{\acvHeaderAfterNameSkip}{.4mm}
\newcommand{\acvHeaderAfterPositionSkip}{.4mm}
\newcommand{\acvHeaderAfterAddressSkip}{-.5mm}
\newcommand{\acvHeaderIconSep}{\space}
\newcommand{\acvHeaderSocialSep}{\quad\textbar\quad}
\newcommand{\acvHeaderAfterSocialSkip}{6mm}
\newcommand{\acvHeaderAfterQuoteSkip}{5mm}
% Others
\newcommand{\acvSectionTopSkip}{3mm}
\newcommand{\acvSectionContentTopSkip}{2.5mm}
%-------------------------------------------------------------------------------
% Commands for utilities
%-------------------------------------------------------------------------------
% Use to align an element of tabular table
\newcolumntype{L}[1]{>{\raggedright\let\newline\\\arraybackslash\hspace{0pt}}m{#1}}
\newcolumntype{C}[1]{>{\centering\let\newline\\\arraybackslash\hspace{0pt}}m{#1}}
\newcolumntype{R}[1]{>{\raggedleft\let\newline\\\arraybackslash\hspace{0pt}}m{#1}}
% Use to draw horizontal line with specific thickness
\def\vhrulefill#1{\leavevmode\leaders\hrule\@height#1\hfill \kern\z@}
% Use to execute conditional statements by checking empty string
\newcommand*{\ifempty}[3]{\ifthenelse{\isempty{#1}}{#2}{#3}}
%-------------------------------------------------------------------------------
% Commands for elements of CV structure
%-------------------------------------------------------------------------------
% Define a header for CV
% Usage: \makecvheader
\newcommand*{\makecvheader}[1][C]{%
\newcommand*{\drawphoto}{%
\ifthenelse{\isundefined{\@photo}}{}{%
\newlength{\photodim}
\ifthenelse{\equal{\@photoshape}{circle}}%
{\setlength{\photodim}{1.3cm}}%
{\setlength{\photodim}{1.8cm}}%
\ifthenelse{\equal{\@photoedge}{edge}}%
{\def\@photoborder{darkgray}}%
{\def\@photoborder{none}}%
\begin{tikzpicture}%
\node[\@photoshape, draw=\@photoborder, line width=0.3mm, inner sep=\photodim, fill overzoom image=\@photo] () {};
\end{tikzpicture}
}%
}
\newlength{\headertextwidth}
\newlength{\headerphotowidth}
\ifthenelse{\isundefined{\@photo}}{
\setlength{\headertextwidth}{\textwidth}
\setlength{\headerphotowidth}{0cm}
}{%
\setlength{\headertextwidth}{0.76\textwidth}
\setlength{\headerphotowidth}{0.24\textwidth}
}%
\begin{minipage}[c]{\headerphotowidth}%
\ifthenelse{\equal{\@photoalign}{left}}{\raggedright\drawphoto}{}
\end{minipage}
\begin{minipage}[c]{\headertextwidth}
\ifthenelse{\equal{#1}{L}}{\raggedright}{\ifthenelse{\equal{#1}{R}}{\raggedleft}{\centering}}
\headerfirstnamestyle{\@firstname}\headerlastnamestyle{{}\acvHeaderNameDelim\@lastname}%
\\[\acvHeaderAfterNameSkip]%
\ifthenelse{\isundefined{\@position}}{}{\headerpositionstyle{\@position\\[\acvHeaderAfterPositionSkip]}}%
\ifthenelse{\isundefined{\@address}}{}{\headeraddressstyle{\@address\\[\acvHeaderAfterAddressSkip]}}%
\headersocialstyle{%
\newbool{isstart}%
\setbool{isstart}{true}%
\ifthenelse{\isundefined{\@mobile}}%
{}%
{%
\href{\@teluri}{\faMobile\acvHeaderIconSep\@mobile}%
\setbool{isstart}{false}%
}%
\ifthenelse{\isundefined{\@email}}%
{}%
{%
\ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
\href{mailto:\@email}{\faEnvelope\acvHeaderIconSep\@email}%
}%
\ifthenelse{\isundefined{\@dateofbirth}}%
{}%
{%
\ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
% \mbox prevents wrapping of elements%
\mbox{\faCakeCandles\acvHeaderIconSep\@dateofbirth}%
}%
\ifthenelse{\isundefined{\@homepage}}%
{}%
{%
\ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
\href{http://\@homepage}{\faHouseChimney\acvHeaderIconSep\@homepage}%
}%
\ifthenelse{\isundefined{\@github}}%
{}%
{%
\ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
\href{https://github.com/\@github}{\faSquareGithub\acvHeaderIconSep\@github}%
}%
\ifthenelse{\isundefined{\@gitlab}}%
{}%
{%
\ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
\href{https://gitlab.com/\@gitlab}{\faGitlab\acvHeaderIconSep\@gitlab}%
}%
\ifthenelse{\isundefined{\@bitbucket}}%
{}%
{%
\ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
\href{https://bitbucket.com/\@bitbucket}{\faBitbucket\acvHeaderIconSep\@bitbucket}%
}%
\ifthenelse{\isundefined{\@stackoverflowid}}%
{}%
{%
\ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
\href{https://stackoverflow.com/users/\@stackoverflowid}{\faStackOverflow\acvHeaderIconSep\@stackoverflowname}%
}%
\ifthenelse{\isundefined{\@linkedin}}%
{}%
{%
\ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
\href{https://www.linkedin.com/in/\@linkedin}{\faLinkedin\acvHeaderIconSep\@linkedin}%
}%
\ifthenelse{\isundefined{\@orcid}}%
{}%
{%
\ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
\href{https://orcid.org/\@orcid}{\faOrcid\acvHeaderIconSep\@orcid}%
}%
\ifthenelse{\isundefined{\@twitter}}%
{}%
{%
\ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
\href{https://twitter.com/\@twitter}{\faTwitter\acvHeaderIconSep\@twitter}%
}%
\ifthenelse{\isundefined{\@x}}%
{}%
{%
\ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
\href{https://x.com/\@x}{\faXTwitter\acvHeaderIconSep\@x}%
}%
\ifthenelse{\isundefined{\@mastodonname}}%
{}%
{%
\ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
\href{https://\@mastodoninstance/@\@mastodonname}{\faMastodon\acvHeaderIconSep\@mastodonname}%
}%
\ifthenelse{\isundefined{\@skype}}%
{}%
{%
\ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
\faSkype\acvHeaderIconSep\@skype%
}%
\ifthenelse{\isundefined{\@reddit}}%
{}%
{%
\ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
\href{https://www.reddit.com/user/\@reddit}{\faReddit\acvHeaderIconSep\@reddit}%
}%
\ifthenelse{\isundefined{\@researchgate}}%
{}%
{%
\ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
\href{https://www.researchgate.net/profile/\@researchgate}{\faResearchgate\acvHeaderIconSep\@researchgate}%
}%
\ifthenelse{\isundefined{\@xing}}%
{}%
{%
\ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
\href{https://www.xing.com/profile/\@xing}{\faSquareXing\acvHeaderIconSep\@xing}
}%
\ifthenelse{\isundefined{\@medium}}%
{}%
{%
\ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
\href{https://medium.com/@\@medium}{\faMedium\acvHeaderIconSep\@medium}%
}%
\ifthenelse{\isundefined{\@kaggle}}%
{}%
{%
\ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
\href{https://kaggle.com/\@kaggle}{\faKaggle\acvHeaderIconSep\@kaggle}%
}%
\ifthenelse{\isundefined{\@hackerrank}}%
{}%
{%
\ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
\href{https://www.hackerrank.com/\@hackerrank}{\faHackerrank\acvHeaderIconSep\@hackerrank}%
}%
\ifthenelse{\isundefined{\@telegram}}%
{}%
{%
\ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
\href{https://t.me/\@telegram}{\faTelegram\acvHeaderIconSep\@telegram}%
}%
\ifthenelse{\isundefined{\@googlescholarid}}%
{}%
{%
\ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
\href{https://scholar.google.com/citations?user=\@googlescholarid}{\faGraduationCap\acvHeaderIconSep\@googlescholarname}%
}%
\ifthenelse{\isundefined{\@extrainfo}}%
{}%
{%
\ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
\@extrainfo%
}%
} \\[\acvHeaderAfterSocialSkip]%
\ifthenelse{\isundefined{\@quote}}%
{}%
{\headerquotestyle{\@quote\\}\vspace{\acvHeaderAfterQuoteSkip}}%
\end{minipage}%
\begin{minipage}[c]{\headerphotowidth}%
\ifthenelse{\equal{\@photoalign}{right}}{\raggedleft\drawphoto}{}
\end{minipage}
}
% Define a footer for CV
% Usage: \makecvfooter{<left>}{<center>}{<right>}
\newcommand*{\makecvfooter}[3]{%
\fancyfoot{}
\fancyfoot[L]{\footerstyle{#1}}
\fancyfoot[C]{\footerstyle{#2}}
\fancyfoot[R]{\footerstyle{#3}}
}
% Define a section for CV
% Usage: \cvsection{<section-title>}
\newcommand{\cvsection}[1]{%
\vspace{\acvSectionTopSkip}
\sectionstyle{#1}
\phantomsection
\color{sectiondivider}\vhrulefill{0.9pt}
}
% Define a subsection for CV
% Usage: \cvsubsection{<subsection-title>}
\newcommand{\cvsubsection}[1]{%
\vspace{\acvSectionContentTopSkip}
\vspace{-3mm}
\subsectionstyle{#1}
\phantomsection
}
% Define a paragraph for CV
\newenvironment{cvparagraph}{%
\vspace{\acvSectionContentTopSkip}
\vspace{-3mm}
\paragraphstyle
}{%
\par
\vspace{2mm}
}
% Define an environment for cventry
\newenvironment{cventries}{%
\vspace{\acvSectionContentTopSkip}
\begin{center}
}{%
\end{center}
}
% Define an entry of cv information
% Usage: \cventry{<position>}{<title>}{<location>}{<date>}{<description>}
\newcommand*{\cventry}[5]{%
\vspace{-2.0mm}
\setlength\tabcolsep{0pt}
\setlength{\extrarowheight}{0pt}
\begin{tabular*}{\textwidth}{@{\extracolsep{\fill}} L{\textwidth - 4.5cm} R{4.5cm}}
\ifempty{#2#3}
{\entrypositionstyle{#1} & \entrydatestyle{#4} \\}
{\entrytitlestyle{#2} & \entrylocationstyle{#3} \\
\entrypositionstyle{#1} & \entrydatestyle{#4} \\}
\ifstrempty{#5}
{}
{\multicolumn{2}{L{\textwidth}}{\descriptionstyle{#5}} \\}
\end{tabular*}%
}
% Define an environment for cvsubentry
\newenvironment{cvsubentries}{%
\begin{center}
}{%
\end{center}
}
% Define a subentry of cv information
% Usage: \cvsubentry{<position>}{<title>}{<date>}{<description>}
\newcommand*{\cvsubentry}[4]{%
\setlength\tabcolsep{0pt}
\setlength{\extrarowheight}{0pt}
\begin{tabular*}{\textwidth}{@{\extracolsep{\fill}} L{\textwidth - 4.5cm} R{4.5cm}}
\setlength\leftskip{0.2cm}
\subentrytitlestyle{#2} & \ifthenelse{\equal{#1}{}}
{\subentrydatestyle{#3}}{}
\ifthenelse{\equal{#1}{}}
{}
{\subentrypositionstyle{#1} & \subentrydatestyle{#3} \\}
\ifthenelse{\equal{#4}{}}
{}
{\multicolumn{2}{L{17.0cm}}{\subdescriptionstyle{#4}} \\}
\end{tabular*}
}
% Define an environment for cvhonor
\newenvironment{cvhonors}{%
\vspace{\acvSectionContentTopSkip}
\vspace{-2mm}
\begin{center}
\setlength\tabcolsep{0pt}
\setlength{\extrarowheight}{0pt}
\begin{tabular*}{\textwidth}{@{\extracolsep{\fill}} C{1.5cm} L{\textwidth - 4.0cm} R{2.5cm}}
}{%
\end{tabular*}
\end{center}
}
% Define a line of cv information(honor, award or something else)
% Usage: \cvhonor{<position>}{<title>}{<location>}{<date>}
\newcommand*{\cvhonor}[4]{%
\honordatestyle{#4} & \honorpositionstyle{#1}\ifempty{#2}{}{,} \honortitlestyle{#2} & \honorlocationstyle{#3} \\
}
% Define an environment for cvskill
\newenvironment{cvskills}{%
\vspace{\acvSectionContentTopSkip}
\vspace{-2.0mm}
\begin{center}
\setlength\tabcolsep{1ex}
\setlength{\extrarowheight}{0pt}
\begin{tabular*}{\textwidth}{@{\extracolsep{\fill}} r L{\textwidth * \real{0.9}}}
}{%
\end{tabular*}
\end{center}
}
% Define a line of cv information(skill)
% Usage: \cvskill{<type>}{<skillset>}
\newcommand*{\cvskill}[2]{%
\skilltypestyle{#1} & \skillsetstyle{#2} \\
}
% Define an environment for cvitems(for cventry)
\newenvironment{cvitems}{%
\vspace{-4.0mm}
\begin{justify}
\begin{itemize}[leftmargin=2ex, nosep, noitemsep]
\setlength{\parskip}{0pt}
\renewcommand{\labelitemi}{\bullet}
}{%
\end{itemize}
\end{justify}
\vspace{1.0mm}
}
%-------------------------------------------------------------------------------
% Commands for elements of Cover Letter
%-------------------------------------------------------------------------------
% Define an environment for cvletter
\newenvironment{cvletter}{%
\lettertextstyle
}{%
}
% Define a section for the cover letter
% Usage: \lettersection{<section-title>}
\newcommand{\lettersection}[1]{%
\par\addvspace{2.5ex}
\phantomsection{}
\lettersectionstyle{#1}
\color{sectiondivider}\vhrulefill{0.9pt}
\par\nobreak\addvspace{0.4ex}
\lettertextstyle
}
% Define a title of the cover letter
% Usage: \makelettertitle
\newcommand*{\makelettertitle}{%
\vspace{8.4mm}
\setlength\tabcolsep{0pt}
\setlength{\extrarowheight}{0pt}
\begin{tabular*}{\textwidth}{@{\extracolsep{\fill}} L{\textwidth - 4.5cm} R{4.5cm}}
\recipienttitlestyle{\@recipientname} & \letterdatestyle{\@letterdate}
\end{tabular*}
\begin{singlespace}
\recipientaddressstyle{\@recipientaddress} \\\\
\end{singlespace}
\ifthenelse{\isundefined{\@lettertitle}}
{}
{\lettertitlestyle{\@lettertitle} \\}
\lettertextstyle{\@letteropening}
}
% Define a closing of the cover letter
% Usage: \makeletterclosing
\newcommand*{\makeletterclosing}{%
\vspace{3.4mm}
\lettertextstyle{\@letterclosing} \\\\
\letternamestyle{\@firstname\ \@lastname}
\ifthenelse{\isundefined{\@letterenclosure}}
{\\}
{%
\\\\\\
\letterenclosurestyle{\@letterenclname: \@letterenclosure} \\
}
}

View File

@@ -19,9 +19,6 @@ FILE="$1"
# append .tex file extension, iff not already passed
[[ "$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
if [[ ! -f "$FILE" ]]; then
echo -e "${BOLD}${RED}Error${RESET}${RED}: File '$FILE' not found.${RESET}"
@@ -31,24 +28,8 @@ fi
# Detect active \usepackage{fontspec} (ignore commented lines)
if grep -Eq '^[^%]*\\usepackage\{fontspec\}' "$FILE"; then
echo -e "${BLUE}Detected fontspec → Using XeLaTeX${RESET}"
LATEX_CMD=(xelatex -synctex=1 -interaction=nonstopmode -file-line-error "$FILE")
xelatex -synctex=1 -interaction=nonstopmode -file-line-error "$FILE"
else
echo -e "${BLUE}No active fontspec → Using pdfLaTeX${RESET}"
LATEX_CMD=(pdflatex -synctex=1 -interaction=nonstopmode -file-line-error "$FILE")
pdflatex -synctex=1 -interaction=nonstopmode -file-line-error "$FILE"
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

@@ -1,96 +0,0 @@
#!/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}"

6
moderncv/.gitignore vendored Normal file
View File

@@ -0,0 +1,6 @@
# Ignore all auto-generated files, except for PDF
*.*
!.gitignore
!*.tex
!*.pdf

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,51 @@
\documentclass[11pt,a4paper,sans]{moderncv}
\moderncvstyle{classic} % Style options: 'casual', 'classic', 'oldstyle', 'banking'
\moderncvcolor{blue} % Color options: 'blue', 'orange', 'green', 'red', 'purple', 'grey', 'black'
\usepackage[scale=0.75]{geometry}
% Personal data
\name{Pedro Miguel}{Pessoa Cabral}
\title{Curriculum Vitae}
\address{Rittmeisterkoppel 14C}{22359 Hamburg}{Germany}
\phone[mobile]{+49-(0)-17657-909188}
\email{pmpcabral@gmail.com}
\homepage{https://git.sueo.de/pcabral}
\social[]{} % Optional: GitHub, LinkedIn, etc.
\photo{../me_m_8x8_4x.jpg}
\begin{document}
\makecvtitle
\section{Profile}
\cvitem{Date of Birth}{January 17\textsuperscript{th}, 1988}
\cvitem{Place of Birth}{Setúbal, Portugal}
\cvitem{Nationality}{Portuguese}
\section{Languages}
\cvitemwithcomment{Portuguese}{First Language}{}
\cvitemwithcomment{German}{Fluent}{}
\cvitemwithcomment{English}{Fluent}{}
\cvitemwithcomment{Spanish}{Good}{}
\cvitemwithcomment{French}{Basic}{}
\section{Experience}
\cventry{Feb 2017 -- Present}{Software Developer}{HR4YOU AG}{Großefehn, Germany}{}{
PHP, JavaScript, SQL.
}
\cventry{Sep 2014 -- Apr 2016}{Support \& Operations}{SAFIRA/KPMG}{Carnaxide, Portugal}{}{
IBM Business Process Management, Forefront Identity Manager (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 \& Tools}{PHP, OOP, JavaScript, jQuery, CSS, SQL, SOAP, REST, PL/SQL, XML}
\end{document}