397 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			TeX
		
	
	
	
	
	
			
		
		
	
	
			397 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			TeX
		
	
	
	
	
	
| %%%%%%%%%%%%%%%%%%%%
 | |
| %
 | |
| % License: MIT
 | |
| %
 | |
| % https://git.hadow.fr/sam.hadow/2colscv
 | |
| %
 | |
| % based on the template twentysecondscv (https://github.com/spagnuolocarmine/TwentySecondsCurriculumVitae-LaTex)
 | |
| %
 | |
| %%%%%%%%%%%%%%%%%%%%
 | |
| 
 | |
| % CLASS
 | |
| %%%%%%%%%%
 | |
| \ProvidesClass{2colscv}[CV class]
 | |
| \LoadClass{article}
 | |
| \NeedsTeXFormat{LaTeX2e}
 | |
| 
 | |
| % PACKAGES
 | |
| %%%%%%%%%%
 | |
| \RequirePackage[sfdefault]{ClearSans}
 | |
| \RequirePackage[T1]{fontenc}
 | |
| \RequirePackage{tikz}
 | |
| \usetikzlibrary{calc}
 | |
| \RequirePackage{xcolor}
 | |
| \RequirePackage[absolute,overlay]{textpos}
 | |
| \RequirePackage{ragged2e}
 | |
| \RequirePackage{etoolbox}
 | |
| \RequirePackage{ifmtarg}
 | |
| \RequirePackage{ifthen}
 | |
| \RequirePackage{pgffor}
 | |
| \RequirePackage{marvosym}
 | |
| \RequirePackage{parskip}
 | |
| \RequirePackage{array}
 | |
| \RequirePackage{xstring}
 | |
| \RequirePackage{fontawesome5}
 | |
| 
 | |
| % OPTIONS
 | |
| %%%%%%%%%%
 | |
| \DeclareOption{print}{\def\@cv@print{}}
 | |
| \DeclareOption*{
 | |
|   \PassOptionsToClass{\CurrentOption}{article}
 | |
| }
 | |
| \ProcessOptions\relax
 | |
| 
 | |
| % page settings
 | |
| \RequirePackage[left=7.3cm,top=0.1cm,right=0.5cm,bottom=0.2cm,nohead,nofoot]{geometry}
 | |
| \RequirePackage{hyperref}
 | |
| 
 | |
| % COLORS
 | |
| %%%%%%%%%%
 | |
| \definecolor{white}{RGB}{255,255,255}
 | |
| \definecolor{darkgray}{HTML}{333333}
 | |
| \definecolor{gray}{HTML}{4D4D4D}
 | |
| \definecolor{sidecolor}{HTML}{E7E7E7}
 | |
| \definecolor{lightgray}{HTML}{999999}
 | |
| \definecolor{green}{HTML}{C2E15F}
 | |
| \definecolor{orange}{HTML}{FDA333}
 | |
| \definecolor{purple}{HTML}{D3A4F9}
 | |
| \definecolor{red}{HTML}{FB0B00}
 | |
| \definecolor{blue}{HTML}{6CE0F1}
 | |
| \definecolor{mainblue}{HTML}{0E5484}
 | |
| \definecolor{cerulean}{HTML}{007BA7}
 | |
| \definecolor{maingray}{HTML}{B9B9B9}
 | |
| \definecolor{maindarkgray}{HTML}{B3B3B3}
 | |
| 
 | |
| \ifdefined\@cv@print
 | |
|   \colorlet{green}{gray}
 | |
|   \colorlet{orange}{gray}
 | |
|   \colorlet{purple}{gray}
 | |
|   \colorlet{red}{gray}
 | |
|   \colorlet{blue}{gray}
 | |
|   \colorlet{fillheader}{white}
 | |
|   \colorlet{asidecolor}{sidecolor}
 | |
|   \colorlet{header}{gray}
 | |
| \else
 | |
|   \colorlet{fillheader}{gray}
 | |
|   \colorlet{header}{white}
 | |
|   \colorlet{asidecolor}{sidecolor}
 | |
| \fi
 | |
| 
 | |
| \colorlet{textcolor}{gray}
 | |
| \colorlet{headercolor}{gray}
 | |
| 
 | |
| %%%%%%%%%%%%%%%%%%%%
 | |
| % PROFILE
 | |
| %%%%%%%%%%%%%%%%%%%%
 | |
| 
 | |
| % LEFT SIDEBAR
 | |
| %%%%%%%%%%
 | |
| \setlength{\TPHorizModule}{1cm}
 | |
| \setlength{\TPVertModule}{1cm}
 | |
| 
 | |
| % compute size of profile picture
 | |
| \newcommand{\imsize}{\linewidth}
 | |
| \newlength\imagewidth
 | |
| \newlength\imagescale
 | |
| \renewcommand{\imsize}{0.618\linewidth}
 | |
| \pgfmathsetlength{\imagewidth}{5cm}%
 | |
| \pgfmathsetlength{\imagescale}{\imagewidth/600}%
 | |
| 
 | |
| \newcommand{\profilesection}[2]{{\noindent\color{black!80} \huge #1 \rule[0.15\baselineskip]{#2}{1pt} \vspace{1pt}}}
 | |
| 
 | |
| \newcommand{\cvdate}[1]{\renewcommand{\givencvdate}{#1}}                % date
 | |
| \newcommand{\cvmail}[1]{\renewcommand{\givencvmail}{#1}}                % mail
 | |
| \newcommand{\cvnumberphone}[1]{\renewcommand{\givennumberphone}{#1}}    % phone
 | |
| \newcommand{\cvaddress}[1]{\renewcommand{\givencvaddress}{#1}}          % address
 | |
| \newcommand{\cvsite}[1]{\renewcommand{\givencvsite}{#1}}                % site
 | |
| \newcommand{\cvgit}[1]{\renewcommand{\givencvgit}{#1}}                  % git
 | |
| \newcommand{\cvctf}[1]{\renewcommand{\givencvctf}{#1}}                  % CTF website profile
 | |
| \newcommand{\aboutme}[1]{
 | |
|   \renewcommand{\givenaboutme}{
 | |
|     \leavevmode
 | |
|     \vadjust pre{\vspace*{0.75em}}
 | |
|     \justifying{#1}
 | |
|     \vspace{1em}
 | |
|     \\
 | |
|   }
 | |
| } % about me
 | |
| \newcommand{\profilepic}[1]{\renewcommand{\givenprofilepic}{#1}}        % picture
 | |
| \newcommand{\cvname}[1]{\renewcommand{\givencvname}{#1}}                % name
 | |
| \newcommand{\cvjobtitle}[1]{\renewcommand{\givencvjobtitle}{#1}}        % job title
 | |
| 
 | |
| \newcommand{\givencvname}{REQUIRED!} % name
 | |
| \newcommand{\givencvdate}{}          % date
 | |
| \newcommand{\givencvmail}{}          % mail
 | |
| \newcommand{\givennumberphone}{}     % phone
 | |
| \newcommand{\givencvaddress}{}       % address
 | |
| \newcommand{\givenaboutme}{}         % about me
 | |
| \newcommand{\givenprofilepic}{}      % picture
 | |
| \newcommand{\givencvsite}{}          % site
 | |
| \newcommand{\givencvgit}{}           % git
 | |
| \newcommand{\givencvctf}{}           % CTF website profile  (root-me, tryhackme etc..)
 | |
| \newcommand{\givencvjobtitle}{}      % job title
 | |
| 
 | |
| % icon in blue circle; #1 -> icon
 | |
| \newcommand*\icon[1]{\tikz[baseline=(char.base)]{
 | |
|   \node[shape=circle,draw,inner sep=1pt, minimum size=1.5em, fill=mainblue,mainblue,text=white] (char) {#1};}
 | |
| }
 | |
| 
 | |
| % Text in square node with rounded corners; #1 -> text, #2 -> color
 | |
| \newcommand*\round[2]{%
 | |
| \tikz[baseline=(char.base)]\node[anchor=north west, draw,rectangle,
 | |
|   rounded corners, inner sep=3pt, minimum size=5.5mm, text height=3.6mm,
 | |
|   fill=#2,#2,text=white](char){#1};%
 | |
| }
 | |
| 
 | |
| 
 | |
| % langskills macro
 | |
| % language, CEFR level (A1 to C2), certification%
 | |
| % Usage: \langskills{%
 | |
| %          English/C2/CPE,%
 | |
| %          Spanish/C1/DELE%
 | |
| %        }
 | |
| \newcommand\langskills[1]{%
 | |
|   \renewcommand{\givenskill}{%
 | |
|     \noindent
 | |
|     \begin{tikzpicture}[x=1cm,y=1cm]
 | |
|       % Loop over entries <Language>/<CEFR-code>/<Certification>
 | |
|       \foreach [count=\i] \L/\CEFR/\CERT in {#1} {%
 | |
| 
 | |
|         % (a) Compute the vertical position for row \i (1.2 cm between rows):
 | |
|         \pgfmathsetmacro{\y}{-\i * 1.7}  % e.g. for i=1, y=-1.2; for i=2, y=-2.4, etc.
 | |
| 
 | |
|         % (b) Language name
 | |
|         \node[anchor=west] at (0, { \y + 0.8 }) {\large{\L}};
 | |
| 
 | |
|         % (c) Certification
 | |
|         \node[anchor=east] at (6, { \y + 0.8 }) {\CERT};
 | |
| 
 | |
|         % (d) Gray background bar
 | |
|         \draw[fill=maingray, draw=none] (0,\y) rectangle (6,\y + 0.4);
 | |
| 
 | |
|         % (e) Convert CEFR code to integer 1..6
 | |
|         \def\nCEFR{0}%
 | |
|         \IfStrEq{\CEFR}{A1}{\def\nCEFR{1}}{%
 | |
|         \IfStrEq{\CEFR}{A2}{\def\nCEFR{2}}{%
 | |
|         \IfStrEq{\CEFR}{B1}{\def\nCEFR{3}}{%
 | |
|         \IfStrEq{\CEFR}{B2}{\def\nCEFR{4}}{%
 | |
|         \IfStrEq{\CEFR}{C1}{\def\nCEFR{5}}{%
 | |
|         \IfStrEq{\CEFR}{C2}{\def\nCEFR{6}}{}}}}}}%
 | |
| 
 | |
|         % (f) Fill the bar in blue from x=0 to x=CEFR:
 | |
|         \draw[fill=mainblue, draw=none] (0,\y) rectangle (\nCEFR,\y + 0.4);
 | |
| 
 | |
|         % (g) Draw 7 tick-marks at x=0,…,6 with CEFR labels 1->A1, …, 6->C2:
 | |
|         \draw[thick] (0,\y - 0.1) -- (6,\y - 0.1);  % baseline
 | |
|         \foreach \z in {0,...,6} {
 | |
|           \draw (\z,\y - 0.1) -- (\z,\y - 0.2);
 | |
|           \ifnum\z>0
 | |
|             \edef\tmp{%
 | |
|               \ifnum\z=1 A1\fi
 | |
|               \ifnum\z=2 A2\fi
 | |
|               \ifnum\z=3 B1\fi
 | |
|               \ifnum\z=4 B2\fi
 | |
|               \ifnum\z=5 C1\fi
 | |
|               \ifnum\z=6 C2\fi
 | |
|             }%
 | |
|             \node[font=\scriptsize, anchor=north] at (\z,\y - 0.2) {\tmp};
 | |
|           \fi
 | |
|         }
 | |
|       } % end \foreach
 | |
|     \end{tikzpicture}%
 | |
|   }% end \renewcommand{\givenskill}
 | |
| }% end \newcommand{\langskills}
 | |
| 
 | |
| % text style skills
 | |
| \newcommand{\givenskill}{}
 | |
|   \newcommand\skillstext[1]{
 | |
|     \renewcommand{\giventextskill}{
 | |
|     \begin{flushleft}
 | |
|     \noindent
 | |
|     \foreach [count=\i] \x/\y in {#1}
 | |
|     {
 | |
|       \x$ \star $\y
 | |
|     }
 | |
|     \end{flushleft}
 | |
|   }
 | |
| }
 | |
| 
 | |
| 
 | |
| % empty fallback
 | |
| \newcommand{\giventextskill}{}
 | |
| 
 | |
| \newcommand{\makeprofile}
 | |
| {
 | |
|   % grey bar on the left side
 | |
|   \begin{tikzpicture}[remember picture,overlay]
 | |
|       \node [rectangle, fill=asidecolor, anchor=north, minimum width=9.90cm, minimum height=\paperheight+1cm] (box) at (-5cm,0.5cm){};
 | |
|   \end{tikzpicture}
 | |
| 
 | |
|   \begin{textblock}{6}(0.5, 0.2)
 | |
| 
 | |
|     % profile picture (centered)
 | |
|     \begin{flushleft}
 | |
|       \centering
 | |
|       \ifthenelse{\equal{\givenprofilepic}{}}{}{\begin{tikzpicture}[x=\imagescale,y=-\imagescale]
 | |
|           \clip (600/2, 567/2) circle (567/2);
 | |
|           \node[anchor=north west, inner sep=0pt, outer sep=0pt] at (0,0) {\includegraphics[width=\imagewidth]{\givenprofilepic}};
 | |
|       \end{tikzpicture}}
 | |
|     \end{flushleft}
 | |
| 
 | |
|     \begin{flushleft}
 | |
|       \hspace{13pt}
 | |
| 
 | |
|       % name
 | |
|       {\Huge\color{mainblue}\givencvname}
 | |
| 
 | |
|       % jobtitle
 | |
|       \begin{flushright}
 | |
|         {\Large\color{black!80}\givencvjobtitle}
 | |
|       \end{flushright}
 | |
|       \renewcommand{\arraystretch}{1.6}
 | |
| 
 | |
|     % personnal info with icons
 | |
|     \begin{tabular}{c l}
 | |
|       % CV birthdate
 | |
|       \ifthenelse{\equal{\givencvdate}{}}{}{\textsc{\Large\icon{\Info}} & \givencvdate\\}%
 | |
|       % CV address
 | |
|       \ifthenelse{\equal{\givencvaddress}{}}{}{\textsc{\Large\icon{\faHome}} & \givencvaddress\\}%
 | |
|       % CV phone
 | |
|       \ifthenelse{\equal{\givennumberphone}{}}{}{\textsc{\Large\icon{\faMobile*}} & \givennumberphone\\}%
 | |
|       % CV website
 | |
|       \ifthenelse{\equal{\givencvsite}{}}{}{\textsc{\Large\icon{\faGlobe}} & \href{\givencvsite}{\textcolor{cerulean}{\givencvsite}}\\}%
 | |
|       % CV git
 | |
|       \ifthenelse{\equal{\givencvgit}{}}{}{\textsc{\Large\icon{\faGit*}} & \href{\givencvgit}{\textcolor{cerulean}{\givencvgit}}\\}%
 | |
|       % CV root-me
 | |
|       \ifthenelse{\equal{\givencvctf}{}}{}{\textsc{\Large\icon{\faUserSecret}} & \small{\href{\givencvctf}{\textcolor{cerulean}{\givencvctf}}}\\}%
 | |
|       % CV email
 | |
|       \ifthenelse{\equal{\givencvmail}{}}{}{\textsc{\Large\icon{\faEnvelope[regular]}} & \href{mailto:\givencvmail}{\givencvmail}}%
 | |
|     \end{tabular}
 | |
| 
 | |
|       % about me text
 | |
|       \profilesection{About me}{3.2cm}
 | |
|       \givenaboutme
 | |
|       % skills section
 | |
|       % languages
 | |
|       \profilesection{Languages}{2.7cm}
 | |
|       \givenskill
 | |
|       % other skills
 | |
|       \giventextskill
 | |
|       \noindent
 | |
|       \scriptsize
 | |
|       \noindent
 | |
| 
 | |
|     \end{flushleft}
 | |
|   \end{textblock}
 | |
|   \vspace{-10pt}
 | |
| }
 | |
| 
 | |
| % SECTIONS
 | |
| %%%%%%%%%%
 | |
| \newcounter{colorCounter}
 | |
| \def\@sectioncolor #1{
 | |
|   {%
 | |
|   % Switch between blue and gray
 | |
|    \round{#1}{%
 | |
|       \ifodd\value{colorCounter}%
 | |
|         mainblue%
 | |
|       \else%
 | |
|         maingray%
 | |
|       \fi%
 | |
|     }%
 | |
|   }%
 | |
|   \stepcounter{colorCounter}%
 | |
| }
 | |
| 
 | |
| \renewcommand{\section}[1]{%
 | |
|   \par
 | |
|   {%
 | |
|     \LARGE
 | |
|     \color{headercolor}%
 | |
|     \@sectioncolor{#1}%
 | |
|   }%
 | |
|   \par\vspace{\parskip}%
 | |
| }
 | |
| 
 | |
| \newcommand{\sectionicon}[2]{
 | |
|   \par%
 | |
|   {%
 | |
|     \LARGE
 | |
|     #1
 | |
|     \color{headercolor}%
 | |
|     \@sectioncolor #2%
 | |
|   }
 | |
|   \par\vspace{\parskip}
 | |
| }
 | |
| 
 | |
| \renewcommand{\subsection}[1]{
 | |
|   \par\vspace{.5\parskip}%
 | |
|   {%
 | |
|   \large\color{headercolor} #1%
 | |
|   }
 | |
|   \par\vspace{.25\parskip}%
 | |
| }
 | |
| 
 | |
| \pagestyle{empty}
 | |
| 
 | |
| % experience/education list environment
 | |
| %%%%%%%%%%
 | |
| \setlength{\tabcolsep}{0pt}
 | |
| \newenvironment{experience}{%
 | |
|   \begin{tabular*}{\textwidth}{@{\extracolsep{\fill}}ll}
 | |
| }{%
 | |
|   \end{tabular*}
 | |
| }
 | |
| \renewcommand{\bfseries}{\color{headercolor}}
 | |
| \newcommand{\experienceitem}[4]{%
 | |
|   \hspace{5pt}#1&\parbox[t]{11.2cm}{%
 | |
|     \textbf{#2}%
 | |
|     \hfill%
 | |
|     {\footnotesize#3}\\%
 | |
|     #4\vspace{\parsep}%
 | |
|   }\\%
 | |
| }
 | |
| \setlength{\tabcolsep}{0pt}
 | |
| \newenvironment{cvicon}{%
 | |
|   \begin{tabular*}{\textwidth}{@{\extracolsep{\fill}}ll}
 | |
| }{%
 | |
|   \end{tabular*}
 | |
| }
 | |
| \renewcommand{\bfseries}{\color{headercolor}}
 | |
| \newcommand{\cviconitem}[5]{%
 | |
|  \hspace{3pt}\faicon{#1}\hspace{2pt}#2&\parbox[t]{11.2cm}{%
 | |
|     \textbf{#3}%
 | |
|     \hfill%
 | |
|     {\footnotesize#4}\\%
 | |
|     #5\vspace{\parsep}%
 | |
|   }\\%
 | |
| }
 | |
| 
 | |
| % short list environment (publication)
 | |
| %%%%%%%%%%
 | |
| \setlength{\tabcolsep}{0pt}
 | |
| \newenvironment{shortlist}{%
 | |
|   \begin{tabular*}{\textwidth}{@{\extracolsep{\fill}}ll}
 | |
| }{%
 | |
|   \end{tabular*}
 | |
| }
 | |
| \renewcommand{\bfseries}{\color{headercolor}}
 | |
| \newcommand{\shortlistitem}[2]{%
 | |
|   \hspace{5pt}#1&\parbox[t]{11.5cm}{%
 | |
|     \textbf{#2}%
 | |
|   }\\%
 | |
| }
 | |
| \setlength{\tabcolsep}{0pt}
 | |
| \newenvironment{cviconshort}{%
 | |
|   \begin{tabular*}{\textwidth}{@{\extracolsep{\fill}}ll}
 | |
| }{%
 | |
|   \end{tabular*}
 | |
| }
 | |
| \renewcommand{\bfseries}{\color{headercolor}}
 | |
| \newcommand{\cviconshortitem}[3]{%
 | |
|   \hspace{3pt}\faicon{#1}\hspace{3pt}#2&
 | |
|       \parbox[t]{11.5cm}{%
 | |
|     \textbf{#3}%
 | |
|   }\\%
 | |
| }
 |