@jaimanm/resumake 1.0.0 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/.github/workflows/npm-publish.yml +0 -2
  2. package/CONTRIBUTING.md +14 -1
  3. package/package.json +5 -1
  4. package/src/commands/config.js +5 -2
  5. package/src/commands/setup.js +6 -4
  6. package/src/index.js +4 -2
  7. package/templates/awesome-cv/.github/workflows/build-resume.yml +65 -0
  8. package/templates/awesome-cv/README.md +1 -0
  9. package/templates/awesome-cv/awesome-cv.cls +885 -0
  10. package/templates/awesome-cv/build_all.sh +12 -0
  11. package/templates/awesome-cv/cv/certificates.tex +111 -0
  12. package/templates/awesome-cv/cv/committees.tex +48 -0
  13. package/templates/awesome-cv/cv/education.tex +25 -0
  14. package/templates/awesome-cv/cv/experience.tex +186 -0
  15. package/templates/awesome-cv/cv/extracurricular.tex +81 -0
  16. package/templates/awesome-cv/cv/honors.tex +181 -0
  17. package/templates/awesome-cv/cv/presentation.tex +50 -0
  18. package/templates/awesome-cv/cv/skills.tex +38 -0
  19. package/templates/awesome-cv/cv/writing.tex +37 -0
  20. package/templates/awesome-cv/cv.tex +114 -0
  21. package/templates/jakes-cv/.github/workflows/build-resume.yml +65 -0
  22. package/templates/jakes-cv/README.md +29 -0
  23. package/templates/jakes-cv/build_all.sh +22 -0
  24. package/templates/jakes-cv/cv-sections/certificates.tex +8 -0
  25. package/templates/jakes-cv/cv-sections/committees.tex +19 -0
  26. package/templates/jakes-cv/cv-sections/education.tex +10 -0
  27. package/templates/jakes-cv/cv-sections/experience.tex +22 -0
  28. package/templates/jakes-cv/cv-sections/extracurricular.tex +20 -0
  29. package/templates/jakes-cv/cv-sections/honors.tex +10 -0
  30. package/templates/jakes-cv/cv-sections/presentation.tex +19 -0
  31. package/templates/jakes-cv/cv-sections/projects.tex +15 -0
  32. package/templates/jakes-cv/cv-sections/skills.tex +10 -0
  33. package/templates/jakes-cv/cv-sections/writing.tex +19 -0
  34. package/templates/jakes-cv/cv.tex +174 -0
  35. package/templates/jakes-cv/fonts/Roboto-Bold.ttf +0 -0
  36. package/templates/jakes-cv/fonts/Roboto-BoldItalic.ttf +0 -0
  37. package/templates/jakes-cv/fonts/Roboto-Italic.ttf +0 -0
  38. package/templates/jakes-cv/fonts/Roboto-Light.ttf +0 -0
  39. package/templates/jakes-cv/fonts/Roboto-LightItalic.ttf +0 -0
  40. package/templates/jakes-cv/fonts/Roboto-Medium.ttf +0 -0
  41. package/templates/jakes-cv/fonts/Roboto-MediumItalic.ttf +0 -0
  42. package/templates/jakes-cv/fonts/Roboto-Regular.ttf +0 -0
  43. package/templates/jakes-cv/fonts/Roboto-Thin.ttf +0 -0
  44. package/templates/jakes-cv/fonts/Roboto-ThinItalic.ttf +0 -0
  45. package/templates/jakes-resume/.github/workflows/build-resume.yml +65 -0
  46. package/templates/jakes-resume/README.md +1 -0
  47. package/templates/jakes-resume/build_all.sh +7 -0
  48. package/templates/jakes-resume/resume.tex +218 -0
  49. package/templates/modular-multi/.github/workflows/build-resume.yml +65 -0
  50. package/templates/modular-multi/README.md +1 -0
  51. package/templates/modular-multi/build_all.sh +23 -0
  52. package/templates/modular-multi/resume_aiml.tex +5 -0
  53. package/templates/modular-multi/resume_backend.tex +5 -0
  54. package/templates/modular-multi/resume_content.tex +136 -0
  55. package/templates/modular-multi/resume_preamble.tex +87 -0
  56. package/templates/modular-multi/resume_quantum.tex +5 -0
  57. package/templates/modular-multi/test.txt +80 -0
  58. package/tests/index.test.js +22 -90
  59. package/tests/setup.test.js +8 -4
