19 changed files with 1010 additions and 360 deletions
@ -1,83 +0,0 @@ |
|||||
class WorkExperiencesController < ApplicationController |
|
||||
before_action :set_work_experience, only: %i[ show edit update destroy ] |
|
||||
|
|
||||
def cv |
|
||||
@user = User.last |
|
||||
# render layout: false, content_type: "application/octet-stream" |
|
||||
tex_content = render_to_string(layout: false) |
|
||||
|
|
||||
`rm -Rf #{Rails.root}/temp.tex #{Rails.root}/temp.pdf` |
|
||||
File.open("#{Rails.root}/temp.tex", "w") do |f| |
|
||||
f << tex_content |
|
||||
end |
|
||||
`pdflatex -interaction=batchmode -output-directory=#{Rails.root} #{Rails.root}/temp.tex` |
|
||||
render file: "#{Rails.root}/temp.pdf", layout: false |
|
||||
end |
|
||||
|
|
||||
# GET /work_experiences or /work_experiences.json |
|
||||
def index |
|
||||
@work_experiences = WorkExperience.all |
|
||||
end |
|
||||
|
|
||||
# GET /work_experiences/1 or /work_experiences/1.json |
|
||||
def show |
|
||||
end |
|
||||
|
|
||||
# GET /work_experiences/new |
|
||||
def new |
|
||||
@work_experience = WorkExperience.new |
|
||||
end |
|
||||
|
|
||||
# GET /work_experiences/1/edit |
|
||||
def edit |
|
||||
end |
|
||||
|
|
||||
# POST /work_experiences or /work_experiences.json |
|
||||
def create |
|
||||
@work_experience = WorkExperience.new(work_experience_params) |
|
||||
|
|
||||
respond_to do |format| |
|
||||
if @work_experience.save |
|
||||
format.html { redirect_to work_experience_url(@work_experience), notice: "Work experience was successfully created." } |
|
||||
format.json { render :show, status: :created, location: @work_experience } |
|
||||
else |
|
||||
format.html { render :new, status: :unprocessable_entity } |
|
||||
format.json { render json: @work_experience.errors, status: :unprocessable_entity } |
|
||||
end |
|
||||
end |
|
||||
end |
|
||||
|
|
||||
# PATCH/PUT /work_experiences/1 or /work_experiences/1.json |
|
||||
def update |
|
||||
respond_to do |format| |
|
||||
if @work_experience.update(work_experience_params) |
|
||||
format.html { redirect_to work_experience_url(@work_experience), notice: "Work experience was successfully updated." } |
|
||||
format.json { render :show, status: :ok, location: @work_experience } |
|
||||
else |
|
||||
format.html { render :edit, status: :unprocessable_entity } |
|
||||
format.json { render json: @work_experience.errors, status: :unprocessable_entity } |
|
||||
end |
|
||||
end |
|
||||
end |
|
||||
|
|
||||
# DELETE /work_experiences/1 or /work_experiences/1.json |
|
||||
def destroy |
|
||||
@work_experience.destroy |
|
||||
|
|
||||
respond_to do |format| |
|
||||
format.html { redirect_to work_experiences_url, notice: "Work experience was successfully destroyed." } |
|
||||
format.json { head :no_content } |
|
||||
end |
|
||||
end |
|
||||
|
|
||||
private |
|
||||
# Use callbacks to share common setup or constraints between actions. |
|
||||
def set_work_experience |
|
||||
@work_experience = WorkExperience.find(params[:id]) |
|
||||
end |
|
||||
|
|
||||
# Only allow a list of trusted parameters through. |
|
||||
def work_experience_params |
|
||||
params.require(:work_experience).permit(:period, :employer, :title, :technologies, :achivements) |
|
||||
end |
|
||||
end |
|
||||
@ -0,0 +1,11 @@ |
|||||
|
.PHONY: resume.pdf |
||||
|
|
||||
|
CC = xelatex |
||||
|
RESUME_DIR = . |
||||
|
RESUME_SRCS = $(shell find $(RESUME_DIR) -name '*.tex') |
||||
|
|
||||
|
resume.pdf: resume.tex $(RESUME_SRCS) |
||||
|
$(CC) -interaction=batchmode -output-directory=. $< |
||||
|
|
||||
|
clean: |
||||
|
rm -rf *.aux *.log *.pdf *.tex |
||||
@ -0,0 +1,780 @@ |
|||||
|
%% 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 effeciently |
||||
|
\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 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{fontawesome5} |
||||
|
\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}} |
||||
|
|
||||
|
% 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 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 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{tel:\@mobile}{\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{\faBirthdayCake\acvHeaderIconSep\@dateofbirth}% |
||||
|
}% |
||||
|
\ifthenelse{\isundefined{\@homepage}}% |
||||
|
{}% |
||||
|
{% |
||||
|
\ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}% |
||||
|
\href{http://\@homepage}{\faHome\acvHeaderIconSep\@homepage}% |
||||
|
}% |
||||
|
\ifthenelse{\isundefined{\@github}}% |
||||
|
{}% |
||||
|
{% |
||||
|
\ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}% |
||||
|
\href{https://github.com/\@github}{\faGithubSquare\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{\@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}{\faXingSquare\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{\@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} \\} |
||||
|
\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}, \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{-4.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} \\ |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,189 @@ |
|||||
|
%!TEX TS-program = xelatex |
||||
|
%!TEX encoding = UTF-8 Unicode |
||||
|
% Awesome CV LaTeX Template for CV/Resume |
||||
|
% |
||||
|
% This template has been downloaded from: |
||||
|
% https://github.com/posquit0/Awesome-CV |
||||
|
% |
||||
|
% Author: |
||||
|
% Claud D. Park <posquit0.bj@gmail.com> |
||||
|
% http://www.posquit0.com |
||||
|
% |
||||
|
% Template license: |
||||
|
% CC BY-SA 4.0 (https://creativecommons.org/licenses/by-sa/4.0/) |
||||
|
% |
||||
|
|
||||
|
|
||||
|
%------------------------------------------------------------------------------- |
||||
|
% CONFIGURATIONS |
||||
|
%------------------------------------------------------------------------------- |
||||
|
% A4 paper size by default, use 'letterpaper' for US letter |
||||
|
\documentclass[11pt, a4paper]{awesome-cv} |
||||
|
|
||||
|
% Configure page margins with geometry |
||||
|
\geometry{left=1.4cm, top=.8cm, right=1.4cm, bottom=1.8cm, footskip=.5cm} |
||||
|
|
||||
|
% Color for highlights |
||||
|
% Awesome Colors: awesome-emerald, awesome-skyblue, awesome-red, awesome-pink, awesome-orange |
||||
|
% awesome-nephritis, awesome-concrete, awesome-darknight |
||||
|
\colorlet{awesome}{awesome-red} |
||||
|
% Uncomment if you would like to specify your own color |
||||
|
% \definecolor{awesome}{HTML}{CA63A8} |
||||
|
|
||||
|
% Colors for text |
||||
|
% Uncomment if you would like to specify your own color |
||||
|
% \definecolor{darktext}{HTML}{414141} |
||||
|
% \definecolor{text}{HTML}{333333} |
||||
|
% \definecolor{graytext}{HTML}{5D5D5D} |
||||
|
% \definecolor{lighttext}{HTML}{999999} |
||||
|
% \definecolor{sectiondivider}{HTML}{5D5D5D} |
||||
|
|
||||
|
% Set false if you don't want to highlight section with awesome color |
||||
|
\setbool{acvSectionColorHighlight}{true} |
||||
|
|
||||
|
% If you would like to change the social information separator from a pipe (|) to something else |
||||
|
\renewcommand{\acvHeaderSocialSep}{\quad\textbar\quad} |
||||
|
|
||||
|
|
||||
|
%------------------------------------------------------------------------------- |
||||
|
% PERSONAL INFORMATION |
||||
|
% Comment any of the lines below if they are not required |
||||
|
%------------------------------------------------------------------------------- |
||||
|
% Available options: circle|rectangle,edge/noedge,left/right |
||||
|
% \photo[rectangle,edge,right]{./examples/profile} |
||||
|
\name{<%= @user.name %>}{} |
||||
|
\position{Software Engineer{\enskip\cdotp\enskip}Security Expert} |
||||
|
\address{<%= @user.address %>} |
||||
|
|
||||
|
\mobile{<%= @user.phone %>} |
||||
|
\email{<%= @user.email %>} |
||||
|
%\dateofbirth{January 1st, 1970} |
||||
|
\homepage{<%= @user.other_page_url %>} |
||||
|
\github{<%= @user.github %>} |
||||
|
% \linkedin{posquit0} |
||||
|
% \gitlab{gitlab-id} |
||||
|
% \stackoverflow{SO-id}{SO-name} |
||||
|
% \twitter{@twit} |
||||
|
% \skype{skype-id} |
||||
|
% \reddit{reddit-id} |
||||
|
% \medium{madium-id} |
||||
|
% \kaggle{kaggle-id} |
||||
|
% \googlescholar{googlescholar-id}{name-to-display} |
||||
|
%% \firstname and \lastname will be used |
||||
|
% \googlescholar{googlescholar-id}{} |
||||
|
% \extrainfo{extra information} |
||||
|
|
||||
|
% \quote{``Be the change that you want to see in the world."} |
||||
|
|
||||
|
|
||||
|
%------------------------------------------------------------------------------- |
||||
|
\begin{document} |
||||
|
|
||||
|
% Print the header with above personal information |
||||
|
% Give optional argument to change alignment(C: center, L: left, R: right) |
||||
|
\makecvheader[C] |
||||
|
|
||||
|
% Print the footer with 3 arguments(<left>, <center>, <right>) |
||||
|
% Leave any of these blank if they are not needed |
||||
|
\makecvfooter |
||||
|
{\today} |
||||
|
{<%= @user.name %>~~~·~~~Resume} |
||||
|
{\thepage} |
||||
|
|
||||
|
|
||||
|
%------------------------------------------------------------------------------- |
||||
|
% CV/RESUME CONTENT |
||||
|
% Each section is imported separately, open each file in turn to modify content |
||||
|
%------------------------------------------------------------------------------- |
||||
|
%\input{resume/summary.tex} |
||||
|
|
||||
|
%------------------------------------------------------------------------------- |
||||
|
% SECTION TITLE |
||||
|
%------------------------------------------------------------------------------- |
||||
|
\cvsection{Summary} |
||||
|
|
||||
|
|
||||
|
%------------------------------------------------------------------------------- |
||||
|
% CONTENT |
||||
|
%------------------------------------------------------------------------------- |
||||
|
\begin{cvparagraph} |
||||
|
|
||||
|
%--------------------------------------------------------- |
||||
|
<%= @user.objective %> |
||||
|
\end{cvparagraph} |
||||
|
|
||||
|
|
||||
|
|
||||
|
% \input{resume/experience.tex} |
||||
|
|
||||
|
%------------------------------------------------------------------------------- |
||||
|
% SECTION TITLE |
||||
|
%------------------------------------------------------------------------------- |
||||
|
\cvsection{Work Experience} |
||||
|
|
||||
|
|
||||
|
%------------------------------------------------------------------------------- |
||||
|
% CONTENT |
||||
|
%------------------------------------------------------------------------------- |
||||
|
\begin{cventries} |
||||
|
|
||||
|
%--------------------------------------------------------- |
||||
|
<% @user.work_experiences.each do |w| %> |
||||
|
\cventry |
||||
|
{<%= w.title %>} % Job title |
||||
|
{<%= w.employer %>} % Organization |
||||
|
{} % Location |
||||
|
{<%= w.period %>} % Date(s) |
||||
|
{ |
||||
|
\begin{cvitems} % Description(s) of tasks/responsibilities |
||||
|
\item {Provisioned an easily managable hybrid infrastructure(Amazon AWS + On-premise) utilizing IaC(Infrastructure as Code) tools like Ansible, Packer and Terraform.} |
||||
|
\item {Built fully automated CI/CD pipelines on CircleCI for containerized applications using Docker, AWS ECR and Rancher.} |
||||
|
\item {Designed an overall service architecture and pipelines of the Machine Learning based Fashion Tagging API SaaS product with the micro-services architecture.} |
||||
|
\item {Implemented several API microservices in Node.js Koa and in the serverless AWS Lambda functions.} |
||||
|
\item {Deployed a centralized logging environment(ELK, Filebeat, CloudWatch, S3) which gather log data from docker containers and AWS resources.} |
||||
|
\item {Deployed a centralized monitoring environment(Grafana, InfluxDB, CollectD) which gather system metrics as well as docker run-time metrics.} |
||||
|
\end{cvitems} |
||||
|
} |
||||
|
<% end %> |
||||
|
|
||||
|
%--------------------------------------------------------- |
||||
|
\end{cventries} |
||||
|
|
||||
|
|
||||
|
% \input{resume/education.tex} |
||||
|
|
||||
|
%------------------------------------------------------------------------------- |
||||
|
% SECTION TITLE |
||||
|
%------------------------------------------------------------------------------- |
||||
|
\cvsection{Education} |
||||
|
|
||||
|
|
||||
|
%------------------------------------------------------------------------------- |
||||
|
% CONTENT |
||||
|
%------------------------------------------------------------------------------- |
||||
|
\begin{cventries} |
||||
|
|
||||
|
%--------------------------------------------------------- |
||||
|
<% @user.education_entries.each do |e| %> |
||||
|
\cventry |
||||
|
{<%= e.title %>} % Degree |
||||
|
{<%= e.institution %>} % Institution |
||||
|
{<%= e.location %>} % Location |
||||
|
{<%= e.period %>} % Date(s) |
||||
|
{ |
||||
|
\begin{cvitems} % Description(s) bullet points |
||||
|
\item {<%= e.period %>} |
||||
|
\end{cvitems} |
||||
|
} |
||||
|
<% end %> |
||||
|
%--------------------------------------------------------- |
||||
|
\end{cventries} |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
% \input{resume/extracurricular.tex} |
||||
|
|
||||
|
|
||||
|
%------------------------------------------------------------------------------- |
||||
|
\end{document} |
||||
@ -1,42 +0,0 @@ |
|||||
<%= form_with(model: work_experience) do |form| %> |
|
||||
<% if work_experience.errors.any? %> |
|
||||
<div style="color: red"> |
|
||||
<h2><%= pluralize(work_experience.errors.count, "error") %> prohibited this work_experience from being saved:</h2> |
|
||||
|
|
||||
<ul> |
|
||||
<% work_experience.errors.each do |error| %> |
|
||||
<li><%= error.full_message %></li> |
|
||||
<% end %> |
|
||||
</ul> |
|
||||
</div> |
|
||||
<% end %> |
|
||||
|
|
||||
<div> |
|
||||
<%= form.label :period, style: "display: block" %> |
|
||||
<%= form.text_field :period %> |
|
||||
</div> |
|
||||
|
|
||||
<div> |
|
||||
<%= form.label :employer, style: "display: block" %> |
|
||||
<%= form.text_field :employer %> |
|
||||
</div> |
|
||||
|
|
||||
<div> |
|
||||
<%= form.label :title, style: "display: block" %> |
|
||||
<%= form.text_field :title %> |
|
||||
</div> |
|
||||
|
|
||||
<div> |
|
||||
<%= form.label :technologies, style: "display: block" %> |
|
||||
<%= form.text_field :technologies %> |
|
||||
</div> |
|
||||
|
|
||||
<div> |
|
||||
<%= form.label :achivements, style: "display: block" %> |
|
||||
<%= form.text_field :achivements %> |
|
||||
</div> |
|
||||
|
|
||||
<div> |
|
||||
<%= form.submit %> |
|
||||
</div> |
|
||||
<% end %> |
|
||||
@ -1,27 +0,0 @@ |
|||||
<div id="<%= dom_id work_experience %>"> |
|
||||
<p> |
|
||||
<strong>Period:</strong> |
|
||||
<%= work_experience.period %> |
|
||||
</p> |
|
||||
|
|
||||
<p> |
|
||||
<strong>Employer:</strong> |
|
||||
<%= work_experience.employer %> |
|
||||
</p> |
|
||||
|
|
||||
<p> |
|
||||
<strong>Title:</strong> |
|
||||
<%= work_experience.title %> |
|
||||
</p> |
|
||||
|
|
||||
<p> |
|
||||
<strong>Technologies:</strong> |
|
||||
<%= work_experience.technologies %> |
|
||||
</p> |
|
||||
|
|
||||
<p> |
|
||||
<strong>Achivements:</strong> |
|
||||
<%= work_experience.achivements %> |
|
||||
</p> |
|
||||
|
|
||||
</div> |
|
||||
@ -1,2 +0,0 @@ |
|||||
json.extract! work_experience, :id, :period, :employer, :title, :technologies, :achivements, :created_at, :updated_at |
|
||||
json.url work_experience_url(work_experience, format: :json) |
|
||||
@ -1,126 +0,0 @@ |
|||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
||||
% Stylish Curriculum Vitae |
|
||||
% LaTeX Template |
|
||||
% Version 1.1 (September 10, 2021) |
|
||||
% |
|
||||
% This template originates from: |
|
||||
% https://www.LaTeXTemplates.com |
|
||||
% |
|
||||
% Authors: |
|
||||
% Stefano (https://www.kindoblue.nl) |
|
||||
% Vel (vel@LaTeXTemplates.com) |
|
||||
% |
|
||||
% License: |
|
||||
% CC BY-NC-SA 4.0 (https://creativecommons.org/licenses/by-nc-sa/4.0/) |
|
||||
% |
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
||||
|
|
||||
\documentclass[a4paper, oneside, final]{scrartcl} % Paper options using the scrartcl class |
|
||||
|
|
||||
\usepackage{scrlayer-scrpage} % Provides headers and footers configuration |
|
||||
\usepackage{titlesec} % Allows creating custom \section's |
|
||||
\usepackage{marvosym} % Allows the use of symbols |
|
||||
\usepackage{tabularx,colortbl} % Advanced table configurations |
|
||||
\usepackage{microtype} % To enable letterspacing |
|
||||
\usepackage[a4paper, total={7.2in, 8in}]{geometry} |
|
||||
|
|
||||
\titleformat{\section}{\large\scshape\raggedright}{}{0em}{}[\titlerule] % Section formatting |
|
||||
|
|
||||
\pagestyle{scrheadings} % Print the headers and footers on all pages |
|
||||
|
|
||||
\addtolength{\voffset}{-0.5in} % Adjust the vertical offset - less whitespace at the top of the page |
|
||||
\addtolength{\textheight}{3cm} % Adjust the text height - less whitespace at the bottom of the page |
|
||||
|
|
||||
|
|
||||
% \addtolength{\hoffset}{-0.5in} % Adjust the horizontal offset - less whitespace at the top of the page |
|
||||
|
|
||||
\newcommand{\gray}{\rowcolor[gray]{.95}} % Custom highlighting for the work experience and education sections |
|
||||
|
|
||||
%---------------------------------------------------------------------------------------- |
|
||||
% FOOTER SECTION |
|
||||
%---------------------------------------------------------------------------------------- |
|
||||
|
|
||||
\renewcommand{\headfont}{\normalfont\rmfamily\scshape} % Font settings for footer |
|
||||
|
|
||||
\cofoot{ |
|
||||
\fontsize{12.5}{17}\selectfont % Letter spacing and font size |
|
||||
|
|
||||
\textls[150]{<%= @user.address %> {\large\textperiodcentered} Jujuy {\large\textperiodcentered} Argentina }\\ % Your mailing address |
|
||||
{\Large\Letter} \textls[150]{<%= @user.email %> \ {\Large\Telefon} <%= @user.phone %>} % Your email address and phone number |
|
||||
} |
|
||||
|
|
||||
%---------------------------------------------------------------------------------------- |
|
||||
|
|
||||
\begin{document} |
|
||||
|
|
||||
\begin{center} % Center everything in the document |
|
||||
|
|
||||
%---------------------------------------------------------------------------------------- |
|
||||
% HEADER SECTION |
|
||||
%---------------------------------------------------------------------------------------- |
|
||||
|
|
||||
{\fontsize{36}{36}\selectfont\scshape\textls[200]{<%= @user.name %>}} % Your name at the top |
|
||||
|
|
||||
\vspace{1.0cm} % Extra whitespace after the large name at the top |
|
||||
|
|
||||
%---------------------------------------------------------------------------------------- |
|
||||
% OBJECTIVE |
|
||||
%---------------------------------------------------------------------------------------- |
|
||||
|
|
||||
\section{Objective} |
|
||||
|
|
||||
% A position in the field of computers with special interests in business applications \\ programming, information processing, and management systems. |
|
||||
<%= @user.objective %> |
|
||||
|
|
||||
%---------------------------------------------------------------------------------------- |
|
||||
% WORK EXPERIENCE |
|
||||
%---------------------------------------------------------------------------------------- |
|
||||
|
|
||||
\section{Work Experience} |
|
||||
|
|
||||
<% @user.work_experiences.each do |w| %> |
|
||||
\begin{tabularx}{0.97\linewidth}{>{\raggedleft\scshape}p{2.5cm}X} |
|
||||
\gray Period & \textbf{<%= w.period %>}\\ |
|
||||
\gray Employer & \textbf{<%= w.employer %>} \hfill \\ |
|
||||
\gray Job Title & \textbf{<%= w.title %>}\\ |
|
||||
\gray Technologies & \textbf{<%= w.technologies %>}\\ |
|
||||
& <%= w.achivements %> |
|
||||
\end{tabularx} |
|
||||
|
|
||||
\vspace{12pt} |
|
||||
<% end %> |
|
||||
|
|
||||
%---------------------------------------------------------------------------------------- |
|
||||
% EDUCATION |
|
||||
%---------------------------------------------------------------------------------------- |
|
||||
|
|
||||
\section{Education} |
|
||||
|
|
||||
<% @user.education_entries.each do |e| %> |
|
||||
\begin{tabularx}{0.97\linewidth}{>{\raggedleft\scshape}p{2cm}X} |
|
||||
\gray Period & \textbf{<%= e.period %>}\\ |
|
||||
\gray Title & \textbf{<%= e.title %>}\\ |
|
||||
\gray Institution & \textbf{<%= e.institution %>} \hfill <%= e.location %>\\ |
|
||||
%& Extra information about degree |
|
||||
\end{tabularx} |
|
||||
|
|
||||
\vspace{12pt} |
|
||||
<% end %> |
|
||||
|
|
||||
%---------------------------------------------------------------------------------------- |
|
||||
% SKILLS |
|
||||
%---------------------------------------------------------------------------------------- |
|
||||
|
|
||||
\section{Skills} |
|
||||
|
|
||||
\begin{tabular}{ @{} >{\bfseries}l @{\hspace{6ex}} l } |
|
||||
<% @user.skills.order(order: :asc).each do |s| %> |
|
||||
<%= s.title %> & <%= s.detail %>\\ |
|
||||
<% end %> |
|
||||
\end{tabular} |
|
||||
|
|
||||
%---------------------------------------------------------------------------------------- |
|
||||
|
|
||||
\end{center} |
|
||||
|
|
||||
\end{document} |
|
||||
@ -1,10 +0,0 @@ |
|||||
<h1>Editing work experience</h1> |
|
||||
|
|
||||
<%= render "form", work_experience: @work_experience %> |
|
||||
|
|
||||
<br> |
|
||||
|
|
||||
<div> |
|
||||
<%= link_to "Show this work experience", @work_experience %> | |
|
||||
<%= link_to "Back to work experiences", work_experiences_path %> |
|
||||
</div> |
|
||||
@ -1,14 +0,0 @@ |
|||||
<p style="color: green"><%= notice %></p> |
|
||||
|
|
||||
<h1>Work experiences</h1> |
|
||||
|
|
||||
<div id="work_experiences"> |
|
||||
<% @work_experiences.each do |work_experience| %> |
|
||||
<%= render work_experience %> |
|
||||
<p> |
|
||||
<%= link_to "Show this work experience", work_experience %> |
|
||||
</p> |
|
||||
<% end %> |
|
||||
</div> |
|
||||
|
|
||||
<%= link_to "New work experience", new_work_experience_path %> |
|
||||
@ -1 +0,0 @@ |
|||||
json.array! @work_experiences, partial: "work_experiences/work_experience", as: :work_experience |
|
||||
@ -1,9 +0,0 @@ |
|||||
<h1>New work experience</h1> |
|
||||
|
|
||||
<%= render "form", work_experience: @work_experience %> |
|
||||
|
|
||||
<br> |
|
||||
|
|
||||
<div> |
|
||||
<%= link_to "Back to work experiences", work_experiences_path %> |
|
||||
</div> |
|
||||
@ -1,10 +0,0 @@ |
|||||
<p style="color: green"><%= notice %></p> |
|
||||
|
|
||||
<%= render @work_experience %> |
|
||||
|
|
||||
<div> |
|
||||
<%= link_to "Edit this work experience", edit_work_experience_path(@work_experience) %> | |
|
||||
<%= link_to "Back to work experiences", work_experiences_path %> |
|
||||
|
|
||||
<%= button_to "Destroy this work experience", @work_experience, method: :delete %> |
|
||||
</div> |
|
||||
@ -1 +0,0 @@ |
|||||
json.partial! "work_experiences/work_experience", work_experience: @work_experience |
|
||||
@ -1,9 +1,3 @@ |
|||||
Rails.application.routes.draw do |
Rails.application.routes.draw do |
||||
resources :work_experiences |
root to: "trestle/dashboard#index" |
||||
# Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html |
|
||||
|
|
||||
# Defines the root path route ("/") |
|
||||
# root "articles#index" |
|
||||
|
|
||||
get "cv", to: "work_experiences#cv" |
|
||||
end |
end |
||||
|
|||||
Loading…
Reference in new issue