Commit | Line | Data |
---|---|---|
2c9a40d6 JC |
1 | %% Start of file `awesome-cv.cls'. |
2 | % Awesome CV Class File | |
3 | % | |
4 | % This class has been downloaded from: | |
5 | % https://github.com/posquit0/Awesome-CV | |
6 | % | |
7 | % Author: | |
8 | % Claud D. Park <posquit0.bj@gmail.com> | |
9 | % http://www.posquit0.com | |
10 | % | |
11 | % Notes: | |
12 | % 1) This class file defines the structure and layout of the template file (cv.tex, resume.tex). | |
13 | % 2) It has been written in such a way that under most circumstances you | |
14 | % should not need to edit it. | |
15 | % | |
16 | % Class license: | |
17 | % LPPL v1.3c (http://www.latex-project.org/lppl) | |
18 | % | |
19 | ||
20 | ||
21 | %------------------------------------------------------------------------------- | |
22 | % Identification | |
23 | %------------------------------------------------------------------------------- | |
24 | \ProvidesClass{awesome-cv}[2017/02/05 v1.6.1 Awesome Curriculum Vitae Class] | |
25 | \NeedsTeXFormat{LaTeX2e} | |
26 | ||
27 | ||
28 | %------------------------------------------------------------------------------- | |
29 | % Class options | |
30 | % | |
31 | % (need to be done before the external package loading, for example because | |
32 | % we need \paperwidth, \paperheight and \@ptsize to be defined before loading | |
33 | % geometry and fancyhdr) | |
34 | %------------------------------------------------------------------------------- | |
35 | % Options for draft or final | |
36 | \DeclareOption{draft}{\setlength\overfullrule{5pt}} | |
37 | \DeclareOption{final}{\setlength\overfullrule{0pt}} | |
38 | % Inherit options of article | |
39 | \DeclareOption*{% | |
40 | \PassOptionsToClass{\CurrentOption}{article} | |
41 | } | |
42 | \ProcessOptions\relax | |
43 | \LoadClass{article} | |
44 | ||
45 | ||
46 | %------------------------------------------------------------------------------- | |
47 | % 3rd party packages | |
48 | %------------------------------------------------------------------------------- | |
49 | % Needed to make fixed length table | |
50 | \RequirePackage{array} | |
51 | % Needed to handle list environment | |
52 | \RequirePackage{enumitem} | |
53 | % Needed to handle text alignment | |
54 | \RequirePackage{ragged2e} | |
55 | % Needed to configure page layout | |
56 | \RequirePackage{geometry} | |
57 | % Needed to make header & footer effeciently | |
58 | \RequirePackage{fancyhdr} | |
59 | % Needed to manage colors | |
60 | \RequirePackage{xcolor} | |
61 | % Needed to use \ifxetex-\else-\fi statement | |
62 | \RequirePackage{ifxetex} | |
63 | % Needed to use \if-\then-\else statement | |
64 | \RequirePackage{xifthen} | |
65 | % Needed to use a toolbox of programming tools | |
66 | \RequirePackage{etoolbox} | |
67 | % Needed to change line spacing in specific environment | |
68 | \RequirePackage{setspace} | |
69 | % Needed to manage fonts | |
70 | \RequirePackage[quiet]{fontspec} | |
71 | % To support LaTeX quoting style | |
72 | \defaultfontfeatures{Ligatures=TeX} | |
73 | % Needed to manage math fonts | |
74 | \RequirePackage{unicode-math} | |
75 | % Needed to use icons from font-awesome | |
76 | % (https://github.com/posquit0/latex-fontawesome) | |
77 | \RequirePackage{fontawesome} | |
78 | \RequirePackage[default,opentype]{sourcesanspro} | |
79 | % Needed for the photo ID | |
80 | \RequirePackage[skins]{tcolorbox} | |
81 | % Needed to deal a paragraphs | |
82 | \RequirePackage{parskip} | |
83 | % Needed to deal hyperlink | |
84 | \RequirePackage[hidelinks,unicode]{hyperref} | |
85 | \hypersetup{% | |
86 | pdftitle={}, | |
87 | pdfauthor={}, | |
88 | pdfsubject={}, | |
89 | pdfkeywords={} | |
90 | } | |
91 | ||
92 | ||
93 | %------------------------------------------------------------------------------- | |
94 | % Configuration for directory locations | |
95 | %------------------------------------------------------------------------------- | |
96 | % Configure a directory location for fonts(default: 'fonts/') | |
97 | \newcommand*{\fontdir}[1][fonts/]{\def\@fontdir{#1}} | |
98 | \fontdir | |
99 | ||
100 | ||
101 | %------------------------------------------------------------------------------- | |
102 | % Configuration for layout | |
103 | %------------------------------------------------------------------------------- | |
104 | %% Page Layout | |
105 | % Configure page margins with geometry | |
106 | \geometry{left=2.0cm, top=1.5cm, right=2.0cm, bottom=2.0cm, footskip=.5cm} | |
107 | ||
108 | %% Header & Footer | |
109 | % Set offset to each header and footer | |
110 | \fancyhfoffset{0em} | |
111 | % Remove head rule | |
112 | \renewcommand{\headrulewidth}{0pt} | |
113 | % Clear all header & footer fields | |
114 | \fancyhf{} | |
115 | % Enable if you want to make header or footer using fancyhdr | |
116 | \pagestyle{fancy} | |
117 | ||
118 | ||
119 | %------------------------------------------------------------------------------- | |
120 | % Configuration for colors | |
121 | %------------------------------------------------------------------------------- | |
122 | % Gray-scale colors | |
123 | \definecolor{white}{HTML}{FFFFFF} | |
124 | \definecolor{black}{HTML}{000000} | |
125 | \definecolor{darkgray}{HTML}{333333} | |
126 | \definecolor{gray}{HTML}{5D5D5D} | |
127 | \definecolor{lightgray}{HTML}{999999} | |
128 | % Basic colors | |
129 | \definecolor{green}{HTML}{C2E15F} | |
130 | \definecolor{orange}{HTML}{FDA333} | |
131 | \definecolor{purple}{HTML}{D3A4F9} | |
132 | \definecolor{red}{HTML}{FB4485} | |
133 | \definecolor{blue}{HTML}{6CE0F1} | |
134 | % Text colors | |
135 | \definecolor{darktext}{HTML}{414141} | |
136 | \colorlet{text}{darkgray} | |
137 | \colorlet{graytext}{gray} | |
138 | \colorlet{lighttext}{lightgray} | |
139 | % Awesome colors | |
140 | \definecolor{awesome-emerald}{HTML}{00A388} | |
141 | \definecolor{awesome-skyblue}{HTML}{0395DE} | |
142 | \definecolor{awesome-red}{HTML}{DC3522} | |
143 | \definecolor{awesome-pink}{HTML}{EF4089} | |
144 | \definecolor{awesome-orange}{HTML}{FF6138} | |
145 | \definecolor{awesome-nephritis}{HTML}{27AE60} | |
146 | \definecolor{awesome-concrete}{HTML}{95A5A6} | |
147 | \definecolor{awesome-darknight}{HTML}{131A28} | |
148 | \colorlet{awesome}{awesome-red} | |
149 | ||
150 | % Boolean value to switch section color highlighting | |
151 | \newbool{acvSectionColorHighlight} | |
152 | \setbool{acvSectionColorHighlight}{true} | |
153 | ||
154 | % Awesome section color | |
155 | \def\@sectioncolor#1#2#3{% | |
156 | \ifbool{acvSectionColorHighlight}{{\color{awesome}#1#2#3}}{#1#2#3}% | |
157 | } | |
158 | ||
159 | ||
160 | %------------------------------------------------------------------------------- | |
161 | % Configuration for fonts | |
162 | %------------------------------------------------------------------------------- | |
163 | % Set the FontAwesome font to be up-to-date. | |
164 | \newfontfamily\FAF[Path=\@fontdir]{FontAwesome} | |
165 | % Set font for header (default is Roboto) | |
166 | \newfontfamily\headerfont[ | |
167 | Path=\@fontdir, | |
168 | UprightFont=*-Regular, | |
169 | ItalicFont=*-Italic, | |
170 | BoldFont=*-Bold, | |
171 | BoldItalicFont=*-BoldItalic, | |
172 | ]{Roboto} | |
173 | ||
174 | \newfontfamily\headerfontlight[ | |
175 | Path=\@fontdir, | |
176 | UprightFont=*-Thin, | |
177 | ItalicFont=*-ThinItalic, | |
178 | BoldFont=*-Medium, | |
179 | BoldItalicFont=*-MediumItalic, | |
180 | ]{Roboto} | |
181 | ||
182 | \newcommand*{\footerfont}{\sourcesanspro} | |
183 | \newcommand*{\bodyfont}{\sourcesanspro} | |
184 | \newcommand*{\bodyfontlight}{\sourcesansprolight} | |
185 | ||
186 | %------------------------------------------------------------------------------- | |
187 | % Configuration for styles | |
188 | %------------------------------------------------------------------------------- | |
189 | % Configure styles for each CV elements | |
190 | % For fundamental structures | |
191 | \newcommand*{\headerfirstnamestyle}[1]{{\fontsize{32pt}{1em}\headerfontlight\color{graytext} #1}} | |
192 | \newcommand*{\headerlastnamestyle}[1]{{\fontsize{32pt}{1em}\headerfont\bfseries\color{text} #1}} | |
193 | \newcommand*{\headerpositionstyle}[1]{{\fontsize{7.6pt}{1em}\bodyfont\scshape\color{awesome} #1}} | |
194 | \newcommand*{\headeraddressstyle}[1]{{\fontsize{8pt}{1em}\headerfont\itshape\color{lighttext} #1}} | |
195 | \newcommand*{\headersocialstyle}[1]{{\fontsize{6.8pt}{1em}\headerfont\color{text} #1}} | |
196 | \newcommand*{\headerquotestyle}[1]{{\fontsize{9pt}{1em}\bodyfont\itshape\color{darktext} #1}} | |
197 | \newcommand*{\footerstyle}[1]{{\fontsize{8pt}{1em}\footerfont\scshape\color{lighttext} #1}} | |
198 | \newcommand*{\sectionstyle}[1]{{\fontsize{16pt}{1em}\bodyfont\bfseries\color{text}\@sectioncolor #1}} | |
199 | \newcommand*{\subsectionstyle}[1]{{\fontsize{12pt}{1em}\bodyfont\scshape\textcolor{text}{#1}}} | |
200 | \newcommand*{\paragraphstyle}{\fontsize{9pt}{1em}\bodyfontlight\upshape\color{text}} | |
201 | ||
202 | % For elements of entry | |
203 | \newcommand*{\entrytitlestyle}[1]{{\fontsize{10pt}{1em}\bodyfont\bfseries\color{darktext} #1}} | |
204 | \newcommand*{\entrypositionstyle}[1]{{\fontsize{8pt}{1em}\bodyfont\scshape\color{graytext} #1}} | |
205 | \newcommand*{\entrydatestyle}[1]{{\fontsize{8pt}{1em}\bodyfontlight\slshape\color{graytext} #1}} | |
206 | \newcommand*{\entrylocationstyle}[1]{{\fontsize{9pt}{1em}\bodyfontlight\slshape\color{awesome} #1}} | |
207 | \newcommand*{\descriptionstyle}[1]{{\fontsize{9pt}{1em}\bodyfontlight\upshape\color{text} #1}} | |
208 | ||
209 | % For elements of subentry | |
210 | \newcommand*{\subentrytitlestyle}[1]{{\fontsize{8pt}{1em}\bodyfont\mdseries\color{graytext} #1}} | |
211 | \newcommand*{\subentrypositionstyle}[1]{{\fontsize{7pt}{1em}\bodyfont\scshape\color{graytext} #1}} | |
212 | \newcommand*{\subentrydatestyle}[1]{{\fontsize{7pt}{1em}\bodyfontlight\slshape\color{graytext} #1}} | |
213 | \newcommand*{\subentrylocationstyle}[1]{{\fontsize{7pt}{1em}\bodyfontlight\slshape\color{awesome} #1}} | |
214 | \newcommand*{\subdescriptionstyle}[1]{{\fontsize{8pt}{1em}\bodyfontlight\upshape\color{text} #1}} | |
215 | ||
216 | % For elements of honor | |
217 | \newcommand*{\honortitlestyle}[1]{{\fontsize{9pt}{1em}\bodyfont\color{graytext} #1}} | |
218 | \newcommand*{\honorpositionstyle}[1]{{\fontsize{9pt}{1em}\bodyfont\bfseries\color{darktext} #1}} | |
219 | \newcommand*{\honordatestyle}[1]{{\fontsize{9pt}{1em}\bodyfont\color{graytext} #1}} | |
220 | \newcommand*{\honorlocationstyle}[1]{{\fontsize{9pt}{1em}\bodyfontlight\slshape\color{awesome} #1}} | |
221 | ||
222 | % For elements of skill | |
223 | \newcommand*{\skilltypestyle}[1]{{\fontsize{10pt}{1em}\bodyfont\bfseries\color{darktext} #1}} | |
224 | \newcommand*{\skillsetstyle}[1]{{\fontsize{9pt}{1em}\bodyfontlight\color{text} #1}} | |
225 | ||
226 | % For elements of the cover letter | |
227 | \newcommand*{\lettersectionstyle}[1]{{\fontsize{14pt}{1em}\bodyfont\bfseries\color{text}\@sectioncolor #1}} | |
228 | \newcommand*{\recipientaddressstyle}[1]{{\fontsize{9pt}{1em}\bodyfont\scshape\color{graytext} #1}} | |
229 | \newcommand*{\recipienttitlestyle}[1]{{\fontsize{11pt}{1em}\bodyfont\bfseries\color{darktext} #1}} | |
230 | \newcommand*{\lettertitlestyle}[1]{{\fontsize{10pt}{1em}\bodyfontlight\bfseries\color{darktext} \underline{#1}}} | |
231 | \newcommand*{\letterdatestyle}[1]{{\fontsize{9pt}{1em}\bodyfontlight\slshape\color{graytext} #1}} | |
232 | \newcommand*{\lettertextstyle}{\fontsize{10pt}{1.4em}\bodyfontlight\upshape\color{graytext}} | |
233 | \newcommand*{\letternamestyle}[1]{{\fontsize{10pt}{1em}\bodyfont\bfseries\color{darktext} #1}} | |
234 | \newcommand*{\letterenclosurestyle}[1]{{\fontsize{10pt}{1em}\bodyfontlight\slshape\color{lighttext} #1}} | |
235 | ||
236 | ||
237 | %------------------------------------------------------------------------------- | |
238 | % Commands for personal information | |
239 | %------------------------------------------------------------------------------- | |
240 | % Define photo ID | |
241 | % Usage: \photo[circle|rectangle,edge|noedge,left|right]{<path-to-image>} | |
242 | \newcommand{\photo}[2][circle,edge,left]{% | |
243 | \def\@photo{#2} | |
244 | \@for\tmp:=#1\do{% | |
245 | \ifthenelse{\equal{\tmp}{circle} \or \equal{\tmp}{rectangle}}% | |
246 | {\let\@photoshape\tmp}{}% | |
247 | \ifthenelse{\equal{\tmp}{edge} \or \equal{\tmp}{noedge}}% | |
248 | {\let\@photoedge\tmp}{}% | |
249 | \ifthenelse{\equal{\tmp}{left} \or \equal{\tmp}{right}}% | |
250 | {\let\@photoalign\tmp}{}% | |
251 | }% | |
252 | } | |
253 | \def\@photoshape{circle} | |
254 | \def\@photoedge{edge} | |
255 | \def\@photoalign{left} | |
256 | ||
257 | % Define writer's name | |
258 | % Usage: \name{<firstname>}{<lastname>} | |
259 | % Usage: \firstname{<firstname>} | |
260 | % Usage: \lastname{<lastname>} | |
261 | % Usage: \familyname{<familyname>} | |
262 | \newcommand*{\name}[2]{\def\@firstname{#1}\def\@lastname{#2}} | |
263 | \newcommand*{\firstname}[1]{\def\@firstname{#1}} | |
264 | \newcommand*{\lastname}[1]{\def\@lastname{#1}} | |
265 | \newcommand*{\familyname}[1]{\def\@lastname{#1}} | |
266 | \def\@familyname{\@lastname} | |
267 | ||
268 | % Define writer's address | |
269 | % Usage: \address{<address>} | |
270 | \newcommand*{\address}[1]{\def\@address{#1}} | |
271 | ||
272 | % Define writer's position | |
273 | % Usage: \name{<position>} | |
274 | \newcommand*{\position}[1]{\def\@position{#1}} | |
275 | ||
276 | % Defines writer's mobile (optional) | |
277 | % Usage: \mobile{<mobile number>} | |
278 | \newcommand*{\mobile}[1]{\def\@mobile{#1}} | |
279 | ||
280 | % Defines writer's email (optional) | |
281 | % Usage: \email{<email adress>} | |
282 | \newcommand*{\email}[1]{\def\@email{#1}} | |
283 | ||
284 | % Defines writer's homepage (optional) | |
285 | % Usage: \homepage{<url>} | |
286 | \newcommand*{\homepage}[1]{\def\@homepage{#1}} | |
287 | ||
288 | % Defines writer's github (optional) | |
289 | % Usage: \github{<github-nick>} | |
290 | \newcommand*{\github}[1]{\def\@github{#1}} | |
291 | ||
292 | % Defines writer's gitlab (optional) | |
293 | % Usage: \gitlab{<gitlab-nick>} | |
294 | \newcommand*{\gitlab}[1]{\def\@gitlab{#1}} | |
295 | ||
296 | % Defines writer's stackoverflow profile (optional) | |
297 | % Usage: \stackoverflow{<so userid>}{<so username>} | |
298 | % e.g.https://stackoverflow.com/users/123456/sam-smith | |
299 | % would be \stackoverflow{123456}{sam-smith} | |
300 | \newcommand*{\stackoverflow}[2]{\def\@stackoverflowid{#1}\def\@stackoverflowname{#2}} | |
301 | ||
302 | % Defines writer's linked-in (optional) | |
303 | % Usage: \linkedin{<linked-in-nick>} | |
304 | \newcommand*{\linkedin}[1]{\def\@linkedin{#1}} | |
305 | ||
306 | % Usage: \twitter{<twitter handle>} | |
307 | \newcommand*{\twitter}[1]{\def\@twitter{#1}} | |
308 | ||
309 | % Defines writer's skype (optional) | |
310 | % Usage: \skype{<skype account>} | |
311 | \newcommand*{\skype}[1]{\def\@skype{#1}} | |
312 | ||
313 | % Defines writer's reddit (optional) | |
314 | % Usage: \reddit{<reddit account>} | |
315 | \newcommand*{\reddit}[1]{\def\@reddit{#1}} | |
316 | ||
317 | % Defines writer's xing (optional) | |
318 | % Usage: \xing{<xing name>} | |
319 | \newcommand*{\xing}[1]{\def\@xing{#1}} | |
320 | ||
321 | % Defines writer's twitter (optional) | |
322 | % Defines writer's extra informations (optional) | |
323 | % Usage: \extrainfo{<extra informations>} | |
324 | \newcommand*{\extrainfo}[1]{\def\@extrainfo{#1}} | |
325 | ||
326 | % Defines writer's quote (optional) | |
327 | % Usage: \quote{<quote>} | |
328 | \renewcommand*{\quote}[1]{\def\@quote{#1}} | |
329 | ||
330 | % Defines recipient's information (cover letter only) | |
331 | % Usage: \recipient{<recipient name>}{<recipient address>} | |
332 | % Usage: \recipientname{<recipient name>} | |
333 | % Usage: \recipientaddress{<recipient address>} | |
334 | \newcommand*{\recipient}[2]{\def\@recipientname{#1}\def\@recipientaddress{#2}} | |
335 | \newcommand*{\recipientname}[1]{\def\@recipientname{#1}} | |
336 | \newcommand*{\recipientaddress}[1]{\def\@recipientaddress{#1}} | |
337 | ||
338 | % Defines the title for letter (cover letter only, optional) | |
339 | % Usage: \lettertitle{<title>} | |
340 | \newcommand*{\lettertitle}[1]{\def\@lettertitle{#1}} | |
341 | ||
342 | % Defines the date for letter (cover letter only) | |
343 | % Usage: \letterdate{<date>} | |
344 | \newcommand*{\letterdate}[1]{\def\@letterdate{#1}} | |
345 | ||
346 | % Defines a message of opening for letter (cover letter only) | |
347 | % Usage: \letteropening{<message>} | |
348 | \newcommand*{\letteropening}[1]{\def\@letteropening{#1}} | |
349 | ||
350 | % Defines a message of closing for letter (cover letter only) | |
351 | % Usage: \letterclosing{<message>} | |
352 | \newcommand*{\letterclosing}[1]{\def\@letterclosing{#1}} | |
353 | ||
354 | % Defines an enclosure for letter (cover letter only, optional) | |
355 | % Usage: \letterenclosure[<enclosure name>]{<enclosure>} | |
356 | \newcommand*{\letterenclname}[1][Enclosure]{\def\@letterenclname{#1}} | |
357 | \newcommand*{\letterenclosure}[2][]{% | |
358 | % if an optional argument is provided, use it to redefine \enclname | |
359 | \ifthenelse{\equal{#1}{}}{}{\def\@letterenclname{#1}} | |
360 | \def\@letterenclosure{#2} | |
361 | } | |
362 | ||
363 | ||
364 | %------------------------------------------------------------------------------- | |
365 | % Commands for extra | |
366 | %------------------------------------------------------------------------------- | |
367 | %% Define helper macros a user can change easily | |
368 | % Header | |
369 | \newcommand{\acvHeaderNameDelim}{\space} | |
370 | \newcommand{\acvHeaderAfterNameSkip}{.4mm} | |
371 | \newcommand{\acvHeaderAfterPositionSkip}{.4mm} | |
372 | \newcommand{\acvHeaderAfterAddressSkip}{-.5mm} | |
373 | \newcommand{\acvHeaderIconSep}{\space} | |
374 | \newcommand{\acvHeaderSocialSep}{\quad\textbar\quad} | |
375 | \newcommand{\acvHeaderAfterSocialSkip}{6mm} | |
376 | \newcommand{\acvHeaderAfterQuoteSkip}{5mm} | |
377 | ||
378 | % Others | |
379 | \newcommand{\acvSectionTopSkip}{3mm} | |
380 | \newcommand{\acvSectionContentTopSkip}{2.5mm} | |
381 | ||
382 | ||
383 | %------------------------------------------------------------------------------- | |
384 | % Commands for utilities | |
385 | %------------------------------------------------------------------------------- | |
386 | % Use to align an element of tabular table | |
387 | \newcolumntype{L}[1]{>{\raggedright\let\newline\\\arraybackslash\hspace{0pt}}m{#1}} | |
388 | \newcolumntype{C}[1]{>{\centering\let\newline\\\arraybackslash\hspace{0pt}}m{#1}} | |
389 | \newcolumntype{R}[1]{>{\raggedleft\let\newline\\\arraybackslash\hspace{0pt}}m{#1}} | |
390 | ||
391 | % Use to draw horizontal line with specific thickness | |
392 | \def\vhrulefill#1{\leavevmode\leaders\hrule\@height#1\hfill \kern\z@} | |
393 | ||
394 | % Use to execute conditional statements by checking empty string | |
395 | \newcommand*{\ifempty}[3]{\ifthenelse{\isempty{#1}}{#2}{#3}} | |
396 | ||
397 | ||
398 | %------------------------------------------------------------------------------- | |
399 | % Commands for elements of CV structure | |
400 | %------------------------------------------------------------------------------- | |
401 | % Define a header for CV | |
402 | % Usage: \makecvheader | |
403 | \newcommand*{\makecvheader}[1][C]{% | |
404 | \newcommand*{\drawphoto}{% | |
405 | \ifthenelse{\isundefined{\@photo}}{}{% | |
406 | \newlength{\photodim} | |
407 | \ifthenelse{\equal{\@photoshape}{circle}}% | |
408 | {\setlength{\photodim}{1.3cm}}% | |
409 | {\setlength{\photodim}{1.8cm}}% | |
410 | \ifthenelse{\equal{\@photoedge}{edge}}% | |
411 | {\def\@photoborder{darkgray}}% | |
412 | {\def\@photoborder{none}}% | |
413 | \begin{tikzpicture}% | |
414 | \node[\@photoshape, draw=\@photoborder, line width=0.3mm, inner sep=\photodim, fill overzoom image=\@photo] () {}; | |
415 | \end{tikzpicture} | |
416 | }% | |
417 | } | |
418 | \newlength{\headertextwidth} | |
419 | \newlength{\headerphotowidth} | |
420 | \ifthenelse{\isundefined{\@photo}}{ | |
421 | \setlength{\headertextwidth}{\textwidth} | |
422 | \setlength{\headerphotowidth}{0cm} | |
423 | }{% | |
424 | \setlength{\headertextwidth}{0.76\textwidth} | |
425 | \setlength{\headerphotowidth}{0.24\textwidth} | |
426 | }% | |
427 | \begin{minipage}[c]{\headerphotowidth}% | |
428 | \ifthenelse{\equal{\@photoalign}{left}}{\raggedright\drawphoto}{} | |
429 | \end{minipage} | |
430 | \begin{minipage}[c]{\headertextwidth} | |
431 | \ifthenelse{\equal{#1}{L}}{\raggedright}{\ifthenelse{\equal{#1}{R}}{\raggedleft}{\centering}} | |
432 | \headerfirstnamestyle{\@firstname}\headerlastnamestyle{{}\acvHeaderNameDelim\@lastname}% | |
433 | \\[\acvHeaderAfterNameSkip]% | |
434 | \ifthenelse{\isundefined{\@position}}{}{\headerpositionstyle{\@position\\[\acvHeaderAfterPositionSkip]}}% | |
435 | \ifthenelse{\isundefined{\@address}}{}{\headeraddressstyle{\@address\\[\acvHeaderAfterAddressSkip]}}% | |
436 | \headersocialstyle{% | |
437 | \newbool{isstart}% | |
438 | \setbool{isstart}{true}% | |
439 | \ifthenelse{\isundefined{\@mobile}}% | |
440 | {}% | |
441 | {% | |
442 | \faMobile\acvHeaderIconSep\@mobile% | |
443 | \setbool{isstart}{false}% | |
444 | }% | |
445 | \ifthenelse{\isundefined{\@email}}% | |
446 | {}% | |
447 | {% | |
448 | \ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}% | |
449 | \href{mailto:\@email}{\faEnvelope\acvHeaderIconSep\@email}% | |
450 | }% | |
451 | \ifthenelse{\isundefined{\@homepage}}% | |
452 | {}% | |
453 | {% | |
454 | \ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}% | |
455 | \href{http://\@homepage}{\faHome\acvHeaderIconSep\@homepage}% | |
456 | }% | |
457 | \ifthenelse{\isundefined{\@github}}% | |
458 | {}% | |
459 | {% | |
460 | \ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}% | |
461 | \href{https://github.com/\@github}{\faGithubSquare\acvHeaderIconSep\@github}% | |
462 | }% | |
463 | \ifthenelse{\isundefined{\@gitlab}}% | |
464 | {}% | |
465 | {% | |
466 | \ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}% | |
467 | \href{https://gitlab.com/\@gitlab}{\faGitlab\acvHeaderIconSep\@gitlab}% | |
468 | }% | |
469 | \ifthenelse{\isundefined{\@stackoverflowid}}% | |
470 | {}% | |
471 | {% | |
472 | \ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}% | |
473 | \href{https://stackoverflow.com/users/\@stackoverflowid}{\faStackOverflow\acvHeaderIconSep\@stackoverflowname}% | |
474 | }% | |
475 | \ifthenelse{\isundefined{\@linkedin}}% | |
476 | {}% | |
477 | {% | |
478 | \ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}% | |
479 | \href{https://www.linkedin.com/in/\@linkedin}{\faLinkedinSquare\acvHeaderIconSep\@linkedin}% | |
480 | }% | |
481 | \ifthenelse{\isundefined{\@twitter}}% | |
482 | {}% | |
483 | {% | |
484 | \ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}% | |
485 | \href{https://twitter.com/\@twitter}{\faTwitter\acvHeaderIconSep\@twitter}% | |
486 | }% | |
487 | \ifthenelse{\isundefined{\@skype}}% | |
488 | {}% | |
489 | {% | |
490 | \ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}% | |
491 | \faSkype\acvHeaderIconSep\@skype% | |
492 | }% | |
493 | \ifthenelse{\isundefined{\@reddit}}% | |
494 | {}% | |
495 | {% | |
496 | \ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}% | |
497 | \href{https://www.reddit.com/user/\@reddit}{\faReddit\acvHeaderIconSep\@reddit}% | |
498 | }% | |
499 | \ifthenelse{\isundefined{\@xing}}% | |
500 | {}% | |
501 | {% | |
502 | \ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}% | |
503 | \href{https://www.xing.com/profile/\@xing}{\faXingSquare\acvHeaderIconSep\@xing} | |
504 | }% | |
505 | \ifthenelse{\isundefined{\@extrainfo}}% | |
506 | {}% | |
507 | {% | |
508 | \ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}% | |
509 | \@extrainfo% | |
510 | }% | |
511 | } \\[\acvHeaderAfterSocialSkip]% | |
512 | \ifthenelse{\isundefined{\@quote}}% | |
513 | {}% | |
514 | {\headerquotestyle{\@quote\\}\vspace{\acvHeaderAfterQuoteSkip}}% | |
515 | \end{minipage}% | |
516 | \begin{minipage}[c]{\headerphotowidth}% | |
517 | \ifthenelse{\equal{\@photoalign}{right}}{\raggedleft\drawphoto}{} | |
518 | \end{minipage} | |
519 | } | |
520 | ||
521 | % Define a footer for CV | |
522 | % Usage: \makecvfooter{<left>}{<center>}{<right>} | |
523 | \newcommand*{\makecvfooter}[3]{% | |
524 | \fancyfoot{} | |
525 | \fancyfoot[L]{\footerstyle{#1}} | |
526 | \fancyfoot[C]{\footerstyle{#2}} | |
527 | \fancyfoot[R]{\footerstyle{#3}} | |
528 | } | |
529 | ||
530 | % Define a section for CV | |
531 | % Usage: \cvsection{<section-title>} | |
532 | \newcommand{\cvsection}[1]{% | |
533 | \vspace{\acvSectionTopSkip} | |
534 | \sectionstyle{#1} | |
535 | \phantomsection | |
536 | \color{gray}\vhrulefill{0.9pt} | |
537 | } | |
538 | ||
539 | % Define a subsection for CV | |
540 | % Usage: \cvsubsection{<subsection-title>} | |
541 | \newcommand{\cvsubsection}[1]{% | |
542 | \vspace{\acvSectionContentTopSkip} | |
543 | \vspace{-3mm} | |
544 | \subsectionstyle{#1} | |
545 | \phantomsection | |
546 | } | |
547 | ||
548 | % Define a paragraph for CV | |
549 | \newenvironment{cvparagraph}{% | |
550 | \vspace{\acvSectionContentTopSkip} | |
551 | \vspace{-3mm} | |
552 | \paragraphstyle | |
553 | }{% | |
554 | \par | |
555 | \vspace{2mm} | |
556 | } | |
557 | ||
558 | % Define an environment for cventry | |
559 | \newenvironment{cventries}{% | |
560 | \vspace{\acvSectionContentTopSkip} | |
561 | \begin{center} | |
562 | }{% | |
563 | \end{center} | |
564 | } | |
565 | % Define an entry of cv information | |
566 | % Usage: \cventry{<position>}{<title>}{<location>}{<date>}{<description>} | |
567 | \newcommand*{\cventry}[5]{% | |
568 | \vspace{-2.0mm} | |
569 | \setlength\tabcolsep{0pt} | |
570 | \setlength{\extrarowheight}{0pt} | |
571 | \begin{tabular*}{\textwidth}{@{\extracolsep{\fill}} L{\textwidth - 4.5cm} R{4.5cm}} | |
572 | \ifempty{#2#3} | |
573 | {\entrypositionstyle{#1} & \entrydatestyle{#4} \\} | |
574 | {\entrytitlestyle{#2} & \entrylocationstyle{#3} \\ | |
575 | \entrypositionstyle{#1} & \entrydatestyle{#4} \\} | |
576 | \multicolumn{2}{L{\textwidth}}{\descriptionstyle{#5}} | |
577 | \end{tabular*}% | |
578 | } | |
579 | ||
580 | % Define an environment for cvsubentry | |
581 | \newenvironment{cvsubentries}{% | |
582 | \begin{center} | |
583 | }{% | |
584 | \end{center} | |
585 | } | |
586 | % Define a subentry of cv information | |
587 | % Usage: \cvsubentry{<position>}{<title>}{<date>}{<description>} | |
588 | \newcommand*{\cvsubentry}[4]{% | |
589 | \setlength\tabcolsep{0pt} | |
590 | \setlength{\extrarowheight}{0pt} | |
591 | \begin{tabular*}{\textwidth}{@{\extracolsep{\fill}} L{\textwidth - 4.5cm} R{4.5cm}} | |
592 | \setlength\leftskip{0.2cm} | |
593 | \subentrytitlestyle{#2} & \ifthenelse{\equal{#1}{}} | |
594 | {\subentrydatestyle{#3}}{} | |
595 | \ifthenelse{\equal{#1}{}} | |
596 | {} | |
597 | {\subentrypositionstyle{#1} & \subentrydatestyle{#3} \\} | |
598 | \ifthenelse{\equal{#4}{}} | |
599 | {} | |
600 | {\multicolumn{2}{L{17.0cm}}{\subdescriptionstyle{#4}} \\} | |
601 | \end{tabular*} | |
602 | } | |
603 | ||
604 | % Define an environment for cvhonor | |
605 | \newenvironment{cvhonors}{% | |
606 | \vspace{\acvSectionContentTopSkip} | |
607 | \vspace{-2mm} | |
608 | \begin{center} | |
609 | \setlength\tabcolsep{0pt} | |
610 | \setlength{\extrarowheight}{0pt} | |
611 | \begin{tabular*}{\textwidth}{@{\extracolsep{\fill}} C{1.5cm} L{\textwidth - 4.0cm} R{2.5cm}} | |
612 | }{% | |
613 | \end{tabular*} | |
614 | \end{center} | |
615 | } | |
616 | % Define a line of cv information(honor, award or something else) | |
617 | % Usage: \cvhonor{<position>}{<title>}{<location>}{<date>} | |
618 | \newcommand*{\cvhonor}[4]{% | |
619 | \honordatestyle{#4} & \honorpositionstyle{#1}, \honortitlestyle{#2} & \honorlocationstyle{#3} \\ | |
620 | } | |
621 | ||
622 | % Define an environment for cvskill | |
623 | \newenvironment{cvskills}{% | |
624 | \vspace{\acvSectionContentTopSkip} | |
625 | \vspace{-2.0mm} | |
626 | \begin{center} | |
627 | \setlength\tabcolsep{1ex} | |
628 | \setlength{\extrarowheight}{0pt} | |
629 | \begin{tabular*}{\textwidth}{@{\extracolsep{\fill}} r L{\textwidth * \real{0.9}}} | |
630 | }{% | |
631 | \end{tabular*} | |
632 | \end{center} | |
633 | } | |
634 | % Define a line of cv information(skill) | |
635 | % Usage: \cvskill{<type>}{<skillset>} | |
636 | \newcommand*{\cvskill}[2]{% | |
637 | \skilltypestyle{#1} & \skillsetstyle{#2} \\ | |
638 | } | |
639 | ||
640 | % Define an environment for cvitems(for cventry) | |
641 | \newenvironment{cvitems}{% | |
642 | \vspace{-4.0mm} | |
643 | \begin{justify} | |
644 | \begin{itemize}[leftmargin=2ex, nosep, noitemsep] | |
645 | \setlength{\parskip}{0pt} | |
646 | \renewcommand{\labelitemi}{\bullet} | |
647 | }{% | |
648 | \end{itemize} | |
649 | \end{justify} | |
650 | \vspace{-4.0mm} | |
651 | } | |
652 | ||
653 | ||
654 | %------------------------------------------------------------------------------- | |
655 | % Commands for elements of Cover Letter | |
656 | %------------------------------------------------------------------------------- | |
657 | % Define an environment for cvletter | |
658 | \newenvironment{cvletter}{% | |
659 | \lettertextstyle | |
660 | }{% | |
661 | } | |
662 | ||
663 | % Define a section for the cover letter | |
664 | % Usage: \lettersection{<section-title>} | |
665 | \newcommand{\lettersection}[1]{% | |
666 | \par\addvspace{2.5ex} | |
667 | \phantomsection{} | |
668 | \lettersectionstyle{#1} | |
669 | \color{gray}\vhrulefill{0.9pt} | |
670 | \par\nobreak\addvspace{0.4ex} | |
671 | } | |
672 | ||
673 | % Define a title of the cover letter | |
674 | % Usage: \makelettertitle | |
675 | \newcommand*{\makelettertitle}{% | |
676 | \vspace{8.4mm} | |
677 | \setlength\tabcolsep{0pt} | |
678 | \setlength{\extrarowheight}{0pt} | |
679 | \begin{tabular*}{\textwidth}{@{\extracolsep{\fill}} L{\textwidth - 4.5cm} R{4.5cm}} | |
680 | \recipienttitlestyle{\@recipientname} & \letterdatestyle{\@letterdate} | |
681 | \end{tabular*} | |
682 | \begin{singlespace} | |
683 | \recipientaddressstyle{\@recipientaddress} \\\\ | |
684 | \end{singlespace} | |
685 | \ifthenelse{\isundefined{\@lettertitle}} | |
686 | {} | |
687 | {\lettertitlestyle{\@lettertitle} \\} | |
688 | \lettertextstyle{\@letteropening} | |
689 | } | |
690 | ||
691 | % Define a closing of the cover letter | |
692 | % Usage: \makeletterclosing | |
693 | \newcommand*{\makeletterclosing}{% | |
694 | \vspace{3.4mm} | |
695 | \lettertextstyle{\@letterclosing} \\\\ | |
696 | \letternamestyle{\@firstname\ \@lastname} | |
697 | \ifthenelse{\isundefined{\@letterenclosure}} | |
698 | {\\} | |
699 | {% | |
700 | \\\\\\ | |
701 | \letterenclosurestyle{\@letterenclname: \@letterenclosure} \\ | |
702 | } | |
703 | } |