@@ -0,0 +1,885 @@
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
+ \RequirePackage{tabularx}
52
+ % Needed to handle list environment
53
+ \RequirePackage{enumitem}
54
+ % Needed to handle text alignment
55
+ \RequirePackage{ragged2e}
56
+ % Needed to configure page layout
57
+ \RequirePackage{geometry}
58
+ % Needed to make header & footer efficiently
59
+ \RequirePackage{fancyhdr}
60
+ % Needed to manage colors
61
+ \RequirePackage{xcolor}
62
+ % Needed to use \ifxetex-\else-\fi statement
63
+ \RequirePackage{ifxetex}
64
+ % Needed to use \if-\then-\else statement
65
+ \RequirePackage{xifthen}
66
+ % Needed to strip chars from telephone number
67
+ \RequirePackage{xstring}
68
+ % Needed to use a toolbox of programming tools
69
+ \RequirePackage{etoolbox}
70
+ % Needed to change line spacing in specific environment
71
+ \RequirePackage{setspace}
72
+ % Needed to manage fonts
73
+ \RequirePackage[quiet]{fontspec}
74
+ % To support LaTeX quoting style
75
+ \defaultfontfeatures{Ligatures=TeX}
76
+ % Needed to manage math fonts
77
+ \RequirePackage{unicode-math}
78
+ % Needed to use icons from font-awesome
79
+ \RequirePackage{fontawesome5}
80
+ \RequirePackage{accsupp}
81
+ \defaultfontfeatures{
82
+ Renderer=HarfBuzz,
83
+ }
84
+ \setmainfont{SourceSansPro}[
85
+ Extension = .otf,
86
+ UprightFont = *-Regular,
87
+ ItalicFont = *-RegularIt,
88
+ BoldFont = *-Bold,
89
+ BoldItalicFont = *-BoldIt,
90
+ FontFace={l}{n}{Font=*-Light},
91
+ FontFace={l}{it}{Font=*-LightIt},
92
+ ]
93
+ \setsansfont{SourceSansPro}[
94
+ Extension = .otf,
95
+ UprightFont = *-Regular,
96
+ ItalicFont = *-RegularIt,
97
+ BoldFont = *-Bold,
98
+ BoldItalicFont = *-BoldIt,
99
+ FontFace={l}{n}{Font=*-Light},
100
+ FontFace={l}{it}{Font=*-LightIt},
101
+ ]
102
+ \newfontfamily\roboto{Roboto}[
103
+ Extension = .otf,
104
+ UprightFont = *-Regular,
105
+ ItalicFont = *-Italic,
106
+ BoldFont = *-Bold,
107
+ BoldItalicFont = *-BoldItalic,
108
+ FontFace={l}{n}{Font=*-Light},
109
+ FontFace={l}{it}{Font=*-LightItalic},
110
+ ]
111
+ % Needed for the photo ID
112
+ \RequirePackage[skins]{tcolorbox}
113
+ % Needed to deal a paragraphs
114
+ \RequirePackage{parskip}
115
+ % Needed to deal hyperlink
116
+ \RequirePackage[hidelinks,unicode,pdfpagelabels=false]{hyperref}
117
+ \hypersetup{%
118
+ pdftitle={},
119
+ pdfauthor={},
120
+ pdfsubject={},
121
+ pdfkeywords={}
122
+ }
123
+ % Solves issues Warning: File `cv.out' has changed
124
+ \RequirePackage{bookmark}
125
+
126
+ %-------------------------------------------------------------------------------
127
+ % Configuration for directory locations
128
+ %-------------------------------------------------------------------------------
129
+ % Configure an optional directory location for fonts(default: 'fonts/')
130
+ % Not required anymore but left in place for backward compatability.
131
+ \newcommand*{\fontdir}[1][fonts/]{\def\@fontdir{#1}}
132
+
133
+ %-------------------------------------------------------------------------------
134
+ % Configuration for layout
135
+ %-------------------------------------------------------------------------------
136
+ %% Page Layout
137
+ % Configure page margins with geometry
138
+ \geometry{left=2.0cm, top=1.5cm, right=2.0cm, bottom=2.0cm, footskip=.5cm}
139
+
140
+ %% Header & Footer
141
+ % Set offset to each header and footer
142
+ \fancyhfoffset{0em}
143
+ % Remove head rule
144
+ \renewcommand{\headrulewidth}{0pt}
145
+ % Clear all header & footer fields
146
+ \fancyhf{}
147
+ % Enable if you want to make header or footer using fancyhdr
148
+ \pagestyle{fancy}
149
+
150
+
151
+ %-------------------------------------------------------------------------------
152
+ % Configuration for colors
153
+ %-------------------------------------------------------------------------------
154
+ % Gray-scale colors
155
+ \definecolor{white}{HTML}{FFFFFF}
156
+ \definecolor{black}{HTML}{000000}
157
+ \definecolor{darkgray}{HTML}{333333}
158
+ \definecolor{gray}{HTML}{5D5D5D}
159
+ \definecolor{lightgray}{HTML}{999999}
160
+ % Basic colors
161
+ \definecolor{green}{HTML}{C2E15F}
162
+ \definecolor{orange}{HTML}{FDA333}
163
+ \definecolor{purple}{HTML}{D3A4F9}
164
+ \definecolor{red}{HTML}{FB4485}
165
+ \definecolor{blue}{HTML}{6CE0F1}
166
+ % Text colors
167
+ \definecolor{darktext}{HTML}{414141}
168
+ \colorlet{text}{darkgray}
169
+ \colorlet{graytext}{gray}
170
+ \colorlet{lighttext}{lightgray}
171
+ \colorlet{sectiondivider}{gray}
172
+ % Awesome colors
173
+ \definecolor{awesome-emerald}{HTML}{00A388}
174
+ \definecolor{awesome-skyblue}{HTML}{0395DE}
175
+ \definecolor{awesome-red}{HTML}{DC3522}
176
+ \definecolor{awesome-pink}{HTML}{EF4089}
177
+ \definecolor{awesome-orange}{HTML}{FF6138}
178
+ \definecolor{awesome-nephritis}{HTML}{27AE60}
179
+ \definecolor{awesome-concrete}{HTML}{95A5A6}
180
+ \definecolor{awesome-darknight}{HTML}{131A28}
181
+ \colorlet{awesome}{awesome-red}
182
+
183
+ % Boolean value to switch section color highlighting
184
+ \newbool{acvSectionColorHighlight}
185
+ \setbool{acvSectionColorHighlight}{true}
186
+
187
+ %-------------------------------------------------------------------------------
188
+ % Configuration for fonts
189
+ %-------------------------------------------------------------------------------
190
+ \newcommand*{\headerfont}{\roboto\selectfont}
191
+ \newcommand*{\headerfontlight}{\roboto\fontseries{l}\selectfont}
192
+ \newcommand*{\footerfont}{\sffamily}
193
+ \newcommand*{\bodyfont}{\sffamily}
194
+ \newcommand*{\bodyfontlight}{\sffamily\fontseries{l}\selectfont}
195
+
196
+ %-------------------------------------------------------------------------------
197
+ % Configuration for styles
198
+ %-------------------------------------------------------------------------------
199
+ % Configure styles for each CV elements
200
+ % For fundamental structures
201
+ \newcommand*{\headerfirstnamestyle}[1]{{\fontsize{32pt}{1em}\headerfontlight\color{graytext} #1}}
202
+ \newcommand*{\headerlastnamestyle}[1]{{\fontsize{32pt}{1em}\headerfont\bfseries\color{text} #1}}
203
+ \newcommand*{\headerpositionstyle}[1]{{\fontsize{7.6pt}{1em}\bodyfont\scshape\color{awesome} #1}}
204
+ \newcommand*{\headeraddressstyle}[1]{{\fontsize{8pt}{1em}\headerfont\itshape\color{lighttext} #1}}
205
+ \newcommand*{\headersocialstyle}[1]{{\fontsize{6.8pt}{1em}\headerfont\color{text} #1}}
206
+ \newcommand*{\headerquotestyle}[1]{{\fontsize{9pt}{1em}\bodyfont\itshape\color{darktext} #1}}
207
+ \newcommand*{\footerstyle}[1]{{\fontsize{8pt}{1em}\footerfont\scshape\color{lighttext} #1}}
208
+ \newcommand*{\sectionstyleface}[1]{{\fontsize{16pt}{1em}\bodyfont\bfseries #1}}
209
+ \newcommand*{\sectionstyle}[1]{%
210
+ \def\@acvSectionTmp{#1}
211
+ \ifthenelse{\boolean{acvSectionColorHighlight}}{%
212
+ \StrSplit{\@acvSectionTmp}{3}{\acvSectionStringAwesome}{\acvSectionStringPlain}%
213
+ \color{awesome}\sectionstyleface{\acvSectionStringAwesome%
214
+ \color{text}{\acvSectionStringPlain}}}%
215
+ {\color{text}\sectionstyleface{\@acvSectionTmp}}}
216
+ \newcommand*{\subsectionstyle}[1]{{\fontsize{12pt}{1em}\bodyfont\scshape\textcolor{text}{#1}}}
217
+ \newcommand*{\paragraphstyle}{\fontsize{9pt}{1em}\bodyfontlight\upshape\color{text}}
218
+
219
+ % For elements of entry
220
+ \newcommand*{\entrytitlestyle}[1]{{\fontsize{10pt}{1em}\bodyfont\bfseries\color{darktext} #1}}
221
+ \newcommand*{\entrypositionstyle}[1]{{\fontsize{8pt}{1em}\bodyfont\scshape\color{graytext} #1}}
222
+ \newcommand*{\entrydatestyle}[1]{{\fontsize{8pt}{1em}\bodyfontlight\slshape\color{graytext} #1}}
223
+ \newcommand*{\entrylocationstyle}[1]{{\fontsize{9pt}{1em}\bodyfontlight\slshape\color{awesome} #1}}
224
+ \newcommand*{\descriptionstyle}[1]{{\fontsize{9pt}{1em}\bodyfontlight\upshape\color{text} #1}}
225
+
226
+ % For elements of subentry
227
+ \newcommand*{\subentrytitlestyle}[1]{{\fontsize{8pt}{1em}\bodyfont\mdseries\color{graytext} #1}}
228
+ \newcommand*{\subentrypositionstyle}[1]{{\fontsize{7pt}{1em}\bodyfont\scshape\color{graytext} #1}}
229
+ \newcommand*{\subentrydatestyle}[1]{{\fontsize{7pt}{1em}\bodyfontlight\slshape\color{graytext} #1}}
230
+ \newcommand*{\subentrylocationstyle}[1]{{\fontsize{7pt}{1em}\bodyfontlight\slshape\color{awesome} #1}}
231
+ \newcommand*{\subdescriptionstyle}[1]{{\fontsize{8pt}{1em}\bodyfontlight\upshape\color{text} #1}}
232
+
233
+ % For elements of honor
234
+ \newcommand*{\honortitlestyle}[1]{{\fontsize{9pt}{1em}\bodyfont\color{graytext} #1}}
235
+ \newcommand*{\honorpositionstyle}[1]{{\fontsize{9pt}{1em}\bodyfont\bfseries\color{darktext} #1}}
236
+ \newcommand*{\honordatestyle}[1]{{\fontsize{9pt}{1em}\bodyfont\color{graytext} #1}}
237
+ \newcommand*{\honorlocationstyle}[1]{{\fontsize{9pt}{1em}\bodyfontlight\slshape\color{awesome} #1}}
238
+
239
+ % For elements of skill
240
+ \newcommand*{\skilltypestyle}[1]{{\fontsize{10pt}{1em}\bodyfont\bfseries\color{darktext} #1}}
241
+ \newcommand*{\skillsetstyle}[1]{{\fontsize{9pt}{1em}\bodyfontlight\color{text} #1}}
242
+
243
+ % For elements of the cover letter
244
+ \newcommand*{\lettersectionstyleface}[1]{{\fontsize{14pt}{1em}\bodyfont\bfseries #1}}
245
+ \newcommand*{\lettersectionstyle}[1]{%
246
+ \def\@acvLetterSectionTmp{#1}
247
+ \ifthenelse{\boolean{acvSectionColorHighlight}}{%
248
+ \StrSplit{\@acvLetterSectionTmp}{3}{\acvLetterSectionStringAwesome}{\acvLetterSectionStringPlain}%
249
+ \color{awesome}\sectionstyleface{\acvLetterSectionStringAwesome%
250
+ \color{text}{\acvLetterSectionStringPlain}}}%
251
+ {\color{text}\lettersectionstyleface{\@acvLetterSectionTmp}}}
252
+ \newcommand*{\recipientaddressstyle}[1]{{\fontsize{9pt}{1em}\bodyfont\scshape\color{graytext} #1}}
253
+ \newcommand*{\recipienttitlestyle}[1]{{\fontsize{11pt}{1em}\bodyfont\bfseries\color{darktext} #1}}
254
+ \newcommand*{\lettertitlestyle}[1]{{\fontsize{10pt}{1em}\bodyfontlight\bfseries\color{darktext} \underline{#1}}}
255
+ \newcommand*{\letterdatestyle}[1]{{\fontsize{9pt}{1em}\bodyfontlight\slshape\color{graytext} #1}}
256
+ \newcommand*{\lettertextstyle}{\fontsize{10pt}{1.4em}\bodyfontlight\upshape\color{graytext}}
257
+ \newcommand*{\letternamestyle}[1]{{\fontsize{10pt}{1em}\bodyfont\bfseries\color{darktext} #1}}
258
+ \newcommand*{\letterenclosurestyle}[1]{{\fontsize{10pt}{1em}\bodyfontlight\slshape\color{lighttext} #1}}
259
+
260
+
261
+ %-------------------------------------------------------------------------------
262
+ % Commands for personal information
263
+ %-------------------------------------------------------------------------------
264
+ % Define photo ID
265
+ % Usage: \photo[circle|rectangle,edge|noedge,left|right]{<path-to-image>}
266
+ \newcommand{\photo}[2][circle,edge,left]{%
267
+ \def\@photo{#2}
268
+ \@for\tmp:=#1\do{%
269
+ \ifthenelse{\equal{\tmp}{circle} \or \equal{\tmp}{rectangle}}%
270
+ {\let\@photoshape\tmp}{}%
271
+ \ifthenelse{\equal{\tmp}{edge} \or \equal{\tmp}{noedge}}%
272
+ {\let\@photoedge\tmp}{}%
273
+ \ifthenelse{\equal{\tmp}{left} \or \equal{\tmp}{right}}%
274
+ {\let\@photoalign\tmp}{}%
275
+ }%
276
+ }
277
+ \def\@photoshape{circle}
278
+ \def\@photoedge{edge}
279
+ \def\@photoalign{left}
280
+
281
+ % Define writer's name
282
+ % Usage: \name{<firstname>}{<lastname>}
283
+ % Usage: \firstname{<firstname>}
284
+ % Usage: \lastname{<lastname>}
285
+ % Usage: \familyname{<familyname>}
286
+ \newcommand*{\name}[2]{\def\@firstname{#1}\def\@lastname{#2}}
287
+ \newcommand*{\firstname}[1]{\def\@firstname{#1}}
288
+ \newcommand*{\lastname}[1]{\def\@lastname{#1}}
289
+ \newcommand*{\familyname}[1]{\def\@lastname{#1}}
290
+ \def\@familyname{\@lastname}
291
+
292
+ % Define writer's address
293
+ % Usage: \address{<address>}
294
+ \newcommand*{\address}[1]{\def\@address{#1}}
295
+
296
+ % Define writer's position
297
+ % Usage: \position{<position>}
298
+ \newcommand*{\position}[1]{\def\@position{#1}}
299
+
300
+ % Defines writer's mobile (optional)
301
+ % Usage: \mobile{<mobile number>}
302
+ \newcommand*{\mobile}[1]
303
+ {
304
+ \def\@mobile{#1}
305
+ \def\@teluri{tel:\@mobile}
306
+ % Strip unwanted characters
307
+ \StrDel{\@teluri}{ }[\@teluri]%
308
+ \StrDel{\@teluri}{-}[\@teluri]%
309
+ \StrDel{\@teluri}{(}[\@teluri]%
310
+ \StrDel{\@teluri}{)}[\@teluri]%
311
+ }
312
+
313
+ % Defines writer's WhatsApp (optional)
314
+ % Usage: \whatsapp{<mobile number>}
315
+ \newcommand*{\whatsapp}[1]
316
+ {
317
+ \def\@whatsapp{#1}
318
+ \def\@wameuri{https://wa.me/\@whatsapp}
319
+ % Strip unwanted characters
320
+ \StrDel{\@wameuri}{ }[\@wameuri]%
321
+ \StrDel{\@wameuri}{+}[\@wameuri]%
322
+ \StrDel{\@wameuri}{-}[\@wameuri]%
323
+ \StrDel{\@wameuri}{(}[\@wameuri]%
324
+ \StrDel{\@wameuri}{)}[\@wameuri]%
325
+ }
326
+
327
+ % Defines writer's email (optional)
328
+ % Usage: \email{<email address>}
329
+ \newcommand*{\email}[1]{\def\@email{#1}}
330
+
331
+ % Defines writer's date of birth (optional)
332
+ % Usage: \dateofbirth{<date>}
333
+ \newcommand*{\dateofbirth}[1]{\def\@dateofbirth{#1}}
334
+
335
+ % Defines writer's homepage (optional)
336
+ % Usage: \homepage{<url>}
337
+ \newcommand*{\homepage}[1]{\def\@homepage{#1}}
338
+
339
+ % Defines writer's github (optional)
340
+ % Usage: \github{<github-nick>}
341
+ \newcommand*{\github}[1]{\def\@github{#1}}
342
+
343
+ % Defines writer's gitlab (optional)
344
+ % Usage: \gitlab{<gitlab-nick>}
345
+ \newcommand*{\gitlab}[1]{\def\@gitlab{#1}}
346
+
347
+ % Defines writer's bitbucket (optional)
348
+ % Usage: \bitbucket{<bitbucket-nick>}
349
+ \newcommand*{\bitbucket}[1]{\def\@bitbucket{#1}}
350
+
351
+ % Defines writer's stackoverflow profile (optional)
352
+ % Usage: \stackoverflow{<so userid>}{<so username>}
353
+ % e.g.https://stackoverflow.com/users/123456/sam-smith
354
+ % would be \stackoverflow{123456}{sam-smith}
355
+ \newcommand*{\stackoverflow}[2]{\def\@stackoverflowid{#1}\def\@stackoverflowname{#2}}
356
+
357
+ % Defines writer's linked-in (optional)
358
+ % Usage: \linkedin{<linked-in-nick>}
359
+ \newcommand*{\linkedin}[1]{\def\@linkedin{#1}}
360
+
361
+ % Defines writer's orcid (optional)
362
+ % Usage: \orcid{<orcid-num>}
363
+ \newcommand*{\orcid}[1]{\def\@orcid{#1}}
364
+
365
+ % Defines writer's twitter (optional)
366
+ % Usage: \twitter{<twitter handle>}
367
+ \newcommand*{\twitter}[1]{\def\@twitter{#1}}
368
+
369
+ % Defines writer's x (formerly twitter) (optional)
370
+ % Usage: \x{<x account>}
371
+ \newcommand*{\x}[1]{\def\@x{#1}}
372
+
373
+ % Defines writer's Mastodon (optional)
374
+ % Usage: \mastodon{<instance>}{<mastodon-nick>}
375
+ \newcommand*{\mastodon}[2]{\def\@mastodoninstance{#1}\def\@mastodonname{#2}}
376
+
377
+ % Defines writer's resarchgate (optional)
378
+ % Usage: \researchgate{<researchgate-account>}
379
+ \newcommand*{\researchgate}[1]{\def\@researchgate{#1}}
380
+
381
+ % Defines writer's skype (optional)
382
+ % Usage: \skype{<skype account>}
383
+ \newcommand*{\skype}[1]{\def\@skype{#1}}
384
+
385
+ % Defines writer's reddit (optional)
386
+ % Usage: \reddit{<reddit account>}
387
+ \newcommand*{\reddit}[1]{\def\@reddit{#1}}
388
+
389
+ % Defines writer's xing (optional)
390
+ % Usage: \xing{<xing name>}
391
+ \newcommand*{\xing}[1]{\def\@xing{#1}}
392
+
393
+ % Defines writer's medium profile (optional)
394
+ % Usage: \medium{<medium account>}
395
+ \newcommand*{\medium}[1]{\def\@medium{#1}}
396
+
397
+ % Defines writer's kaggle (optional)
398
+ % Usage: \kaggle{<kaggle handle>}
399
+ \newcommand*{\kaggle}[1]{\def\@kaggle{#1}}
400
+
401
+ % Defines writer's Hackerrank (optional)
402
+ % Usage: \hackerrank{<Hackerrank profile name>}
403
+ \newcommand*{\hackerrank}[1]{\def\@hackerrank{#1}}
404
+
405
+ % Defines writer's Telegram (optional)
406
+ % Usage: \telegram{<Telegram username>}
407
+ \newcommand*{\telegram}[1]{\def\@telegram{#1}}
408
+
409
+ % Defines writer's google scholar profile (optional)
410
+ % Usage: \googlescholar{<googlescholar userid>}{<googlescholar username>}
411
+ % e.g.https://scholar.google.co.uk/citations?user=wpZDx1cAAAAJ
412
+ % would be \googlescholar{wpZDx1cAAAAJ}{Name-to-display-next-icon}
413
+ % If 'googlescholar-name' is not provided than it defaults to
414
+ % '\firstname \lastname'
415
+ \newcommand*{\googlescholar}[2]{%
416
+ \def\@googlescholarid{#1}%
417
+ \ifthenelse{\equal{#2}{}}{%
418
+ \def\@googlescholarname{\@firstname~\@lastname}%
419
+ }{%
420
+ \def\@googlescholarname{#2}%
421
+ }%
422
+ }
423
+
424
+ % Defines writer's extra information (optional)
425
+ % Usage: \extrainfo{<extra information>}
426
+ \newcommand*{\extrainfo}[1]{\def\@extrainfo{#1}}
427
+
428
+ % Defines writer's quote (optional)
429
+ % Usage: \quote{<quote>}
430
+ \renewcommand*{\quote}[1]{\def\@quote{#1}}
431
+
432
+ % Defines recipient's information (cover letter only)
433
+ % Usage: \recipient{<recipient name>}{<recipient address>}
434
+ % Usage: \recipientname{<recipient name>}
435
+ % Usage: \recipientaddress{<recipient address>}
436
+ \newcommand*{\recipient}[2]{\def\@recipientname{#1}\def\@recipientaddress{#2}}
437
+ \newcommand*{\recipientname}[1]{\def\@recipientname{#1}}
438
+ \newcommand*{\recipientaddress}[1]{\def\@recipientaddress{#1}}
439
+
440
+ % Defines the title for letter (cover letter only, optional)
441
+ % Usage: \lettertitle{<title>}
442
+ \newcommand*{\lettertitle}[1]{\def\@lettertitle{#1}}
443
+
444
+ % Defines the date for letter (cover letter only)
445
+ % Usage: \letterdate{<date>}
446
+ \newcommand*{\letterdate}[1]{\def\@letterdate{#1}}
447
+
448
+ % Defines a message of opening for letter (cover letter only)
449
+ % Usage: \letteropening{<message>}
450
+ \newcommand*{\letteropening}[1]{\def\@letteropening{#1}}
451
+
452
+ % Defines a message of closing for letter (cover letter only)
453
+ % Usage: \letterclosing{<message>}
454
+ \newcommand*{\letterclosing}[1]{\def\@letterclosing{#1}}
455
+
456
+ % Defines an enclosure for letter (cover letter only, optional)
457
+ % Usage: \letterenclosure[<enclosure name>]{<enclosure>}
458
+ \newcommand*{\letterenclname}[1][Enclosure]{\def\@letterenclname{#1}}
459
+ \newcommand*{\letterenclosure}[2][]{%
460
+ % if an optional argument is provided, use it to redefine \enclname
461
+ \ifthenelse{\equal{#1}{}}{}{\def\@letterenclname{#1}}
462
+ \def\@letterenclosure{#2}
463
+ }
464
+
465
+
466
+ %-------------------------------------------------------------------------------
467
+ % Commands for extra
468
+ %-------------------------------------------------------------------------------
469
+ %% Define helper macros a user can change easily
470
+ % Header
471
+ \newcommand{\acvHeaderNameDelim}{\space}
472
+ \newcommand{\acvHeaderAfterNameSkip}{.4mm}
473
+ \newcommand{\acvHeaderAfterPositionSkip}{.4mm}
474
+ \newcommand{\acvHeaderAfterAddressSkip}{-.5mm}
475
+ \newcommand{\acvHeaderIconSep}{\space}
476
+ \newcommand{\acvHeaderSocialSep}{\BeginAccSupp{ActualText={}}\quad\textbar\quad\EndAccSupp{}}
477
+ \newcommand{\acvHeaderAfterSocialSkip}{6mm}
478
+ \newcommand{\acvHeaderAfterQuoteSkip}{5mm}
479
+
480
+ % Others
481
+ \newcommand{\acvSectionTopSkip}{3mm}
482
+ \newcommand{\acvSectionContentTopSkip}{2.5mm}
483
+
484
+
485
+ %-------------------------------------------------------------------------------
486
+ % Commands for utilities
487
+ %-------------------------------------------------------------------------------
488
+ % Use to align an element of tabular table
489
+ \renewcommand{\tabularxcolumn}{p}
490
+ \newcolumntype{L}[1]{>{\raggedright\let\newline\\\arraybackslash\hspace{0pt}}m{#1}}
491
+ \newcolumntype{C}[1]{>{\centering\let\newline\\\arraybackslash\hspace{0pt}}m{#1}}
492
+ \newcolumntype{R}[1]{>{\raggedleft\let\newline\\\arraybackslash\hspace{0pt}}m{#1}}
493
+
494
+ % Use to draw horizontal line with specific thickness
495
+ \def\vhrulefill#1{\leavevmode\leaders\hrule\@height#1\hfill \kern\z@}
496
+
497
+ % Use to execute conditional statements by checking empty string
498
+ \newcommand*{\ifempty}[3]{\ifthenelse{\isempty{#1}}{#2}{#3}}
499
+
500
+ \newcommand{\faAlt}[3]{%
501
+ \BeginAccSupp{ActualText={#1}}%
502
+ \mbox{#2\acvHeaderIconSep#3}%
503
+ \EndAccSupp{}%
504
+ }
505
+
506
+ %-------------------------------------------------------------------------------
507
+ % Commands for elements of CV structure
508
+ %-------------------------------------------------------------------------------
509
+ % Define a header for CV
510
+ % Usage: \makecvheader
511
+ \newcommand*{\makecvheader}[1][C]{%
512
+ \newcommand*{\drawphoto}{%
513
+ \ifthenelse{\isundefined{\@photo}}{}{%
514
+ \newlength{\photodim}
515
+ \ifthenelse{\equal{\@photoshape}{circle}}%
516
+ {\setlength{\photodim}{1.3cm}}%
517
+ {\setlength{\photodim}{1.8cm}}%
518
+ \ifthenelse{\equal{\@photoedge}{edge}}%
519
+ {\def\@photoborder{darkgray}}%
520
+ {\def\@photoborder{none}}%
521
+ \begin{tikzpicture}%
522
+ \node[\@photoshape, draw=\@photoborder, line width=0.3mm, inner sep=\photodim, fill overzoom image=\@photo] () {};
523
+ \end{tikzpicture}
524
+ }%
525
+ }
526
+ \newlength{\headertextwidth}
527
+ \newlength{\headerphotowidth}
528
+ \ifthenelse{\isundefined{\@photo}}{
529
+ \setlength{\headertextwidth}{\textwidth}
530
+ \setlength{\headerphotowidth}{0cm}
531
+ }{%
532
+ \setlength{\headertextwidth}{0.76\textwidth}
533
+ \setlength{\headerphotowidth}{0.24\textwidth}
534
+ }%
535
+ \begin{minipage}[c]{\headerphotowidth}%
536
+ \ifthenelse{\equal{\@photoalign}{left}}{\raggedright\drawphoto}{}
537
+ \end{minipage}
538
+ \begin{minipage}[c]{\headertextwidth}
539
+ \ifthenelse{\equal{#1}{L}}{\raggedright}{\ifthenelse{\equal{#1}{R}}{\raggedleft}{\centering}}
540
+ \headerfirstnamestyle{\@firstname}\headerlastnamestyle{{}\acvHeaderNameDelim\@lastname}%
541
+ \\[\acvHeaderAfterNameSkip]%
542
+ \ifthenelse{\isundefined{\@position}}{}{\headerpositionstyle{\@position\\[\acvHeaderAfterPositionSkip]}}%
543
+ \ifthenelse{\isundefined{\@address}}{}{\headeraddressstyle{\@address\\[\acvHeaderAfterAddressSkip]}}%
544
+ \headersocialstyle{%
545
+ \newbool{isstart}%
546
+ \setbool{isstart}{true}%
547
+ \ifthenelse{\isundefined{\@mobile}}%
548
+ {}%
549
+ {%
550
+ \href{\@teluri}{\faAlt{tel:\@mobile}{\faMobile}{\@mobile}}%
551
+ \setbool{isstart}{false}%
552
+ }%
553
+ \ifthenelse{\isundefined{\@whatsapp}}%
554
+ {}%
555
+ {%
556
+ \ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
557
+ \href{\@wameuri}{\faAlt{WhatsApp: \@whatsapp}{\faWhatsappSquare}{\@whatsapp}}%
558
+ }%
559
+ \ifthenelse{\isundefined{\@email}}%
560
+ {}%
561
+ {%
562
+ \ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
563
+ \href{mailto:\@email}{\faAlt{mailto:\@email}{\faEnvelope}{\@email}}%
564
+ }%
565
+ \ifthenelse{\isundefined{\@dateofbirth}}%
566
+ {}%
567
+ {%
568
+ \ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
569
+ \faAlt{DoB: \@dateofbirth}{\faBirthdayCake}{\@dateofbirth}%
570
+ }%
571
+ \ifthenelse{\isundefined{\@homepage}}%
572
+ {}%
573
+ {%
574
+ \ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
575
+ \href{\@homepage}{\faAlt{homepage: \@homepage}{\faHome}{\@homepage}}%
576
+ }%
577
+ \ifthenelse{\isundefined{\@github}}%
578
+ {}%
579
+ {%
580
+ \ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
581
+ \href{https://github.com/\@github}{\faAlt{GitHub: @\@github}{\faGithubSquare}{\@github}}%
582
+ }%
583
+ \ifthenelse{\isundefined{\@gitlab}}%
584
+ {}%
585
+ {%
586
+ \ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
587
+ \href{https://gitlab.com/\@gitlab}{\faAlt{GitLab: @\@gitlab}{\faGitlab}{\@gitlab}}%
588
+ }%
589
+ \ifthenelse{\isundefined{\@bitbucket}}%
590
+ {}%
591
+ {%
592
+ \ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
593
+ \href{https://bitbucket.com/\@bitbucket}{\faAlt{BitBucket: @\@bitbucket}{\faBitbucket}{\@bitbucket}}%
594
+ }%
595
+ \ifthenelse{\isundefined{\@stackoverflowid}}%
596
+ {}%
597
+ {%
598
+ \ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
599
+ \href{https://stackoverflow.com/users/\@stackoverflowid}{\faAlt{StackOverflow: @\@stackoverflowname}{\faStackOverflow}{\@stackoverflowname}}%
600
+ }%
601
+ \ifthenelse{\isundefined{\@linkedin}}%
602
+ {}%
603
+ {%
604
+ \ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
605
+ \href{https://www.linkedin.com/in/\@linkedin}{\faAlt{LinkedIn: /in/\@linkedin}{\faLinkedin}{\@linkedin}}%
606
+ }%
607
+ \ifthenelse{\isundefined{\@orcid}}%
608
+ {}%
609
+ {%
610
+ \ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
611
+ \href{https://orcid.org/\@orcid}{\faAlt{OrcID: \@orcid}{\faOrcid}{\@orcid}}%
612
+ }%
613
+ \ifthenelse{\isundefined{\@twitter}}%
614
+ {}%
615
+ {%
616
+ \ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
617
+ \href{https://twitter.com/\@twitter}{\faAlt{Twitter: @\@twitter}{\faTwitter}{\@twitter}}%
618
+ }%
619
+ \ifthenelse{\isundefined{\@x}}%
620
+ {}%
621
+ {%
622
+ \ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
623
+ \href{https://x.com/\@x}{\faAlt{X: @\@x}{\faTwitter}{\@x}}%
624
+ }%
625
+ \ifthenelse{\isundefined{\@mastodonname}}%
626
+ {}%
627
+ {%
628
+ \ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
629
+ \href{https://\@mastodoninstance/@\@mastodonname}{\faAlt{Mastodon: \@mastodonname{}@\@mastodoninstance}{\faMastodon}{\@mastodonname}}%
630
+ }%
631
+ \ifthenelse{\isundefined{\@skype}}%
632
+ {}%
633
+ {%
634
+ \ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
635
+ \faAlt{Skype: \@skype}{\faSkype}{\@skype}%
636
+ }%
637
+ \ifthenelse{\isundefined{\@reddit}}%
638
+ {}%
639
+ {%
640
+ \ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
641
+ \href{https://www.reddit.com/user/\@reddit}{\faAlt{Reddit: /u/\@reddit}{\faReddit}{\@reddit}}%
642
+ }%
643
+ \ifthenelse{\isundefined{\@researchgate}}%
644
+ {}%
645
+ {%
646
+ \ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
647
+ \href{https://www.researchgate.net/profile/\@researchgate}{\faAlt{ResearchGate: \@researchgate}{\faResearchgate}{\@researchgate}}%
648
+ }%
649
+ \ifthenelse{\isundefined{\@xing}}%
650
+ {}%
651
+ {%
652
+ \ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
653
+ \href{https://www.xing.com/profile/\@xing}{\faAlt{Xing: \@xing}{\faXingSquare}{\@xing}}
654
+ }%
655
+ \ifthenelse{\isundefined{\@medium}}%
656
+ {}%
657
+ {%
658
+ \ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
659
+ \href{https://medium.com/@\@medium}{\faAlt{Medium: @\@medium}{\faMedium}{\@medium}}%
660
+ }%
661
+ \ifthenelse{\isundefined{\@kaggle}}%
662
+ {}%
663
+ {%
664
+ \ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
665
+ \href{https://kaggle.com/\@kaggle}{\faAlt{Kaggle: \@kaggle}{\faKaggle}{\@kaggle}}%
666
+ }%
667
+ \ifthenelse{\isundefined{\@hackerrank}}%
668
+ {}%
669
+ {%
670
+ \ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
671
+ \href{https://www.hackerrank.com/\@hackerrank}{\faAlt{HackerRank: \@hackerrank}{\faHackerrank}{\@hackerrank}}%
672
+ }%
673
+ \ifthenelse{\isundefined{\@telegram}}%
674
+ {}%
675
+ {%
676
+ \ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
677
+ \href{https://t.me/\@telegram}{\faAlt{Telegram: \@telegram}{\faTelegram}{\@telegram}}%
678
+ }%
679
+ \ifthenelse{\isundefined{\@googlescholarid}}%
680
+ {}%
681
+ {%
682
+ \ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
683
+ \href{https://scholar.google.com/citations?user=\@googlescholarid}{\faAlt{Google Scholar: \@googlescholarid}{\faGraduationCap}{\@googlescholarname}}%
684
+ }%
685
+ \ifthenelse{\isundefined{\@extrainfo}}%
686
+ {}%
687
+ {%
688
+ \ifbool{isstart}{\setbool{isstart}{false}}{\acvHeaderSocialSep}%
689
+ \@extrainfo%
690
+ }%
691
+ } \\[\acvHeaderAfterSocialSkip]%
692
+ \ifthenelse{\isundefined{\@quote}}%
693
+ {}%
694
+ {\headerquotestyle{\@quote\\}\vspace{\acvHeaderAfterQuoteSkip}}%
695
+ \end{minipage}%
696
+ \begin{minipage}[c]{\headerphotowidth}%
697
+ \ifthenelse{\equal{\@photoalign}{right}}{\raggedleft\drawphoto}{}
698
+ \end{minipage}
699
+ }
700
+
701
+ % Define a footer for CV
702
+ % Usage: \makecvfooter{<left>}{<center>}{<right>}
703
+ \newcommand*{\makecvfooter}[3]{%
704
+ \fancyfoot{}
705
+ \fancyfoot[L]{\footerstyle{#1}}
706
+ \fancyfoot[C]{\footerstyle{#2}}
707
+ \fancyfoot[R]{\footerstyle{#3}}
708
+ }
709
+
710
+ % Define a section for CV
711
+ % Usage: \cvsection{<section-title>}
712
+ \newcommand{\cvsection}[1]{%
713
+ \vspace{\acvSectionTopSkip}
714
+ \sectionstyle{#1}
715
+ \phantomsection
716
+ \color{sectiondivider}\vhrulefill{0.9pt}
717
+ }
718
+
719
+ % Define a subsection for CV
720
+ % Usage: \cvsubsection{<subsection-title>}
721
+ \newcommand{\cvsubsection}[1]{%
722
+ \vspace{\acvSectionContentTopSkip}
723
+ \vspace{-3mm}
724
+ \subsectionstyle{#1}
725
+ \phantomsection
726
+ }
727
+
728
+ % Define a paragraph for CV
729
+ \newenvironment{cvparagraph}{%
730
+ \vspace{\acvSectionContentTopSkip}
731
+ \vspace{-3mm}
732
+ \paragraphstyle
733
+ }{%
734
+ \par
735
+ \vspace{2mm}
736
+ }
737
+
738
+ % Define an environment for cventry
739
+ \newenvironment{cventries}{%
740
+ \vspace{\acvSectionContentTopSkip}
741
+ \begin{center}
742
+ }{%
743
+ \end{center}
744
+ }
745
+ % Define an entry of cv information
746
+ % Usage: \cventry{<position>}{<title>}{<location>}{<date>}{<description>}
747
+ \newcommand*{\cventry}[5]{%
748
+ \vspace{-2.0mm}
749
+ \setlength\tabcolsep{0pt}
750
+ \setlength{\extrarowheight}{0pt}
751
+ \begin{tabular*}{\textwidth}{@{\extracolsep{\fill}} L{\textwidth - 4.5cm} R{4.5cm}}
752
+ \ifempty{#2#3}
753
+ {\entrypositionstyle{#1} & \entrydatestyle{#4} \\}
754
+ {\entrytitlestyle{#2} & \entrylocationstyle{#3} \\
755
+ \entrypositionstyle{#1} & \entrydatestyle{#4} \\}
756
+ \ifstrempty{#5}
757
+ {}
758
+ {\multicolumn{2}{L{\textwidth}}{\descriptionstyle{#5}} \\}
759
+ \end{tabular*}%
760
+ }
761
+
762
+ % Define an environment for cvsubentry
763
+ \newenvironment{cvsubentries}{%
764
+ \begin{center}
765
+ }{%
766
+ \end{center}
767
+ }
768
+ % Define a subentry of cv information
769
+ % Usage: \cvsubentry{<position>}{<title>}{<date>}{<description>}
770
+ \newcommand*{\cvsubentry}[4]{%
771
+ \setlength\tabcolsep{0pt}
772
+ \setlength{\extrarowheight}{0pt}
773
+ \begin{tabular*}{\textwidth}{@{\extracolsep{\fill}} L{\textwidth - 4.5cm} R{4.5cm}}
774
+ \setlength\leftskip{0.2cm}
775
+ \subentrytitlestyle{#2} & \ifthenelse{\equal{#1}{}}
776
+ {\subentrydatestyle{#3}}{}
777
+ \ifthenelse{\equal{#1}{}}
778
+ {}
779
+ {\subentrypositionstyle{#1} & \subentrydatestyle{#3} \\}
780
+ \ifthenelse{\equal{#4}{}}
781
+ {}
782
+ {\multicolumn{2}{L{17.0cm}}{\subdescriptionstyle{#4}} \\}
783
+ \end{tabular*}
784
+ }
785
+
786
+ % Define an environment for cvhonor
787
+ \newenvironment{cvhonors}{%
788
+ \vspace{\acvSectionContentTopSkip}
789
+ \vspace{-2mm}
790
+ \begin{center}
791
+ \setlength\tabcolsep{0pt}
792
+ \setlength{\extrarowheight}{0pt}
793
+ \begin{tabular*}{\textwidth}{@{\extracolsep{\fill}} C{1.5cm} L{\textwidth - 4.0cm} R{2.5cm}}
794
+ }{%
795
+ \end{tabular*}
796
+ \end{center}
797
+ }
798
+ % Define a line of cv information(honor, award or something else)
799
+ % Usage: \cvhonor{<position>}{<title>}{<location>}{<date>}
800
+ \newcommand*{\cvhonor}[4]{%
801
+ \honordatestyle{#4} & \honorpositionstyle{#1}\ifempty{#2}{}{,} \honortitlestyle{#2} & \honorlocationstyle{#3} \\
802
+ }
803
+
804
+ % Define an environment for cvskill
805
+ \newenvironment{cvskills}{%
806
+ \vspace{\acvSectionContentTopSkip}
807
+ \vspace{-2.0mm}
808
+ \setlength\tabcolsep{1ex}
809
+ \setlength{\extrarowheight}{0pt}
810
+ \tabularx{\textwidth}{r>{\raggedright\let\newline\\\arraybackslash\hspace{0pt}}X}
811
+ }{%
812
+ \endtabularx\par
813
+ }
814
+
815
+ % Define a line of cv information(skill)
816
+ % Usage: \cvskill{<type>}{<skillset>}
817
+ \newcommand*{\cvskill}[2]{%
818
+ \skilltypestyle{#1} & \leavevmode\skillsetstyle{#2} \\
819
+ }
820
+
821
+ % Define an environment for cvitems(for cventry)
822
+ \newenvironment{cvitems}{%
823
+ \vspace{-4.0mm}
824
+ \begin{justify}
825
+ \begin{itemize}[leftmargin=2ex, nosep, noitemsep]
826
+ \setlength{\parskip}{0pt}
827
+ \renewcommand{\labelitemi}{\bullet}
828
+ }{%
829
+ \end{itemize}
830
+ \end{justify}
831
+ \vspace{1.0mm}
832
+ }
833
+
834
+
835
+ %-------------------------------------------------------------------------------
836
+ % Commands for elements of Cover Letter
837
+ %-------------------------------------------------------------------------------
838
+ % Define an environment for cvletter
839
+ \newenvironment{cvletter}{%
840
+ \lettertextstyle
841
+ }{%
842
+ }
843
+
844
+ % Define a section for the cover letter
845
+ % Usage: \lettersection{<section-title>}
846
+ \newcommand{\lettersection}[1]{%
847
+ \par\addvspace{2.5ex}
848
+ \phantomsection{}
849
+ \lettersectionstyle{#1}
850
+ \color{sectiondivider}\vhrulefill{0.9pt}
851
+ \par\nobreak\addvspace{0.4ex}
852
+ \lettertextstyle
853
+ }
854
+
855
+ % Define a title of the cover letter
856
+ % Usage: \makelettertitle
857
+ \newcommand*{\makelettertitle}{%
858
+ \vspace{8.4mm}
859
+ \setlength\tabcolsep{0pt}
860
+ \setlength{\extrarowheight}{0pt}
861
+ \begin{tabular*}{\textwidth}{@{\extracolsep{\fill}} L{\textwidth - 4.5cm} R{4.5cm}}
862
+ \recipienttitlestyle{\@recipientname} & \letterdatestyle{\@letterdate}
863
+ \end{tabular*}
864
+ \begin{singlespace}
865
+ \recipientaddressstyle{\@recipientaddress} \\\\
866
+ \end{singlespace}
867
+ \ifthenelse{\isundefined{\@lettertitle}}
868
+ {}
869
+ {\lettertitlestyle{\@lettertitle} \\}
870
+ \lettertextstyle{\@letteropening}
871
+ }
872
+
873
+ % Define a closing of the cover letter
874
+ % Usage: \makeletterclosing
875
+ \newcommand*{\makeletterclosing}{%
876
+ \vspace{3.4mm}
877
+ \lettertextstyle{\@letterclosing} \\\\
878
+ \letternamestyle{\@firstname\ \@lastname}
879
+ \ifthenelse{\isundefined{\@letterenclosure}}
880
+ {\\}
881
+ {%
882
+ \\\\\\
883
+ \letterenclosurestyle{\@letterenclname: \@letterenclosure} \\
884
+ }
885
+ }