8 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
8 changed files with 157 additions and 38 deletions

14
.gitignore vendored
View File

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

View File

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

View File

@@ -3431,26 +3431,22 @@ endobj
24 0 obj
<</Filter/FlateDecode/Length 352>>
stream
xÚ]Moƒ0 †ïüŠ;M>ºJ©Ð²qh7 º;ML‡TB`RÿýÀf=,D<>±ó¾Á¶Ó|Ÿ«f`ö‡éD«% ôÝh° \e¹œÉF á[´•¶ìôXéSÕ³<>eúu|}~ƒÛ <0C>¨N0Â:énr}.37djJ/ï_8ß÷~€6WuÇ¢ÈbÌþœNïsg«<67>ì.ð4ÇÞ<C387>Ó¨+[<5B>Ó#Ũõ ZPs¬8Æã\ò': ½®˜J]ÁŠœiÅ,ʦ[ ä¿ïîRv©Åwe0}?¥;ã™\<5C>(%
‰2¢Éó‘ø ’ï"ùR°E
ˆÂ…8QBD
!)lHá°CJýÙzâ¸h}ñþ9~Ü<>ïÈ©øÖz¤âm(HbÞ)¹ãäuq~ #t<>  *¤ò ÃmÃ[ddþ¹óX<¦BŒÆL-ÂÙÁæÏ}j<ÆKwz®ÂçW™±<E284A2>
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Œ—îô\…Ï/>­±‚
endstream
endobj
25 0 obj
<</Filter/FlateDecode/Length 316>>
<</Filter/FlateDecode/Length 315>>
stream
xÚ]Mkƒ@†ïþŠ9¦”¢kb>@„Dkë¡I© =oÖ1⺬ZÈ¿¯Î˜º°.Ïë;̸qdºêÀý´<C3BD>ʱƒ²Ò…Ŷé­B8ã¥ÒŽð¡¨T7}U-<2D>ãÆÒìe<C3AC>à¾vÛã÷ó;^±«”Üc<C39C>/§c*P`ÉÎãÍ øgI~k;¬3]6€û5$n;{ƒÙ¶hÎø4j[ ­ôf§8'%ï<>¹b<C2B9>ºω"J'¸Ø©ÐJ}A'ô†A˜'rPÿþ/9ê\ª<69>nÏó×ÑHÂcÚÍ_‰;v®}¢tË”%\sÊÜk=Zä ~v믈æ,.<.6gqÇbLâb}ïg|–‚Ä`ÃÄ<C383>¯ü©®9`ÜÚciª·v#­4Î²ÒøØ¾iÌ<E28099>Ð
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>Ñ
endstream
endobj
26 0 obj
<</Filter/FlateDecode/Length 324>>
stream
xÚ]Qkƒ0…ßýE“V»<56>­m©…ue¶°×4^»@<40>!ÆAÿýL®íÃ
ßõžãñ^üXJZM+J°¤ª2е½@.p•* ŒTRØü]4\aþÁõ<C381>7@Âï}¾?î^wpû+?@ÓÂò›ÓóiKRA<52>Ó]a#ëòÞYh
U·$MB¯Á¿³æN&˪½À‹«}š
ŒTW29祯”½Ö7h@YYæí(&m<05>æ WWÒh8I·ÃÉPÕ¿çt”]jñÃ<C3B1>k§ë¡=ŠfIæiƒ´ðÄÞ<Í)vαshqGHK¤™§ù»§„!åH±§8FÚ ¡Ë]VÉ@,¢3}ÌȉŸ_HQDW˜µ1¾3Æâ<C3A2>(rƒpK|îPôÆ ãôör3•
ž?ƒnµSùëFe¡˜
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þú%}¡‡
endstream
endobj
29 0 obj
@@ -3569,26 +3565,20 @@ endobj
9 0 obj
<</Type/ObjStm/N 24/First 168/Filter/FlateDecode/Length 1308>>
stream
­VÙnÛF}ÏWÌ[$gá, £ZêXi»eø@K­D
"åÚßs‡²á­†ƒD<35>»Î9—rŒ3!™P |µa3iŽ)®™H˜RIÁ”N˜TLYËðë4“Å"¦¥a%˜¢d ¦
ÛÂÄ 2ìÇJ³ž8gX93ÒâB38Æ!8qp<71>QɈa4vìÝ»hz½öÑ ,«&:Ý^4´úX”ÿDÃj3÷”S&Yt¨<>FŸO&ôtVy±lª·ëÕz_lòåo ÚéϪUwo/:ñ³&µ¦¯áÒrÑ甕s}i5R}ã\¶·÷*<2A>&£Ñ0¯ýÉÁåIö
Nö«²¡A ;ìEû
…IH3x8?ºøNpn²B€j·}¼©f§¾I£ãñ~4õW ÄùÂ<C3B9>ÚaØò ÍOùÊ×ig\Íz§M¾iº(7ÌtÖ8Ó]\…DqóÑùŸ1+™5Iß%¬Ü.—Ù=`ŽÛ>RlEð0öuS
Bt¯Rw䉯«ífæk
Y7r ÏøÙø²!HÐþÕÀ²NE(BÖÞZMði<C3B0>ÞÜ&éÖ8¾…®ˆþ(æu[úy««p­:Ñ}àÉÅ
1Úø¼©6<EFBFBD><EFBFBD>ùÔŸ³æ;û<E2809C>ÿ֥η3¿é\Í/‹õüÛêŠ}íH.5—\ív[í¢*Çyã;ã·n…朿áò5篻­££µ/3:¼«Û~Ñd!òÃjî£Ïµ?Ú6Ë¢D"árˆ+t,ävS<53>í(oòeµ ¢
§3¤ÒºLÊTYIjm²˜Y,S F<>˜i-<13>ižZ§í„Û°m­cÆØLÛ 2qNF2§$°2Õ6ÎlÜÐ[eާ`[朅©Na:sIª€­ˆ­7 h8`{™.˜¦„† <09>\'6 ŽÌ)‡N”
ɪ$u<>RNH“Q¤ÇÌ€Mä<äˆ=2¦Ei™: 43­Z¡ÊïF¦ È
!CÄâ¼3ÊÄ„“”'Ù¦Â<C2A6>*4:<3A>,ÛJÜ$¬ „•ÐY¢RšZ O`æ”+ÝÊë<>¼Ö)"É´ ƒU¡pT\ÈÙôŽÕ؉`UP¡ƒ©"Pÿ¸íj£É˜Ö$<24>µš =œŽ¾¾sà——¾)fù'¿õ½aµœe°v¶)Ö`õÙ@ÂÉøôºnüjR~«{EÝl®;ƒyuá»ÑuÍ¢\t&spµh®»`½^ú1™£1<C2A3>Ϩ¦Ñµõ<C2B5>Åiõ~2>Ì×Ñ<C397>Ò#Ô32”XM-%Ì{RØè!}aÂhða}à‹Å÷m(ŽÎws<77>3ƒËÅY1¥cëÝ!µ‚žà¸ƒU/¼? M@ªb6(KÏx´¿Ì`<60> 3\]/=Â;Î˪öï8}$Ço? žx¹’¢ï3e¦¸¤íPØ/^â5ù «Ý»LÚá/¹ÅßËY5Ç}ܶw°+Ü<‡«Šú©nã´ú\8홌Ÿóý4<C3BD>Þ Ó³û!<Ä<>¿CèiÀ<69>?<3F>!-ïbHí0äì Û;J´Ø!(Á¿ Á­}Á£oÁ#<1F>çÉÒîp£ÔCÜÄ?€›'-¿<64>CæüÃèÃñÁÔ¶e{„ýËc~9ög<C3B6>ßEÞ%-r4^U<>Ór‡Ë_žÇ<C5BE>ç¹"ß`È>Ä<>û =çà%P<12>Û<EFBFBD>Ù¹ÿ°…[
­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;÷ÿ÷…
endstream
endobj
39 0 obj
<</Type/XRef/ID[<7b807ccf80af09b2c69b76f3128e9e1b><7b807ccf80af09b2c69b76f3128e9e1b>]/Root
1 0 R/Info 2 0 R/Size 40/W[1 3 2]/Filter/FlateDecode/Length 140>>
<</Type/XRef/ID[<765b7fb7bb798aaaa9806ab72fde8369><765b7fb7bb798aaaa9806ab72fde8369>]/Root
1 0 R/Info 2 0 R/Size 40/W[1 3 2]/Filter/FlateDecode/Length 139>>
stream
xÚ-λ ÂP …áã|“ & b¶@T4´)¨X*P!P(2ÔHÔ!>róÉú%[€®K€ 3:¥iNWtA!aûêróøØEp>ø¼¡¥èíâ%¡)ÒÑŒŽEïmS•ùüùnAç¢ÍÕzÓz_R}×Ö?©÷5 bi߯“¹Û€y
xÚ-Î1QÆñov±óv¨ÜÃ1D£Ò*4.å*!¯àÔ¢_;_¦ùeòOf2жPbLGtH#­hC§¨ÌÝ`ÁaëóÎE¯'/íÑ>Í逖´½½ºz?š<>ŸïÖt"šÎÖÓÓûŒªèûbý“{_Ð !6ömÜë ð~
endstream
endobj
startxref
928583
928582
%%EOF

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}

View File

@@ -1,6 +1,7 @@
# Curriculum-Vitae
This project contains my *curriculum vitae* writen in `TeX`.
This project contains my *curriculum vitae* writen in `TeX` using the base
class `article`.
## Install TeX
@@ -12,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).
## 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
View File

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

View File

@@ -19,6 +19,9 @@ 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}"
@@ -28,8 +31,24 @@ 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"
LATEX_CMD=(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"
LATEX_CMD=(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

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