diff options
author | Karl Berry <karl@freefriends.org> | 2017-09-13 22:07:43 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2017-09-13 22:07:43 +0000 |
commit | b82d4c39f1b663053307ba40a6044a5176697a7b (patch) | |
tree | 6b6ab7ede1b697ebf27519e16a73490f208c2d48 /Master/texmf-dist/source/latex/limecv/limecv.dtx | |
parent | d4d66453da7ea3fd6fc443a113b45031e79b0e30 (diff) |
limecv (14sep17)
git-svn-id: svn://tug.org/texlive/trunk@45293 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source/latex/limecv/limecv.dtx')
-rw-r--r-- | Master/texmf-dist/source/latex/limecv/limecv.dtx | 2351 |
1 files changed, 2351 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/latex/limecv/limecv.dtx b/Master/texmf-dist/source/latex/limecv/limecv.dtx new file mode 100644 index 00000000000..70170b50dcf --- /dev/null +++ b/Master/texmf-dist/source/latex/limecv/limecv.dtx @@ -0,0 +1,2351 @@ +% \iffalse meta-comment +% +% Copyright (C) 2017 by Olivier Pieters - me (at) olivierpieters (dot) be +% -------------------------------------------------------------------------- +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3 +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3 or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This work has the LPPL maintenance status `maintained'. +% +% The Current Maintainer of this work is Olivier Pieters. +% +% This work consists of the files limecv.dtx and limecv.ins +% and the derived filebase limecv.sty. +% +% \fi +% +% \iffalse +%<*driver> +\ProvidesFile{limecv.dtx} +%</driver> +%<class>\NeedsTeXFormat{LaTeX2e}[1999/12/01] +%<class>\ProvidesClass{limecv} +%<*class> + [2017/09/12 v0.1.1 limecv Document class for CVs.] +%</class> +% +%<*driver> +\documentclass{ltxdoc} +\usepackage{listings} +\usepackage{tikz} +\usepackage{hyperref} +\usepackage{cleveref} +\usepackage{xparse} + +\NewDocumentCommand{\cvRequirement}{m}{\textbf{#1}} + +\definecolor{cvGreen}{HTML}{357F2D} +\definecolor{cvGreenLight}{HTML}{b8e4b3} +\definecolor{cvRed}{HTML}{7f2d35} +\definecolor{cvDark}{HTML}{2F3142} +\definecolor{cvAccent}{HTML}{474A65} + +\lstset{% + basicstyle=\ttfamily, % font style and size + breakatwhitespace=false, + breaklines=true, + numbers=left, + numberstyle=\tiny, + numbersep=5pt, + language=[LaTeX]{TeX}, + keywordstyle=\color{blue}, + commentstyle=\color{red} +} + +\EnableCrossrefs +\CodelineIndex +\RecordChanges +\begin{document} + \DocInput{limecv.dtx} + \PrintChanges + \PrintIndex +\end{document} +%</driver> +% \fi +% +% \CheckSum{1469} +% +% \CharacterTable +% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +% Digits \0\1\2\3\4\5\6\7\8\9 +% Exclamation \! Double quote \" Hash (number) \# +% Dollar \$ Percent \% Ampersand \& +% Acute accent \' Left paren \( Right paren \) +% Asterisk \* Plus \+ Comma \, +% Minus \- Point \. Solidus \/ +% Colon \: Semicolon \; Less than \< +% Equals \= Greater than \> Question mark \? +% Commercial at \@ Left bracket \[ Backslash \\ +% Right bracket \] Circumflex \^ Underscore \_ +% Grave accent \` Left brace \{ Vertical bar \| +% Right brace \} Tilde \~} +% +% +% \changes{v0.1}{2017/09/12}{Initial version.} +% \changes{v0.1.1}{2017/09/13}{Bug fixes and improved documentation.} +% +% \DoNotIndex{\NewDocumentCommand,\NewDocumentEnvironment} +% +% \providecommand*{\url}{\texttt} +% +% \def\fileversion{v0.1.1} +% \def\filedate{2017/09/12} +% +% \GetFileInfo{limecv.dtx} +% \title{The \textsf{limecv} document class\thanks{This document corresponds % +% to \textsf{limecv}~\fileversion, dated \filedate.}} +% \author{Olivier Pieters \\ \url{me (at) olivierpieters (dot) be}} +% \date{\fileversion~from \filedate} +% +% \maketitle +% +% \tableofcontents +% +% \section{Introduction} +% +% This document class is designed to facilitate easy development of +% curriculum vit\ae\ (CV). A set of predefined macros and environments are +% available for most common sections on a CV. These special elements have +% been designed to ease quick +% creation. This document class was co-designed with a business card, which +% can be found on GitHub: \url{https://github.com/opieters/business-card}. +% +% The design of this CV is split up in three parts, illustrated by +% \cref{design}. Each of these parts that make up this CV template +% will be detailed in the sections below. +% +% \begin{figure}[!ht] +% \centering +% \begin{tikzpicture} +% \draw (0,0) rectangle ++(4.20,5.94); +% \draw[fill=black!20] (0,0) rectangle ++(1.5,5.94); +% \draw (0.75,2.97) node {\LARGE 1}; +% \draw (2.85,2.97) node {\LARGE 2}; +% \end{tikzpicture}% +% \hspace{2cm}% +% \begin{tikzpicture} +% \draw (0,0) rectangle ++(-4.20,-5.94); +% \draw[fill=black!20] (0,0) rectangle ++(-4.2,-1.5); +% \end{tikzpicture} +% \caption{Illustation of a basic template. The image to the left depicts the +% actual CV: side bar to the left (1) with main content on the right (2). +% The image to the right depicts the cover letter design.} +% \label{design} +% \end{figure} +% +% \section{Requirements} +% +% It is advised to use the \cvRequirement{XeLaTeX} engine. However, there is +% also support for \cvRequirement{LaTeX} and \cvRequirement{LuaLaTeX}. In these +% cases, fonts might be different than intended and side bearings will not be +% corrected, since only the XeLaTeX engine has access to these. In the subsequent +% sections, it will always be assumed that the XeLaTeX compiler is used (unless +% noted otherwise). +% +% Any font can be used, though by default the \cvRequirement{Fira} +% \footnote{\url{https://github.com/mozilla/Fira}} font is used. This should be +% installed and accessible by the typesetting system. If another font is desired, +% it can be overwritten using the |sansfont| document class options and +% |\cvMainFont| command. The mono spaced font can be changed by means of the +% |monofont| class option. +% +% \cvRequirement{FontAwesome}\footnote{\url{http://fontawesome.io}} is the icon +% font used. This font should also be available and cannot be replaced by another +% icon font. Most modern TeX distributions ship with this font since they provide +% the |fontawesome| package. +% +% \section{General Macros and Document Class Options} +% +% \section{Side Bar} +% +% The side bar should contain personal information such as your name, job title +% (or industry or similar), contact information, small bio, interests and language +% skills. Special environments and commands have been defined for each of these +% sections and will be described below. +% +% Everything that should be inside the side bar should be placed in the |cvSideBar| +% environment. This environment is placed on the left side of the page by default. +% If it should be typeset on the right side, use the starred version (|cvSideBar*|) +% +% The following environments are available inside the side bar environment: +% |cvProfile|, |cvContact|, |cvLanguages|, |cvInterests| and |cvProjects|. +% +% \DescribeMacro{\cvID} +% This command typesets a picture (in a circle) with name and position underneath it. +% The argument order is: |\cvID{|\meta{first name}|}{|\meta{last name}|}{| +% \meta{picture location}|}{|\meta{job position}|}|. Empty fields are allowed for +% the third and fourth arguments. No picture and no job position will then be +% typeset. Example code: +% \iffalse +%<*example> +% \fi + \begin{lstlisting} +\cvID{John}{Doe}{profile_picture}{Broker} + \end{lstlisting} +% \iffalse +%</example> +% \fi +% +% \DescribeMacro{cvProfile} +% This environment contains a brief profile description or biography. No additional +% arguments are allowed. Example code: +% \iffalse +%<*example> +% \fi + \begin{lstlisting} +\begin{cvProfile} + A short biography goes here. +\end{cvProfile} + \end{lstlisting} +% \iffalse +%</example> +% \fi +% +% \DescribeMacro{cvContact} +% All the contact information goes here. Inside this environment, the following +% commands are available: +% \begin{itemize} +% \item \DescribeMacro{\cvContactAddress} |\cvContactAddress{|\meta{address}|}| +% typesets an address. How this address should be typeset exactly, is left to the +% user. The use of line breaks (|\\|) is allowed; +% \item \DescribeMacro{\cvContactEmail} +% |\cvContactEmail{|\meta{link}|}{|\meta{email address}|}| typesets an email +% address. The link variable should be a something like |mailto:john@doe.tld|. +% Clicking on the email address will then automatically open the default email +% client with this address as recipient. If the link argument is left empty, no +% link will be created. +% \item \DescribeMacro{\cvContactPhone} +% |\cvContactPhone{|\meta{mobile phone number}|}| typesets a mobile phone number. +% \item \DescribeMacro{\cvContactWebsite} +% |\cvContactWebsite{|\meta{link}|}{|\meta{website URL}|}| typesets a website. The +% link variable should be a something like |https://johndoe.tld|. Clicking on the +% website will then automatically open the default web browser. If the link argument +% is left empty, no action will be performed upon clicking on the website. +% \item \DescribeMacro{\cvContactGithub} +% |\cvContactGithub{|\meta{link}|}{|\meta{username}|}| typesets a GitHub profile. +% The link variable should be a valid link to the GitHub profile (for example +% |https://github.com/johndoe|). Clicking on the username will then automatically +% open the default web browser. If the link argument is left empty, no action will +% be performed upon clicking on the website. +% \item \DescribeMacro{\cvContactLinkedin} +% |\cvContactLinkedin{|\meta{link}|}{|\meta{username}|}| typesets a LinkedIn profile. +% The link variable should be a link to your LinkedIn profile homepage (for example +% |https://www.linkedin.com/in/johndoe/|). Clicking on the username will then +% automatically open the default web browser. If the link argument is left empty, +% no action will be performed upon clicking on the website. +% \item \DescribeMacro{\cvContactTwitter} +% |\cvContactTwitter{|\meta{link}|}{|\meta{username}|}| typesets a Twitter profile. +% The link variable should direct to your Twitter profile. An example link looks as +% follows: |https://twitter.com/johndoe|. Clicking on the username will then +% automatically open the default web browser. If the link argument is left empty, +% no action will be performed upon clicking on the website.this address as recipient. +% If the link argument is left empty, no link will be created. +% \item \DescribeMacro{\cvContactKeybase} +% |\cvContactKeybase{|\meta{link}|}{|\meta{fingerprint}|}| typesets a Keybase +% fingerprint (and account). The link variable should be a link to the KeyBase +% profile (e.g.\ |https://keybase.io/johndoe|). Clicking on the fingerprint will then +% automatically open the default web browser. If the link argument is left empty, no +% action will be performed upon clicking on the website. +% \end{itemize} +% +% A full example: +% \iffalse +%<*example> +% \fi + \begin{lstlisting} +\begin{cvContact} + \cvContactAddress{Some Street 78\\B-9000 Ghent\\Belgium} + \cvContactEmail{mailto:john@doe.tld}{john@doe.tld} + \cvContactPhone{+1 781 555 1212} + \cvContactWebsite{https://doe.tld}{doe.tld} + \cvContactGithub{https://github.com/johndoe}{johndoe} + \cvContactLinkedin{https://www.linkedin.com/in/johndoe/}{johndoe} + \cvContactTwitter{https://twitter.com/johndoe}{@johndoe} + \cvContactKeybase{https://keybase.io/johndoe}{\texttt{AAAA 5555 BBBB FFFF}} +\end{cvContact} + \end{lstlisting} +% \iffalse +%</example> +% \fi +% +% If you wish to add contact information that is not available by default, you can extend +% the command using two internal commands: |\cv@ContactTemplateLink| and +% |\cv@ContactTemplate|. See the source code for usage instructions. +% +% \DescribeMacro{cvLanguages} +% This environment is used to showcase language skills. The +% \DescribeMacro{\cvLanguage} |\cvLanguage{|\meta{language}|}{|\meta{skill level}|}| +% should be used inside this environment. The skill level is a real value with a maximum +% value of 5. If higher values are used, the result will not be typeset properly. An +% example is included below. +% +% \iffalse +%<*example> +% \fi + \begin{lstlisting} +\begin{cvLanguages} + \cvLanguage{English (native)}{5} + \cvLanguage{German (B1)}{3} + \cvLanguage{Spanish}{3} +\end{cvLanguages} + \end{lstlisting} +% \iffalse +%</example> +% \fi +% +% \DescribeMacro{cvInterests} +% Typeset interests (can be both professional and personal) using |cvInterests|. +% By default it just typesets a list of items in the long format +% (|long|). The short format can be activated by passing the |short| option to the +% environment. Inside this environment, three commands can be used: |\cvInterestsPersonal|, +% |\cvInterestsProfessional| and |\cvInterest|. \DescribeMacro{\cvInterestsPersonal} +% |\cvInterestsPersonal| and \DescribeMacro{\cvInterestsProfessional} +% |\cvInterestsProfessional| add optional sections inside this environment to differentiate +% between personal and professional interests respectively. Both macros have no options nor +% arguments. The \DescribeMacro{\cvInterest} |\cvInterest{|\meta{icon}|}{|\meta{interest}|}| +% command takes an icon and interest as arguments. +% +% Examples that illustrate the different options are depicted below: +% +% \iffalse +%<*example> +% \fi + \begin{lstlisting} +\begin{cvInterests} + \cvInterestsPersonal + \cvInterest{\faTrain}{model trains} + \cvInterest{\faFlask}{(applied) sciences} + \cvInterest{\faSuitcase}{travelling} + \cvInterestsProfessional + \cvInterest{\faGraduationCap}{machine learning} + \cvInterest{\faCogs}{robotics} +\end{cvInterests} + \end{lstlisting} +% \iffalse +%</example> +% \fi +% +% \iffalse +%<*example> +% \fi + \begin{lstlisting} +\begin{cvInterests}[short] + \cvInterestsPersonal + \cvInterest{\faTrain}{model trains} + \cvInterest{\faFlask}{(applied) sciences} + \cvInterest{\faSuitcase}{travelling} + \cvInterest{\faCamera}{photography} + \cvInterest{\faGamepad}{gaming} + \cvInterest{\faMusic}{music} +\end{cvInterests} + \end{lstlisting} +% \iffalse +%</example> +% \fi +% +% \DescribeMacro{cvProjects} If you have interesting (side) projects that are relevant for +% your CV, you can list them using the |cvProjects| environment. Inside this environment +% you can use the \DescribeMacro{\cvProject} +% |\cvProject[|\meta{options}|]{|\meta{name}|}{|\meta{description}|}| macro to list all +% your projects. The only options currently allowed in \meta{options} are an image +% (using |image|) and a URL (using |link|). This image must be an external file and the user +% must handle its size through |width| or |height|. Example usage: +% +% \iffalse +%<*example> +% \fi + \begin{lstlisting} +\begin{cvProjects} + \cvProject[image=clock,width=1cm]{yanic}{An IoT nixie clock.} + \cvProject{\texttt{limecv}}{A \LaTeX\ document class for curriculum vit\ae.} +\end{cvProjects} + \end{lstlisting} +% \iffalse +%</example> +% \fi +% +% It is currently not possible to extend the side bar with additional environments. To add +% your own, look at the source code and create your own \LaTeX-style hack. +% +% \section{Main Content} +% +% The main content section includes details on your education, experience, skills, references +% and more. Several environments have been designed to suit specific needs. These will be +% discussed next. +% +% \DescribeMacro{cvMainContent} +% Everything in the main content section should be encapsulated in the |cvMainContent| +% environment. This environment defines four new environments: |cvEducation|, +% |cvExperience|, |cvSkills| and |cvReferences|. These four environments are self +% explanatory in terms of functionality. We will detail each of these +% environments. +% +% Note that |cvMainContent| also has a starred variant (|cvMainContent*|). The +% function is similar to |cvSideBar*|, in the sense that it places everything to the +% left instead of the default right location. +% +% \DescribeMacro{cvEducation} +% The education environment creates a timeline styled list of your education. Individual +% education items should be listed by means of the |\cvItem{|\meta{details}|}| macro which +% is available within this environment. Instead of forcing a specific layout structure, it +% was preferred to leave the actual mark-up to the end user. \emph{All} information +% concerning a single education should be passed to this single argument. However, the user +% is always welcome to create his own styling macro that takes multiple arguments. This is +% illustrated by the examples below. +% +% \iffalse +%<*example> +% \fi + \begin{lstlisting}[caption={\lstinline!cvEducation! \emph{without} special user mark-up + command.}] +\begin{cvEducation} + \cvItem{Evening class: Chinese\\ + Some School, City. September 2015 -- June 2016\\ + Achieved A2 language skill in Chinese (Mandarin).} + \cvItem{Bachelor of Science in Biochemistry and Biotechnology\\ + University, City. September 2009 -- June 2012\\ + General training in the basic sciences and the molecular life science.} + \cvItem{Master of Science in Biochemistry and Biotechnology\\ + University, City. September 2012 -- June 2015\\ + Acquisition of insight into and knowledge of possibilities for application in the area + of biochemistry and biotechnology, specific with applications in biomedical application + and due problem-solving reasoning skills.} +\end{cvEducation} + \end{lstlisting} +% \iffalse +%</example> +% \fi +% +% \iffalse +%<*example> +% \fi + \begin{lstlisting}[caption={\lstinline!cvEducation! \emph{with} special user mark-up + command.}] +% in preamble: +\newfontfamily\firaMedium{Fira Sans Medium} +\NewDocumentCommand{\cvEducation}{mmm}{{\firaMedium #1}\\ #2\\ \emph{#3}} +% in document: +\begin{cvEducation} + \cvItem{\cvEducation{Evening class: Chinese}% + {Some School, City. September 2015 -- June 2016}% + {Achieved A2 language skill in Chinese (Mandarin).}} + \cvItem{\cvEducation{Bachelor of Science in Biochemistry and Biotechnology}% + {University, City. September 2009 -- June 2012}% + {General training in the basic sciences and the molecular life science.}} + \cvItem{\cvEducation{Master of Science in Biochemistry and Biotechnology}% + {University, City. September 2012 -- June 2015}% + {Acquisition of insight into and knowledge of possibilities for application + in the area of biochemistry and biotechnology, specific with applications + in biomedical application and due problem-solving reasoning skills.}} +\end{cvEducation} + \end{lstlisting} +% \iffalse +%</example> +% \fi +% +% \DescribeMacro{cvExperience} +% |cvExperience| works very similar to |cvEducation|. If follows the exact same structure +% and has the same design philosophy where you should use |\cvItem| inside this environment +% to typeset the individual items in a timeline style. \Cref{cvExperience} illustrates this with an example. +% +% \iffalse +%<*example> +% \fi + \begin{lstlisting}[caption={\lstinline!cvExperience! code example.},label=cvExperience] +\begin{cvExperience} + \cvItem{Student Job\\ + \textsc{\selectfont Company X}, Location X. Summer 2010\\ + Integer tincidunt dapibus consectetur. Nullam tristique aliquam luctus. Sed ut ante velit. + Nulla pharetra maximus lacus at elementum. Suspendisse sodales consectetur metus, sit amet + ultricies ipsum ultrices ut.}; + \cvItem{Internship\\ + \textsc{Company Y}, Location Y. June 2012 -- August 2012\\ + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi dictum cursus sapien, id + eleifend mi pellentesque id. Etiam lobortis eu odio a sodales. Phasellus ut dolor feugiat, + lacinia lectus in, blandit metus. Fusce lacinia dolor et metus gravida pulvinar sit amet + et ex.}; + \cvItem{Internship\\ + \textsc{Company Z}, Location Z. August 2014 -- September 2014\\ + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi dictum cursus sapien, id + eleifend mi pellentesque id. Etiam lobortis eu odio a sodales. Phasellus ut dolor feugiat, + lacinia lectus in, blandit metus. Fusce lacinia dolor et metus gravida pulvinar sit amet + et ex. Suspendisse vestibulum, leo malesuada molestie maximus, sem risus ornare elit, vitae + sodales felis elit in ipsum.}; +\end{cvExperience} + \end{lstlisting} +% \iffalse +%</example> +% \fi +% +% \DescribeMacro{cvSkills} +% The skills section is contained within the |cvSkills| environment. This environment typesets +% your skills on a 5-level (discrete) scale. These are divided into two columns. To that end, +% two macros are available: |cvSkillOne| and |cvSkillTwo|. \DescribeMacro{cvSkillTwo} +% |cvSkillTwo{|\meta{skill level}|}{|\meta{skill}|}{|\meta{skill level}|}{|\meta{skill}|}| +% typesets a row of two skills. If you have an odd number of items, \DescribeMacro{cvSkillOne} +% |cvSkillOne{|\meta{skill level}|}{|\meta{skill}|}| should be used. An example of a skill-list +% can be found in \cref{cvSkills}. +% +% \iffalse +%<*example> +% \fi + \begin{lstlisting}[caption={Illustration of the \lstinline!cvSkills! environment.},label=cvSkills] +\begin{cvSkills} + \cvSkillTwo{5}{MATLAB}{5}{\LaTeX} + \cvSkillTwo{4}{Python}{4}{VHDL} + \cvSkillTwo{4}{Microsoft Office}{4}{macOS} + \cvSkillOne{3}{C, C++} +\end{cvSkills} + \end{lstlisting} +% \iffalse +%</example> +% \fi +% +% \DescribeMacro{cvReferences} +% The final section is intended to list all your references. These go inside the |cvReferences| +% environment. The enumeration of the different items should be done using the +% \DescribeMacro{\cvAddReference} |\cvAddReference{|\meta{information}|}| macro. The following +% keys are available: |name|, |company|, |job|, |address line 1|, |address line 2|, +% |address line 3|, |mobile phone|, |work phone| and |email|. These are all optional arguments +% and will be typeset consistently between the two references per row. When adding two references, +% the left one should be specified first using |\cvAddReference*|. This will store the values and +% typeset them when adding the second reference through |\cvAddReference|. Note that +% |\cvAddReference| should be used if only one reference needs to be typese. \Cref{cvReferences} +% illustrates the usage of this environment. +% +% \emph{Important remark}: the comment after the usage of |\cvAddReference| is required! +% Otherwise, spacing will not be as intended. +% +% \iffalse +%<*example> +% \fi + \begin{lstlisting}[caption={\lstinline!cvReferences! code example.},label=cvReferences] +\begin{cvReferences} + \cvAddReference{% + name=Jane Smith, + company=Company ABC Co.\ Ltd., + job=Job title, + address line 1=Street lane 2, + address line 2=B-1150 Brussels, + mobile phone=+1 781 555 1212}% <<-- Important!!! +\end{cvReferences} + \end{lstlisting} +% \iffalse +%</example> +% \fi +% +% \section{Cover Letter} +% +% A final (optional) part of a CV is the cover letter. This is a fairly simple part to create +% design wise, but probably the hardest to write in an actual CV. +% +% \DescribeMacro{cvCoverLetter} +% The cover letter environment is |cvCoverLetter| and contains all the cover letter details. +% It will automatically add a header with your name and position based on the information +% filled in in |\cvID|. +% +% \DescribeMacro{\cvBeneficiary} +% The |\cvBeneficiary{|\meta{options}|}| macro offers a convenience wrapper to typeset the +% beneficiary. Possible options are |name|, |position|, |company|, |address line 1|, +% |address line 2| and |address line 3|. The remainder of the cover letter design is up +% to the user. An example design can be found in \cref{cvCoverLetter}. +% +% \DescribeMacro{\cvFullName} +% |\cvFullName| typeset the authors name based on the data provided in |cvID|. +% +% \iffalse +%<*example> +% \fi + \begin{lstlisting}[caption={\lstinline!cvCoverLetter! code example.},label=cvCoverLetter] +\section{Cover Letter} + +\begin{cvCoverLetter} + +\cvBeneficiary{% + name=Jane Smith, + position=Position, + company=Company, + address line 1=Address line 1, + address line 2=Address line 2} + +Dear Miss.\ Smith + +\vspace{\baselineskip} +\lipsum[1-3] +\vspace{\margin} + +\cvFullName + +\end{cvCoverLetter} + \end{lstlisting} +% \iffalse +%</example> +% \fi +% +% \section{Change Style and Layout} +% +% To change the style, one can redefine the colours, lengths and TikZ styles used throughout +% the document class. +% +% By default the following colours are defined: +% \begin{itemize} +% \item |cvGreen| default dark green colour (hex value: {\color{cvGreen} |357F2D|}) +% \item |cvGreenLight| light green colour, for larger shapes and backgrounds (hex value: +% {\color{cvGreenLight} |B8E4B3|}) +% \item |cvDark| default text colour (hex value: {\color{cvDark} |2F3142|}) +% \item |cvRed| currently not used (hex value: {\color{cvRed} |7F2D35|}) +% \item |cvAccent| lighter grey shade for accented text (hex value: {\color{cvAccent} +% |474A65|}) +% \end{itemize} +% +% To change these, use the code from \cref{cvColour} in the preamble: +% +% \iffalse +%<*example> +% \fi + \begin{lstlisting}[caption={Colour editing.},label=cvColour] +\definecolor{cvDark}{HTML}{000000} + \end{lstlisting} +% \iffalse +%</example> +% \fi +% +% By overwriting the following styles, one can change the appearance of multiple TikZ nodes. +% The following styles are available. +% \begin{itemize} +% \item |interesticon| +% \item |interesttext| +% \item |eventdottext| +% \item |invisibletimedot| +% \item |timedot| +% \item |eventdot| +% \item |contactIcon| +% \item |contactText| +% \item |headerIcon| +% \item |skillLevel| +% \item |languageText| +% \item |skillText| +% \item |progressArea| +% \item |progressBar| +% \item |sectionTitle| +% \item |sectionEduText| +% \end{itemize} +% +% Adding your own styles is easy with the code from \cref{cvTikZStyle}. +% +% \iffalse +%<*example> +% \fi + \begin{lstlisting}[caption={Change TikZ style.},label=cvTikZStyle] +\tikzset{ + interesticon/.style = {}, +} + \end{lstlisting} +% \iffalse +%</example> +% \fi + +% Spacing used inside the document can also be modified by the user. The following +% lengths have been defined: +% \begin{itemize} +% \item |\cvColSep| Distance between columns of |cvSkills|. +% Default value: |1cm|. +% \item |\cvNodeSep| Not used currently. +% Default value: |0.75cm|. +% \item |\cvTimeDotDiameter| Size of the dots in a timeline. +% Default value: |3pt|. +% \item |\cvMargin| Margin around the entire page. +% Default value: |1cm|. +% \item |\cvSideWidth| Width of the side bar. +% Default value: |0.3\paperwidth-\cvMargin|. +% \item |\cvMainWidth| Width of the main content section. +% Default value: |\paperwidth-4\cvMargin-\cvSideWidth|. +% \item |\cvTimeDotSep| Distance between timeline dot and text. +% Default value: |0.4cm|. +% \item |\cvStartEndSep| Not used. +% Default value: |0.3cm|. +% \item |\cvItemSep| Distance between |cvItem| entries. +% Default value: |0.4cm|. +% \item |\cvTableSepWidth| Distance between two columns of |cvReferences| environment. +% Default value: |0.3cm|. +% \item |\cvCoverLetterHeight| Height of the coloured bar at the top of the cover letter. +% Default value: |\cvSideWidth|. +% \item |\cvCoverLetterWidth| Width of the cover letter text. This can be used to improve +% to layout. Default value: |\cvMainWidth+3\cvMargin|. +% \item |\cvPictureWidth| Diameter of the profile picture. +% Default value: |4cm|. +% \item |\cvProgressAreaWidth| Length of a progress bar for the languages section. +% Default value: |5em|. +% \item |\cvProgressAreaHeight| Height of a progress bar for the languages section. +% Default value: |0.75em|. +% \item |\cvSectionSep| Distance between sections of the main content section. +% Default value: |0.6cm|. +% \item |\cvSectionSBSep| Distance between sections of the side bar section. +% Default value: |4pt|. +% \item |\cvTitleLineWidth| Line width of horizontal line below section title. +% Default value: |2pt|. +% \item |\cvTitleLineSpacing| Distance from bottom of the titles of the main content section to +% the horizontal centre of line. Default value: |0.1cm|. +% \item |\cv@projectSep| Internal length. +% Automatically set to |\cvItemSep|. +% \item |\cvProjectDetailsSep| Internal spacing between details of a single project. +% Default value: |0.2cm|. +% \item |\cvInterestDetailsSep| Distance between items in case the |long| options is used for the +% |cvInterests| environment. Default value: |4pt|. +% \item |\cvContactItemSep| Distance between items in the |cvContact| environment. +% Default value: |5pt|. +% \item |\cvCoverLetterLineWidth| Line width of line below cover letter name. +% Default value: |3pt|. +% \item |\cvCoverLetterPositionSpacing| Distance between name and position in the cover letter. +% Default value: |10pt|. +% \item |\cvSBSectionLineWidth| Line width of left and right lines next to the titles of in the +% side bar. Default value: |1pt|. +% \item |\cvCoverLetterLineSpacing| Distance between name and line below it in the cover letter. +% Default value: |0pt|. +% \item |\cvIDNameSep| Distance between first and last name. +% Default value: |0.1cm|. +% \item |\cvPositionSep| Distance before and after the position. +% Default value: |0.5cm|. +% \item |\cvSkillSep| Distance between skills. +% Default value: |1ex|. +% \item |\cvHeaderIconWidth| Automatically set, currently has no visible effect on document. +% Default value: |0pt|. +% \end{itemize} +% +% The fonts can also be changed, either by using the |sansfont| and |monofont| class options, or +% by using the default ways provided by \LaTeX, XeLaTeX and LuaLaTeX. Note that the |fontspec| +% package is already loaded by the class, so you can directly use |\setmainfont| in the preamble +% if you are using the XeLaTeX or LuaLaTeX engine. +% +% \section{Example} +% +% The source code of a typical CV document can be found in the examples folder. +% \Cref{example-cv,example-cover-letter} depict the resulting PDF documents. +% +% \begin{figure}[!ht] +% \IfFileExists{./mwe-xelatex.pdf}{\includegraphics[width=\textwidth,page=1]% +% {mwe-xelatex.pdf}}{No built examples found. Figure not included.} +% \caption{Example CV (scaled).} +% \label{example-cv} +% \end{figure} +% +% \begin{figure}[!ht] +% \IfFileExists{./mwe-xelatex.pdf}{\includegraphics[width=\textwidth,page=2]% +% {mwe-xelatex.pdf}}{No built examples found.} +% \caption{Example cover letter (scaled). Figure not included.} +% \label{example-cover-letter} +% \end{figure} +% +% \StopEventually{} +% +% \section{Implementation} +% +% \iffalse +%<*class> +% \fi +% +% limecv.cls +% +% Copyright 2017 Olivier Pieters +% +% A (Xe/Lua)LaTeX document class +% +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3 +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3 or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This work has the LPPL maintenance status `maintained'. +% +% The Current Maintainer of this work is Olivier Pieters. +% Contact the maintainer at: me (at) olivierpieters (dot) be. +% +%------------------------------------------------------ +% +% Include minimal required packages +% +% process key-value class options +% \begin{macrocode} +\RequirePackage{kvoptions} +% \end{macrocode} +%------------------------------------------------------ +% +% Process options of this class. +% +% \begin{macrocode} +\DeclareBoolOption[false]{print} +\newif\ifcv@fontPath +\cv@fontPathfalse +\DeclareStringOption{path} +\AddToKeyvalOption*{path}{\cv@fontPathtrue} +\DeclareStringOption[Fira Sans]{sansfont} +\DeclareStringOption[Fira Mono]{monofont} +\ProcessKeyvalOptions* +% \end{macrocode} +%------------------------------------------------------ +% +% Process general class options +% +% pass document options to article class, which forms +% base of this document class +% \begin{macrocode} +\DeclareOption*{% + \PassOptionsToClass{\CurrentOption}{article}% +} +\ProcessOptions\relax +\LoadClass{article} +% \end{macrocode} +%------------------------------------------------------ +% +% Include required packages +% +% check if XeTeX is used +% \begin{macrocode} +\RequirePackage{ifxetex} +% \end{macrocode} +% check if LuaTeX is used +% \begin{macrocode} +\RequirePackage{ifluatex} +% \end{macrocode} +% Advanced command definitions +% \begin{macrocode} +\RequirePackage{xparse} +% \end{macrocode} +% complex length calculations +% \begin{macrocode} +\RequirePackage{calc} +% \end{macrocode} +% colour options +% \begin{macrocode} +\RequirePackage{xcolor} +% \end{macrocode} +% advanced table options +% \begin{macrocode} +\RequirePackage{tabularx} +% \end{macrocode} +% links +% \begin{macrocode} +\RequirePackage{hyperref} +\RequirePackage{url} +% \end{macrocode} +% remove paragraph indent +% \begin{macrocode} +\RequirePackage{parskip} +% \end{macrocode} +% string operations +% \begin{macrocode} +\RequirePackage{xstring} +% \end{macrocode} +% key-value parsing within document +% \begin{macrocode} +\RequirePackage{xkeyval} +% \end{macrocode} +%------------------------------------------------------ +% +% Define colours +% +% \begin{macrocode} +\definecolor{cvGreen}{HTML}{357F2D} +\definecolor{cvGreenLight}{HTML}{b8e4b3} +\definecolor{cvRed}{HTML}{7f2d35} +\definecolor{cvDark}{HTML}{2F3142} +\definecolor{cvAccent}{HTML}{474A65} +% \end{macrocode} +%------------------------------------------------------ +% +% Define new table column types with fixed width. +% +% \begin{macrocode} +\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}} +% \end{macrocode} +%------------------------------------------------------ +% +% Misc and helper commands +% +% Add comma in a cvReference entry. +% \begin{macrocode} +\NewDocumentCommand{\cvComma}{}{,} +% \end{macrocode} +% Define check if argument is empty +% argument order: |{argument}{if empty}{if not empty}| +% +% Based on: http://tex.stackexchange.com/questions/63223 +% +% \begin{macrocode} +\ExplSyntaxOn +\DeclareExpandableDocumentCommand{\@IfNoValueOrEmptyTF}% + {mmm}{\IfNoValueTF{#1}{#2}{ + \tl_if_empty:nTF {#1} {#2} {#3}% + } +} +\ExplSyntaxOff +% \end{macrocode} +% +% \begin{macro}{\ifnodedefined} +% Check if node is defined. +% Based on: https://tex.stackexchange.com/questions/37709 +% \begin{macrocode} +\long\def\ifnodedefined#1#2#3{% + \@ifundefined{pgf@sh@ns@#1}{#3}{#2}% +} +% \end{macrocode} +% \end{macro} +% +%------------------------------------------------------ +% +% Update global font colour +% +% \begin{macrocode} +\NewDocumentCommand{\globalcolor}{m}{% + \color{#1}\global\let\default@color\current@color +} +\AtBeginDocument{\globalcolor{cvDark}} +% \end{macrocode} +%------------------------------------------------------ +% +% TikZ +% +% \begin{macrocode} +\RequirePackage{tikz} +\RequirePackage{graphicx} +\usetikzlibrary{% + calc, + positioning, + fit, + arrows.meta, + backgrounds, + matrix} +\tikzset{ + interesticon/.style = {}, + interesttext/.style = {}, + eventdottext/.style = {}, + invisibletimedot/.style = {}, + timedot/.style = {}, + contactIcon/.style={}, + contactText/.style={}, + headerIcon/.style={}, + skillLevel/.style={}, + languageText/.style={}, + skillText/.style={}, + progressArea/.style={}, + progressBar/.style={}, + sectionTitle/.style={}, + sectionEduText/.style={% + eventdottext, + anchor=north west + }, + cv@interesticon/.style = {% + minimum width=\cvHeaderIconWidth, + interesticon + }, + cv@interesttext/.style = {% + interesttext, + }, + cv@eventdottext/.style = {% + text width=\cvMainWidth-\cvTimeDotSep, + black, + anchor=north west, + eventdottext, + }, + cv@invisibletimedot/.style = {% + circle, + minimum width=\cvTimeDotDiameter, + anchor=center, + invisibletimedot, + }, + cv@timedot/.style = {% + cv@invisibletimedot, + draw, + fill, + black, + timedot, + }, + cv@contactIcon/.style={% + minimum height=\baselineskip, + contactIcon, + }, + cv@contactText/.style={% + minimum height=\baselineskip, + text depth=0pt, + contactText, + }, + cv@headerIcon/.style={% + minimum width=\cvHeaderIconWidth, + anchor=center, + headerIcon, + }, + cv@skillLevel/.style={skillLevel,}, + cv@languageText/.style={languageText,}, + cv@skillText/.style={skillText,}, + cv@progressArea/.style={% + minimum width=\cvProgressAreaWidth, + minimum height=\cvProgressAreaHeight, + rectangle, + draw, + cvGreen, + progressArea + }, + cv@progressBar/.style={% + minimum height=\cvProgressAreaHeight, + rectangle, + draw, + fill, + cvGreen, + anchor=west, + progressBar + }, + cv@sectionTitle/.style={% + anchor=north west, + align=left, + sectionTitle, + }, + cv@sectionEduText/.style={% + cv@eventdottext, + anchor=north west, + sectionEduText, + }, +} +% \end{macrocode} +%------------------------------------------------------ +% +% XeLaTeX/LuaLaTeX specific +% +% \begin{macrocode} +\NewDocumentCommand{\cv@loadFonts}{}{ + \RequirePackage{fontspec} + \RequirePackage{fontawesome} +% \end{macrocode} +% set fonts +% \begin{macrocode} + \setmainfont[Numbers={Monospaced}]{\limecv@sansfont} + \setsansfont{\limecv@sansfont} + \setmonofont{\limecv@monofont} + \ifcv@fontPath + \newfontfamily{\cv@FA}[Path=\limecv@path]% + {FontAwesome} + \else + \newfontfamily{\cv@FA}{FontAwesome} + \fi +% \end{macrocode} +% define some missing icons +% \begin{macrocode} + \ProvideDocumentCommand{\faAddressCard}{}{{\cv@FA% + \symbol{"F2B9}}} + \ProvideDocumentCommand{\faVcard}{}{{\cv@FA% + \symbol{"F2BB}}} + \ProvideDocumentCommand{\faMicrochip}{}{{\cv@FA% + \symbol{"F2DB}}} +% \end{macrocode} +% future possibility: +% https://raw.githubusercontent.com/xdanaux/moderncv/ +% master/moderncviconsmarvosym.sty +% \begin{macrocode} +} +\ifxetex + \cv@loadFonts +\else + \ifluatex + \cv@loadFonts + \else + \RequirePackage{fontawesome} + \RenewDocumentCommand{\familydefault}{}{\sfdefault} + \fi +\fi +% \end{macrocode} +%------------------------------------------------------ +% +% XeLaTeX/LuaLaTeX specific +% +% Removes left/right side bearing of character +% +% Based on: +% https://tex.stackexchange.com/questions/274479 +% https://tex.stackexchange.com/questions/34563 +% +% \begin{macrocode} +\ifxetex + \NewDocumentCommand{\kright}{m}{\leavevmode #1% + \kern-\XeTeXglyphbounds3 \the\XeTeXcharglyph`#1 } + \NewDocumentCommand{\kleft}{m}{\leavevmode % + \kern-\XeTeXglyphbounds1 \the\XeTeXcharglyph`#1 #1} +\else + \NewDocumentCommand{\kright}{m}{#1} + \NewDocumentCommand{\kleft}{m}{#1} +\fi +% \end{macrocode} +% Extracts n-th charcter from a string +% Argument order: string - character number +% \begin{macrocode} +\ExplSyntaxOn +\DeclareExpandableDocumentCommand{\extract}{mm}{% + \tl_item:nn { #1 } { #2 }% +} +\ExplSyntaxOff +% \end{macrocode} +%------------------------------------------------------ +% +% Page layout +% +% remove page numbers +% \begin{macrocode} +%% \pagenumbering{gobble} +% \end{macrocode} +% remove all page styling +% \begin{macrocode} +\pagestyle{empty} +% \end{macrocode} +% not used +% \begin{macrocode} +\newlength\cvColSep +\setlength\cvColSep{1cm} % 2 times column separation! +% \end{macrocode} +% not used +% \begin{macrocode} +\newlength\cvNodeSep +\setlength\cvNodeSep{0.75cm} +\newlength\cvTimeDotDiameter +\setlength\cvTimeDotDiameter{3pt} +\newlength\cvMargin +\setlength\cvMargin{1cm} +\newlength\cvSideWidth +\setlength\cvSideWidth{0.3\paperwidth-\cvMargin} +\newlength\cvMainWidth +\setlength\cvMainWidth{\paperwidth-4\cvMargin-\cvSideWidth} +\newlength\cvTimeDotSep +\setlength\cvTimeDotSep{0.4cm} +\newlength\cvStartEndSep +\setlength\cvStartEndSep{0.3cm} +\newlength\cvItemSep +\setlength\cvItemSep{0.4cm} +\newlength\cvTableSepWidth +\setlength\cvTableSepWidth{0.3cm} +\newlength\cvCoverLetterHeight +\setlength\cvCoverLetterHeight{\cvSideWidth} +\newlength\cvCoverLetterWidth +\setlength\cvCoverLetterWidth{\cvMainWidth+3\cvMargin} +\newlength\cvPictureWidth +\setlength\cvPictureWidth{4cm} +% \end{macrocode} +% progress area size definition +% \begin{macrocode} +\newlength\cvProgressAreaWidth +\setlength\cvProgressAreaWidth{5em} +\newlength\cvProgressAreaHeight +\setlength\cvProgressAreaHeight{0.75em} +\newlength\cvSectionSep +\setlength\cvSectionSep{0.6cm} +\newlength\cvSectionSBSep +\setlength\cvSectionSBSep{4pt} +% \end{macrocode} +% line width of horizontal line below section title +% \begin{macrocode} +\newlength\cvTitleLineWidth +\setlength\cvTitleLineWidth{2pt} +% \end{macrocode} +% distance from bottom of text to centre of line +% \begin{macrocode} +\newlength\cvTitleLineSpacing +\setlength\cvTitleLineSpacing{0.1cm} +% \end{macrocode} +% set to |\cvItemSep| by default (do not overwrite!) +% \begin{macrocode} +\newlength\cv@projectSep +\setlength\cv@projectSep{0cm} +% \end{macrocode} +% internal spacing between details of a single project +% \begin{macrocode} +\newlength\cvProjectDetailsSep +\setlength\cvProjectDetailsSep{0.2cm} +\newlength\cvInterestDetailsSep +\setlength\cvInterestDetailsSep{4pt} +\newlength\cvContactItemSep +\setlength\cvContactItemSep{5pt} +% \end{macrocode} +% line width of line below cover letter name +% \begin{macrocode} +\newlength\cvCoverLetterLineWidth +\setlength\cvCoverLetterLineWidth{3pt} +\newlength\cvCoverLetterPositionSpacing +\setlength\cvCoverLetterPositionSpacing{10pt} +\newlength\cvSBSectionLineWidth +\setlength\cvSBSectionLineWidth{1pt} +\newlength\cvCoverLetterLineSpacing +\setlength\cvCoverLetterLineSpacing{0pt} +\newlength\cvIDNameSep +\setlength\cvIDNameSep{0.1cm} +\newlength\cvPositionSep +\setlength\cvPositionSep{0.5cm} +\newlength\cvSkillSep +\setlength\cvSkillSep{1ex} +\newlength\cvHeaderIconWidth +\setlength\cvHeaderIconWidth{0pt} +% \end{macrocode} +%------------------------------------------------------ +% +% New styling commands +% +% +% Style main section title +% \begin{macrocode} +\NewDocumentCommand{\cvSection}{m}{\Large\textbf{#1}} +% \end{macrocode} +% Typeset skill level +% \begin{macrocode} +\newcount\my@repeat@count +\NewDocumentCommand{\cvSkill}{m}{% + \begingroup + \my@repeat@count=\z@ + \@whilenum\my@repeat@count<#1\do{\faCircle\advance% + \my@repeat@count\@ne}% + \my@repeat@count=\numexpr5-\z@\relax + \@whilenum\my@repeat@count>#1\do{\faCircleO\advance% + \my@repeat@count\m@ne}% + \endgroup +} +% \end{macrocode} +% Create horizontal line from edge to edge for side bar +% section titles. +% +% Based on: +% https://tex.stackexchange.com/questions/65731 +% Alternative: +% https://tex.stackexchange.com/questions/15119 +% \begin{macrocode} +\NewDocumentCommand{\cvhrulefill}{}{{\color{cvGreen}% +\leavevmode\leaders\hrule height \cvSBSectionLineWidth\hfill\kern\z@}} +\NewDocumentCommand{\ruleline}{m}{\par\noindent\raisebox{.6ex}{% +\makebox[\linewidth]{\cvhrulefill\hspace{1ex}% +\raisebox{-.6ex}{#1}\hspace{1ex}\cvhrulefill}}} +% \end{macrocode} +% Title counters +% \begin{macrocode} +\newcounter{cv@titlePrev} +\setcounter{cv@titlePrev}{0} +\newcounter{cv@titleNext} +\setcounter{cv@titleNext}{1} +% \end{macrocode} +% Draw everything associated with main section title. +% \begin{macrocode} +\NewDocumentCommand{\cv@Title}{mm}{% + \ifnodedefined{cv@last item \the\value{cv@lastItem}}{% + \setlength\cvHeaderIconWidth{\maxof{\cvHeaderIconWidth}{\widthof{\Large #2}}}% + \protected@write\@auxout{}{\global\cvHeaderIconWidth=\the\cvHeaderIconWidth} + \node[% + below=\cvSectionSep of cv@last item % + \the\value{cv@lastItem}.south west, + cv@sectionTitle] + (cv@title \the\value{cv@titleNext}) + {\begingroup\edef\y{\endgroup% + \cvSection\bgroup\noexpand\kleft{% + \extract{#1}{1}}}% + \y\StrGobbleLeft{#1}{1}\egroup}; + \node[% + left=\cvTimeDotSep of cv@title \the\value{cv@titleNext}, + cv@headerIcon] + {#2}; + \node[ + below=\cvSectionSep of cv@last item % + \the\value{cv@lastItem}.south west, + cv@sectionTitle] + (cv@title \the\value{cv@titleNext} dummy) {% + \phantom{\cvSection{Education}}}; + \begin{scope}[on background layer] + \draw[line width=\cvTitleLineWidth,cvGreen] + let \p1=(cv@title \the\value{cv@titleNext} % + dummy.south west), + \p2=(current page.east) in + (\x1,\y1-\cvTitleLineSpacing) to (\x2,\y1-\cvTitleLineSpacing); + \end{scope} + }{% + \node[cv@sectionTitle] at (0,0) (cv@title % + \the\value{cv@titleNext}) + {\begingroup\edef\y{\endgroup% + \cvSection\bgroup\noexpand\kleft{\extract{#1}{1}}}% + \y\StrGobbleLeft{#1}{1}\egroup}; + \node[% + left=\cvTimeDotSep of cv@title \the\value{cv@titleNext}, + cv@headerIcon] + {#2}; + \begin{scope}[on background layer] + \draw[line width=\cvTitleLineWidth,cvGreen] + let \p1=(cv@title \the\value{cv@titleNext}% + .south west), + \p2=(current page.east) in + (\x1,\y1-\cvTitleLineSpacing) to (\x2,\y1-\cvTitleLineSpacing); + \end{scope} +}% +\stepcounter{cv@titlePrev}% +\stepcounter{cv@titleNext} +} +% \end{macrocode} +% Draw the timeline +% \begin{macrocode} +\NewDocumentCommand{\cv@EndSectionDraw}{}{ + \draw (start) to (end.center);} +% \end{macrocode} +% Item counters +% \begin{macrocode} +\newcounter{cv@itemPrev} +\setcounter{cv@itemPrev}{0} +\newcounter{cv@itemNext} +\setcounter{cv@itemNext}{1} +\newcounter{cv@lastItem} +\setcounter{cv@lastItem}{1} +% \end{macrocode} +% List a timeline entry +% \begin{macrocode} +\NewDocumentCommand{\cv@definecvItem}{}{ + \NewDocumentCommand{\cvItem}{m}{% + \ifnodedefined{item \the\value{cv@itemPrev}}{% + \node[% + below=\cvItemSep of item % + \the\value{cv@itemPrev}.south west, + cv@eventdottext] + (item \the\value{cv@itemNext} header) + {\phantom{Evening}}; + \node[% + below=\cvItemSep of item % + \the\value{cv@itemPrev}.south west, + cv@sectionEduText] + (item \the\value{cv@itemNext}) + {##1}; + \node[% + left=\cvTimeDotSep of item % + \the\value{cv@itemNext} header, + cv@timedot] + {}; + }{ + \node[% + below=\cvItemSep of cv@title % + \the\value{cv@titlePrev}.south west, + cv@eventdottext] + (item \the\value{cv@itemNext} header) + {\phantom{Evening}}; + \node[ + below=\cvItemSep of cv@title % + \the\value{cv@titlePrev}.south west, + cv@sectionEduText] + (item \the\value{cv@itemNext}) + {##1}; + \node[ + left=\cvTimeDotSep of item % + \the\value{cv@itemNext} header, + cv@timedot] + (start) + {}; + } + \node[ + left=\cvTimeDotSep of item % + \the\value{cv@itemNext}.south west, + cv@invisibletimedot] + (end) + {}; + \stepcounter{cv@itemPrev} + \stepcounter{cv@itemNext} + } +} +% \end{macrocode} +%------------------------------------------------------ +% +% Commands specific for cvSkills section +% +% +% information in temporary command yes/no +% \begin{macrocode} +\newif\ifcv@firstskill +% \end{macrocode} +% temporary command that stores skill information +% \begin{macrocode} +\NewDocumentCommand{\cv@skillsTable}{}{} +% \end{macrocode} +% typeset two skills +% \begin{macrocode} +\NewDocumentCommand{\cvSkillTwo}{mmmm}{% + \ifcv@firstskill + \g@addto@macro\cv@skillsTable{\cvSkill{#1} % + & #2 & \cvSkill{#3} & #4} + \cv@firstskillfalse + \else + \g@addto@macro\cv@skillsTable{\\[\cvSkillSep] \cvSkill{#1} % + & #2 & \cvSkill{#3} & #4} + \fi +} +% \end{macrocode} +% typeset one skill +% \begin{macrocode} +\NewDocumentCommand{\cvSkillOne}{mm}{% + \ifcv@firstskill + \g@addto@macro\cv@skillsTable{\cvSkill{#1} & #2} + \cv@firstskillfalse + \else + \g@addto@macro\cv@skillsTable{\\[\cvSkillSep] \cvSkill{#1} & #2} + \fi +} +% \end{macrocode} +%------------------------------------------------------ +% +% cvMainContent environments +% +% +% \begin{macrocode} +\NewDocumentEnvironment{cvMainContent}{}{% + \begin{tikzpicture}[% + every node/.style={% + inner sep=0pt, + outer sep=0pt}, + remember picture, + overlay, + shift={($(current page.north west)+% + (\cvSideWidth+3\cvMargin+\cvTimeDotSep,-\cvMargin)$)}] +}{% + \end{tikzpicture} +} +\NewDocumentEnvironment{cvMainContent*}{}{% + \stepcounter{titlePrev} + \stepcounter{titleNext} + \begin{tikzpicture}[% + every node/.style={ + inner sep=0pt, + outer sep=0pt}, + remember picture, + overlay, + shift={($(current page.north west)+% + (\cvMargin+\cvTimeDotSep,-\cvMargin)$)}] +}{% + \end{tikzpicture}% +} +% \end{macrocode} +%------------------------------------------------------ +% +% cvEductation environment +% +% \begin{macrocode} +\NewDocumentEnvironment{cvEducation}{}{% + \cv@Title{Education}{\faGraduationCap} +% \end{macrocode} +% insures uniqueness +% \begin{macrocode} + \stepcounter{cv@itemPrev} + \stepcounter{cv@itemNext} + \cv@definecvItem + }{% + \cv@EndSectionDraw + \stepcounter{cv@lastItem} + \draw (item \the\value{cv@itemPrev}.south west) + node (cv@last item \the\value{cv@lastItem}) {}; +} +% \end{macrocode} +%------------------------------------------------------ +% +% cvExperience environment +% +% \begin{macrocode} +\NewDocumentEnvironment{cvExperience}{}{% + \cv@Title{Experience}{\faBriefcase} +% \end{macrocode} +% insures uniqueness +% \begin{macrocode} + \stepcounter{cv@itemPrev} + \stepcounter{cv@itemNext} + \cv@definecvItem +}{% + \cv@EndSectionDraw + \stepcounter{cv@lastItem} + \draw (item \the\value{cv@itemPrev}.south west) + node (cv@last item \the\value{cv@lastItem}) {}; +} +% \end{macrocode} +%------------------------------------------------------ +% +% cvSkills environment +% +% \begin{macrocode} +\NewDocumentEnvironment{cvSkills}{}{% + \cv@Title{Skills}{\faStar} + \global\cv@firstskilltrue +}{% + \node[ + below=\cvSectionSep of cv@title \the\value{cv@titlePrev}% + .south west, + anchor=north west] (skills) % + {\begin{tabular}{@{}ll@{\hskip\cvColSep}ll@{}}% + \cv@skillsTable + \end{tabular}}; + \stepcounter{cv@lastItem} + \draw (skills.south west) node % + (cv@last item \the\value{cv@lastItem}) {}; +} +% \end{macrocode} +%------------------------------------------------------ +% +% cvReferences environment +% +% \begin{macrocode} +\NewDocumentEnvironment{cvReferences}{}{% + \cv@Title{References}{\faLink} + \node[ + below=\cvSectionSep of cv@title \the\value{cv@titlePrev}.% + south west, + anchor=north west, + ] (cv@References) \bgroup % +}{% + \egroup; + \stepcounter{cv@lastItem} + \draw (cv@References.south west) node % + (cv@last item \the\value{cv@lastItem}) {}; +} +% \end{macrocode} +% Key-value parsing structure +% \begin{macrocode} +\pgfkeys{/@cv/references/.is family, + /@cv/references/.unknown/.style = % + {\pgfkeyscurrentpath/\pgfkeyscurrentname/% + .initial = #1}} +\newif\ifcv@refName +\pgfkeys{/@cv/references/name/.is if=cv@refName} +\pgfkeys{/@cv/references/name=false} +\newif\ifcv@refPosition +\pgfkeys{/@cv/references/position/.is if=cv@refPosition} +\pgfkeys{/@cv/references/position=false} +\newif\ifcv@refCompany +\pgfkeys{/@cv/references/company/.is if=cv@refCompany} +\pgfkeys{/@cv/references/copmany=false} +\newif\ifcv@refAddressLineA +\pgfkeys{/@cv/references/address line 1/.is if=% + cv@refAddressLineA} +\pgfkeys{/@cv/references/address line 1=false} + \newif\ifcv@refAddressLineB +\pgfkeys{/@cv/references/address line 2/.is if=% + cv@refAddressLineB} +\pgfkeys{/@cv/references/address line 2=false} +\newif\ifcv@refAddressLineC +\pgfkeys{/@cv/references/address line 3/.is if=% + cv@refAddressLineC} +\pgfkeys{/@cv/references/address line 3=false} +\newif\ifcv@refWorkPhone +\pgfkeys{/@cv/references/work phone/.is if=% + cv@refWorkPhone} +\pgfkeys{/@cv/references/work phone=false} +\newif\ifcv@refMobilePhone +\pgfkeys{/@cv/references/mobile phone/.is if=% + cv@refMobilePhone} +\pgfkeys{/@cv/references/mobile phone=false} +\newif\ifcv@refStored +\pgfkeys{/@cv/references/value stored/.is if=% + cv@refStored} +\pgfkeys{/@cv/references/value stored=false} +% \end{macrocode} +% +% keys +% \begin{macrocode} +\define@key{cvAddReferenceA}{name}{% + \global\def\cv@refAName{#1}% + \@IfNoValueOrEmptyTF{#1}{}{\pgfkeys{/@cv/references/name = true}}} +% \end{macrocode} +% +% +% \begin{macrocode} +\define@key{cvAddReferenceA}{company}{% + \global\def\cv@refACompany{#1}% + \@IfNoValueOrEmptyTF{#1}{}{\pgfkeys{/@cv/references/company = true}}} +% \end{macrocode} +% +% +% \begin{macrocode} +\define@key{cvAddReferenceA}{position}{% + \global\def\cv@refAPosition{#1}% + \@IfNoValueOrEmptyTF{#1}{}{\pgfkeys{/@cv/references/position = true}}} +% \end{macrocode} +% +% +% \begin{macrocode} +\define@key{cvAddReferenceA}{address line 1}{% + \global\def\cv@refAAddressLineA{#1}% + \@IfNoValueOrEmptyTF{#1}{}{\pgfkeys{/@cv/references/address line 1 = true}}} +% \end{macrocode} +% +% +% \begin{macrocode} +\define@key{cvAddReferenceA}{address line 2}{% + \global\def\cv@refAAddressLineB{#1}% + \@IfNoValueOrEmptyTF{#1}{}{\pgfkeys{/@cv/references/address line 2 = true}}} +% \end{macrocode} +% +% +% \begin{macrocode} +\define@key{cvAddReferenceA}{address line 3}{% + \global\def\cv@refAAddressLineC{#1}% + \@IfNoValueOrEmptyTF{#1}{}{\pgfkeys{/@cv/references/address line 3 = true}}} +% \end{macrocode} +% +% +% \begin{macrocode} +\define@key{cvAddReferenceA}{phone work}{% + \global\def\cv@refAPhoneWork{#1}% + \@IfNoValueOrEmptyTF{#1}{}{\pgfkeys{/@cv/references/phone work = true}}} +% \end{macrocode} +% +% +% \begin{macrocode} +\define@key{cvAddReferenceA}{mobile phone}{% + \global\def\cv@refAMobilePhone{#1}% + \@IfNoValueOrEmptyTF{#1}{}{\pgfkeys{/@cv/references/mobile phone = true}}} +% \end{macrocode} +% +% +% \begin{macrocode} +\define@key{cvAddReferenceB}{name}{% + \global\def\cv@refBName{#1}% + \@IfNoValueOrEmptyTF{#1}{}{\pgfkeys{/@cv/references/name = true}}} +% \end{macrocode} +% +% +% \begin{macrocode} +\define@key{cvAddReferenceB}{company}{% + \global\def\cv@refBCompany{#1}% + \@IfNoValueOrEmptyTF{#1}{}{\pgfkeys{/@cv/references/company = true}}} +% \end{macrocode} +% +% +% \begin{macrocode} +\define@key{cvAddReferenceB}{position}{% + \global\def\cv@refBPosition{#1}% + \@IfNoValueOrEmptyTF{#1}{}{\pgfkeys{/@cv/references/position = true}}} +% \end{macrocode} +% +% +% \begin{macrocode} +\define@key{cvAddReferenceB}{address line 1}{% + \global\def\cv@refBAddressLineA{#1}% + \@IfNoValueOrEmptyTF{#1}{}{\pgfkeys{/@cv/references/address line 1 = true}}} +% \end{macrocode} +% +% +% \begin{macrocode} +\define@key{cvAddReferenceB}{address line 2}{% + \global\def\cv@refBAddressLineB{#1}% + \@IfNoValueOrEmptyTF{#1}{}{\pgfkeys{/@cv/references/address line 2 = true}}} +% \end{macrocode} +% +% +% \begin{macrocode} +\define@key{cvAddReferenceB}{address line 3}{% + \global\def\cv@refBAddressLineC{#1}% + \@IfNoValueOrEmptyTF{#1}{}{\pgfkeys{/@cv/references/address line 3 = true}}} +% \end{macrocode} +% +% +% \begin{macrocode} +\define@key{cvAddReferenceB}{phone work}{% + \global\def\cv@refBPhoneWork{#1}% + \@IfNoValueOrEmptyTF{#1}{}{\pgfkeys{/@cv/references/phone work = true}}} +% \end{macrocode} +% +% +% \begin{macrocode} +\define@key{cvAddReferenceB}{mobile phone}{% + \global\def\cv@refBMobilePhone{#1}% + \@IfNoValueOrEmptyTF{#1}{}{\pgfkeys{/@cv/references/mobile phone = true}}} +\NewDocumentCommand{\cvAddReference}{sm}{% + \IfBooleanTF{#1}{% + \setkeys{cvAddReferenceA}{name=,company=, + position=,address line 1=,address line 2=, + address line 3=,phone work=,mobile phone=,#2} + \pgfkeys{/@cv/references/name = true}% + }{% + \setkeys{cvAddReferenceB}{name=,company=, + position=,address line 1=,address line 2=, + address line 3=,phone work=,mobile phone=,#2} + \ifcv@refStored% + \begin{tabular}{@{}L{0.5\cvMainWidth-0.5\cvTimeDotSep% + -0.5\cvTableSepWidth}@{\hskip \cvTableSepWidth}% + L{0.5\cvMainWidth-0.5\cvTimeDotSep% + -0.5\cvTableSepWidth}@{}}% + \ifcv@refName \cv@refAName & \cv@refBName \fi % + \ifcv@refCompany \\ \cv@refACompany & \cv@refBCompany \fi % + \ifcv@refPosition \\ \cv@refAPosition & \cv@refBPosition \fi % + \ifcv@refAddressLineA \\ \cv@refAAddressLineA & \cv@refBAddressLineA \fi % + \ifcv@refAddressLineB \\ \cv@refAAddressLineB & \cv@refBAddressLineB \fi % + \ifcv@refAddressLineC \\ \cv@refAAddressLineC & \cv@refBAddressLineC \fi % + \ifcv@refWorkPhone \\ \cv@refAPhoneWork & \cv@refBPhoneWork \fi % + \ifcv@refMobilePhone \\ \cv@refAMobilePhone & \cv@refBMobilePhone \fi % + \end{tabular}% + \pgfkeys{/@cv/references/value stored = false}% + \else% + \begin{tabular}{@{}L{0.5\cvMainWidth% + -0.5\cvTimeDotSep}@{}}% + \ifcv@refName \cv@refBName \fi % + \ifcv@refCompany \\ \cv@refBCompany \fi % + \ifcv@refPosition \\ \cv@refBPosition \fi % + \ifcv@refAddressLineA \\ \cv@refBAddressLineA \fi % + \ifcv@refAddressLineB \\ \cv@refBAddressLineB \fi % + \ifcv@refAddressLineC \\ \cv@refBAddressLineC \fi % + \ifcv@refWorkPhone \\ \cv@refBPhoneWork \fi % + \ifcv@refMobilePhone \\ \cv@refBMobilePhone \fi % + \end{tabular}% + \fi% + }% +} +% \end{macrocode} +% +%------------------------------------------------------ +% +% cvSideBar environment +% +% +% \begin{macrocode} +\NewDocumentEnvironment{cvSideBar}{}{% + \vspace*{\fill} + \vspace*{-0.5\cvMargin} + \begin{tikzpicture}[remember picture,overlay] + \fill[cvGreenLight] (current page.north west) rectangle % + ++(\cvSideWidth+2\cvMargin,-\paperheight); + \end{tikzpicture}% + \begin{minipage}{\cvSideWidth} + \begin{center} +}{% + \end{center} + \end{minipage} + \vspace*{\fill} +} +\NewDocumentEnvironment{cvSideBar*}{}{% + \vspace*{\fill} + \vspace*{-0.5\cvMargin} + \begin{tikzpicture}[remember picture,overlay] + \fill[cvGreenLight] (current page.north east) rectangle % + ++(-\cvSideWidth-2\cvMargin,-\paperheight); + \end{tikzpicture}% + \begin{minipage}{\cvSideWidth} + \begin{center} +}{% + \end{center} + \end{minipage} + \vspace*{\fill} +} +% \end{macrocode} +%------------------------------------------------------ +% +% cvProfile environment +% +% \begin{macrocode} +\NewDocumentEnvironment{cvProfile}{}{% + \vspace{\cvSectionSBSep} + \ruleline{Profile} +}{% +} +% \end{macrocode} +%------------------------------------------------------ +% +% cvContact environment +% +% +% \begin{macrocode} +\NewDocumentCommand{\cv@ContactTemplate}{mm}{ + \NewDocumentCommand{#1}{m}{ + \ifcv@contactfirst \\ \else % + \global\cv@contactfirsttrue \fi\node[cv@contactIcon]{#2}; + \pgfmatrixnextcell \node[cv@contactText]{##1}; + } +} +\NewDocumentCommand{\cv@ContactTemplateLink}{mm}{ + \NewDocumentCommand{#1}{mm}{ + \ifcv@contactfirst \\ \else % + \global\cv@contactfirsttrue \fi\node[cv@contactIcon]{#2}; + \pgfmatrixnextcell \node[cv@contactText]{% + \@IfNoValueOrEmptyTF{##1}{##2}{\href{##1}{##2}}}; + } +} +\newif\ifcv@contactfirst +\NewDocumentEnvironment{cvContact}{}{% + \vspace{\cvSectionSBSep} + \ruleline{Contact}% + \vspace{\cvSectionSBSep} + + \global\cv@contactfirstfalse + \cv@ContactTemplate{\cvContactAddress}{\faMapMarker} + \cv@ContactTemplate{\cvContactPhone}{\faPhone} + + \cv@ContactTemplateLink{\cvContactEmail}{\faEnvelope} + \cv@ContactTemplateLink{\cvContactWebsite}{\faGlobe} + \cv@ContactTemplateLink{\cvContactGithub}{\faGithub} + \cv@ContactTemplateLink{\cvContactLinkedin}{\faLinkedinSquare} + \cv@ContactTemplateLink{\cvContactTwitter}{\faTwitter} + \cv@ContactTemplateLink{\cvContactKeybase}{\faKey} + \begin{tikzpicture}[% + every node/.style={inner sep=0pt, outer sep=0pt}] + \matrix [ + column 1/.style={anchor=center}, + column 2/.style={anchor=west,align=left}, + column sep=\cvContactItemSep, + row sep=\cvContactItemSep, + inner sep=0pt, + outer sep=0pt] (contact) \bgroup +}{% + \\\egroup; % \\ required, does not compile otherwise + \end{tikzpicture}% +} +% \end{macrocode} +%------------------------------------------------------ +% +% cvInterests environment +% +% \begin{macrocode} +\newif\ifcv@interestLong +\cv@interestLongtrue +\newcounter{cv@cvInterestCounter} +\setcounter{cv@cvInterestCounter}{1} +\newcounter{cv@cvInterestCounterPrev} +\setcounter{cv@cvInterestCounterPrev}{0} +\newif\ifcv@interestContent +\cv@interestContentfalse +\NewDocumentCommand{\cv@TypesetTableRows}{}{} +\newif\ifcv@interesttikzopen +\cv@interesttikzopenfalse +\NewDocumentCommand{\cv@interestClose}{}{ + \ifcv@interestLong + \ifcv@interesttikzopen + \end{tikzpicture} + \global\cv@interesttikzopenfalse + \fi + \else + \ifcv@interestContent + \begin{tabular}{@{}cl@{}} + \cv@TypesetTableRows + \end{tabular} + \fi + \fi +} +\NewDocumentCommand{\cv@interestOpen}{}{ + \ifcv@interestLong + \ifcv@interesttikzopen + \else + \cv@interesttikzopentrue + \begin{tikzpicture}[% + every node/.style={inner sep=0cm,outer sep=0cm}] + \fi + \else + \global\def\cv@TypesetTableRows{} + \global\cv@interestContentfalse + \fi +} +\NewDocumentCommand{\cv@definecv@interestSection}{}{ + \NewDocumentCommand{\cv@interestSection}{m}{% + \cv@interestClose\\ + \ifcv@interestContent + \vspace*{2\cvSectionSBSep} + \fi + {\color{cvGreen}---} ##1 {\color{cvGreen}---}\\ + \vspace*{\cvSectionSBSep} + \cv@interestOpen + } +} +\NewDocumentCommand{\cv@definecvInterestLong}{}{ + \NewDocumentCommand{\cvInterest}{mm}{% + \ifcv@interestContent % + \node[ + below=\cvItemSep of cv@interest text \the\value{cv@cvInterestCounterPrev}, + cv@interesticon] + (cv@interest icon \the\value{cv@cvInterestCounter}) {##1}; + \node[ + below=\cvInterestDetailsSep of cv@interest icon \the\value{cv@cvInterestCounter}, + cv@interesttext] + (cv@interest text \the\value{cv@cvInterestCounter}) {##2}; + \else + \cv@interestOpen + \node[cv@interesticon] (cv@interest icon \the\value{cv@cvInterestCounter}) {##1}; + \node[ + below=\cvInterestDetailsSep of cv@interest icon \the\value{cv@cvInterestCounter}, + cv@interesttext] + (cv@interest text \the\value{cv@cvInterestCounter}) {##2}; + \fi + \stepcounter{cv@cvInterestCounter} + \stepcounter{cv@cvInterestCounterPrev} + \global\cv@interestContenttrue + } +} +\NewDocumentCommand{\cv@definecvInterestShort}{}{ +% \end{macrocode} +% https://tex.stackexchange.com/questions/12761 +% \begin{macrocode} + %\def\Z{\vphantom{\parbox[c]{1cm}{\Huge Something Long}}} + \NewDocumentCommand{\cvInterest}{mm}{% +% \end{macrocode} +% parse optinal argument if present +% \begin{macrocode} + \g@addto@macro\cv@TypesetTableRows{##1}% + \g@addto@macro\cv@TypesetTableRows{&}% + \g@addto@macro\cv@TypesetTableRows{##2}% + \g@addto@macro\cv@TypesetTableRows{\\[\cvInterestDetailsSep]}% + \global\cv@interestContenttrue + } +} +\ExplSyntaxOn +\NewDocumentEnvironment{cvInterests}{o}{% +% \end{macrocode} +% set defaults +% \begin{macrocode} + \cv@interestLongtrue +% \end{macrocode} +% parse optional arguments +% \begin{macrocode} + + \@IfNoValueOrEmptyTF{#1}{}{% + \str_case:nnF {#1}{ + {long}{\cv@interestLongtrue} + {short}{\cv@interestLongfalse} + }{\ClassError{limecv}{Unkown option `#1' for cvInterests % + environment.}{Only `long' and `short' are valid options % + for this environment.}} + } + + \cv@definecv@interestSection +% \end{macrocode} +% define new commands +% \begin{macrocode} + \NewDocumentCommand{\cvInterestsPersonal}{}{% + \cv@interestSection{\faUser\ \emph{Personal}}} +% \end{macrocode} +% \begin{macrocode} + \NewDocumentCommand{\cvInterestsProfessional}{}{% + \cv@interestSection{\faBriefcase\ \emph{Professional}}} +% \end{macrocode} +% \begin{macrocode} + \ifcv@interestLong + \cv@definecvInterestLong + \else + \cv@definecvInterestShort + \fi + %%%%%% + \vspace{\cvSectionSBSep} + \ruleline{Interests}% + \vspace{\cvSectionSBSep} +}{% + \cv@interestClose +} +\ExplSyntaxOff +% \end{macrocode} +%------------------------------------------------------ +% +% cvProject environment +% +% +% \begin{macrocode} +\newif\ifcv@projectImage +\cv@projectImagefalse +\newif\ifcv@projectLink +\cv@projectLinkfalse +\newif\ifcv@projectWidth +\cv@projectWidthfalse +\newif\ifcv@projectHeight +\cv@projectHeightfalse +\newcounter{cv@projectCurrent} +\setcounter{cv@projectCurrent}{1} +\newcounter{cv@projectPrevious} +\setcounter{cv@projectPrevious}{0} +% \end{macrocode} +% +% \begin{macrocode} +\define@key{cv@Project}{image}{% + \global\def\cv@projectImage{#1}% + \cv@projectImagetrue} +% \end{macrocode} +% +% +% \begin{macrocode} +\define@key{cv@Project}{link}{% + \global\def\cv@projectLink{#1}% + \cv@projectLinktrue} +% \end{macrocode} +% +% +% \begin{macrocode} +\define@key{cv@Project}{width}{% + \global\def\cv@projectWidth{#1}% + \cv@projectWidthtrue} +% \end{macrocode} +% +% +% \begin{macrocode} +\define@key{cv@Project}{height}{% + \global\def\cv@projectHeight{#1}% + \cv@projectHeighttrue} +\NewDocumentCommand{\cv@definecvProject}{}{ + \NewDocumentCommand{\cvProject}{omm}{% +% \end{macrocode} +% default settings +% \begin{macrocode} + \cv@projectImagefalse + \cv@projectLinkfalse + \cv@projectWidthfalse + \cv@projectHeightfalse +% \end{macrocode} +% parse optional arguments +% \begin{macrocode} + \@IfNoValueOrEmptyTF{##1}{}{\setkeys{cv@Project}{##1}} + \ifnodedefined{project \the\value{cv@projectPrevious} % + description}{}{% + \node (project \the\value{cv@projectPrevious} % + description) {}; + } +% \end{macrocode} +% draw image +% \begin{macrocode} + \ifcv@projectImage + \ifcv@projectWidth + \node[below=\cv@projectSep of project % + \the\value{cv@projectPrevious} description] + (project \the\value{cv@projectCurrent} image) + {\includegraphics[width=\cv@projectWidth]{\cv@projectImage}}; + \else + \ifcv@projectHeight + \node[below=\cv@projectSep of project % + \the\value{cv@projectPrevious} description] + (project \the\value{cv@projectCurrent} image) + {\includegraphics[height=\cv@projectHeight]{\cv@projectImage}}; + \else + \ClassError{limecv}{No width or height specified, % + but image specified.}{Always specify the height or % + width if an image is set.} + \fi + \fi +% \end{macrocode} +% draw title (and add href if specified) +% \begin{macrocode} + \node[% + text width=\cvSideWidth, + align=center, + below=\cvProjectDetailsSep of project \the\value{cv@projectCurrent} image] + (project \the\value{cv@projectCurrent} title) {% + \ifcv@projectLink \href{\cv@projectLink}{##2} \else ##2 \fi }; + \else +% \end{macrocode} +% draw title (and add href if specified) +% \begin{macrocode} + \node[below=\cv@projectSep of project % + \the\value{cv@projectPrevious} description, + text width=\cvSideWidth, + align=center] + (project \the\value{cv@projectCurrent} title) {% + \ifcv@projectLink \href{\cv@projectLink}{##2} \else ##2 \fi }; + \fi + \node[ + below=\cvProjectDetailsSep of project \the\value{cv@projectCurrent} title, + text width=\cvSideWidth, + align=center] + (project \the\value{cv@projectCurrent} description) {##3}; + + \setlength\cv@projectSep\cvItemSep +% \end{macrocode} +% increase counter value +% \begin{macrocode} + \stepcounter{cv@projectCurrent} + \stepcounter{cv@projectPrevious} + } +} +% \end{macrocode} +% +% \begin{macrocode} +\NewDocumentEnvironment{cvProjects}{}{% + \vspace{\cvSectionSBSep} + \ruleline{Projects}% + \vspace{\cvSectionSBSep} + \cv@definecvProject + \begin{tikzpicture}[every node/.style={inner sep=0cm,outer sep=0cm}] +}{ + \end{tikzpicture} +} +% \end{macrocode} +%------------------------------------------------------ +% +% cvLanguages environment +% +% \begin{macrocode} +\newcounter{cv@languages} +\setcounter{cv@languages}{1} +\pgfkeys{/@cv/languages/.is family, +/@cv/languages/.unknown/.style = {% + \pgfkeyscurrentpath/\pgfkeyscurrentname/.initial = #1}} +\NewDocumentEnvironment{cvLanguages}{}{% + \NewDocumentCommand{\cvLanguage}{mm}{% + {\globaldefs=1\relax\pgfkeys{% + /@cv/languages/lang\the\value{cv@languages} = ##2}} + \node[cv@languageText]{##1}; \pgfmatrixnextcell % + \node[cv@progressArea] (cv@language \the\value{cv@languages}) {}; \\ + \stepcounter{cv@languages} + }% + \vspace{\cvSectionSBSep} + \ruleline{Languages}% + \vspace{\cvSectionSBSep} + \begin{tikzpicture}[% + every node/.style={text depth=0pt,inner sep=0pt,outer sep=0pt}] + \matrix [ + column 1/.style={anchor=east}, + column sep=1.5\cvSectionSBSep, + row sep=1.5\cvSectionSBSep, + column 2/.style={anchor=west,align=left} + ] (contact) \bgroup +}{% + \\\egroup; + \newcounter{cv@languagelevel} + \setcounter{cv@languagelevel}{1} + \loop\ifnum\value{cv@languagelevel}<\value{cv@languages} + \draw (cv@language \the\value{cv@languagelevel}.west) % + node[% + cv@progressBar, + minimum width=\pgfkeysvalueof{% + /@cv/languages/lang\the\value{cv@languagelevel}}em]% + {}; + \stepcounter{cv@languagelevel} + \repeat + \end{tikzpicture} +} +% \end{macrocode} +%------------------------------------------------------ +% +% cvCoverLetter environment +% +% +% +% cover letter keys +% \begin{macrocode} +\define@key{cvCoverLetter}{name}{% +% \end{macrocode} +% +% +% \begin{macro}{\cv@coverletterName} +% \begin{macrocode} +\global\def\cv@coverletterName{#1}} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macrocode} +\define@key{cvCoverLetter}{company}{% +% \end{macrocode} +% +% +% \begin{macro}{\cv@coverletterCompany} +% \begin{macrocode} +\global\def\cv@coverletterCompany{#1}} +% \end{macrocode} +% \end{macro} +% +% + +% \begin{macrocode} +\define@key{cvCoverLetter}{position}{% +% \end{macrocode} +% +% +% \begin{macro}{\cv@coverletterPosition} +% \begin{macrocode} +\global\def\cv@coverletterPosition{#1}} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macrocode} +\define@key{cvCoverLetter}{address line 1}{% +% \end{macrocode} +% +% +% \begin{macro}{\cv@coverletterAddressLineA} +% \begin{macrocode} +\global\def\cv@coverletterAddressLineA{#1}} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macrocode} +\define@key{cvCoverLetter}{address line 2}{% +% \end{macrocode} +% +% +% \begin{macro}{\cv@coverletterAddressLineB} +% \begin{macrocode} +\global\def\cv@coverletterAddressLineB{#1}} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macrocode} +\define@key{cvCoverLetter}{address line 3}{% +% \end{macrocode} +% +% +% \begin{macro}{\cv@coverletterAddressLineC} +% \begin{macrocode} +\global\def\cv@coverletterAddressLineC{#1}} +\NewDocumentCommand{\cv@definecvBeneficiary}{}{ + \NewDocumentCommand{\cvBeneficiary}{m}{% + \setkeys{cvCoverLetter}{name={},company={}, + position={},address line 1={},address line 2={}, + address line 3={},##1} + \begin{tabular}{@{}l} + \@IfNoValueOrEmptyTF{% + \cv@coverletterName}{}{% + \MakeUppercase{\cv@coverletterName}} % + \@IfNoValueOrEmptyTF{% + \cv@coverletterCompany}{}{\\ % + \cv@coverletterCompany} % + \@IfNoValueOrEmptyTF{% + \cv@coverletterPosition}{}{\\ % + \cv@coverletterPosition} % + \@IfNoValueOrEmptyTF{% + \cv@coverletterAddressLineA}{}{\\ % + \cv@coverletterAddressLineA} % + \@IfNoValueOrEmptyTF{% + \cv@coverletterAddressLineB}{}{\\ % + \cv@coverletterAddressLineB} % + \@IfNoValueOrEmptyTF{% + \cv@coverletterAddressLineC}{}{\\ % + \cv@coverletterAddressLineC} % + \end{tabular}% + \vspace{\cvMargin} + } +} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\NewDocumentCommand{\cv@definecvFullName}{}{ + \NewDocumentCommand{\cvFullName}{}{% + \pgfkeysvalueof{/@cv/info/first name} % + \pgfkeysvalueof{/@cv/info/last name} + } +} +\NewDocumentEnvironment{cvCoverLetter}{}{% + \begin{tikzpicture}[% + remember picture, + overlay, + every node/.style={inner sep=0cm,outer sep=0cm}] +% \end{macrocode} +% draw green background +% \begin{macrocode} + \begin{scope}[on background layer] + \fill[cvGreenLight] (current page.north west) rectangle % + ++(\paperwidth,-\cvCoverLetterHeight); + \end{scope} + \draw (current page.north east) % + ++(-0.5\paperwidth+0.5\cvCoverLetterWidth, + -\cvCoverLetterHeight/2) node (cv@h7) {}; + \node[anchor=east] at (cv@h7) (cv cover letter name){% + \fontsize{50}{60}\selectfont +% \end{macrocode} +% trick to expand argument such that `kleft` sees an +% alphabetic constant (i.e. a single letter) +% \begin{macrocode} + \begingroup\edef\y{\endgroup% + \noexpand\kleft{\cv@FirstNameLetter}}% + \y + \StrGobbleLeft{\pgfkeysvalueof{/@cv/info/first name}}{1}\space + \StrGobbleRight{\pgfkeysvalueof{/@cv/info/last name}}{1} +% \end{macrocode} +% same trick +% trick to expand argument such that `kleft` sees an +% alphabetic constant (i.e. a single letter) +% \begin{macrocode} + \begingroup\edef\y{\endgroup% + \noexpand\kright{\cv@LastNameLetter}}% + \y + }; + \node[% + align=right, + cvAccent, + below=\cvCoverLetterPositionSpacing of cv cover letter name.south east, + anchor=north east]{% + \StrGobbleRight{\pgfkeysvalueof{/@cv/info/position}}{1} + \begingroup\edef\y{\endgroup% + \noexpand\kright{\cv@PositionLetter}}% + \y}; + + \begin{scope}[on background layer] + \draw[line width=\cvCoverLetterLineWidth,cvGreen] + ($(cv cover letter name.south west)+(0,-\cvCoverLetterLineSpacing)$) to + ($(cv cover letter name.south east)+(0,-\cvCoverLetterLineSpacing)$); + \end{scope} + \end{tikzpicture} + \vspace{\dimexpr\cvCoverLetterHeight\relax} + + \begin{center} + \begin{minipage}{\cvCoverLetterWidth} + \today + + \vspace{\baselineskip} + \cv@definecvBeneficiary + \cv@definecvFullName +}{% + \end{minipage} + \end{center} +} +% \end{macrocode} +%------------------------------------------------------ +% +% cvID macro +% +% +% \begin{macrocode} +\pgfkeys{/@cv/info/.is family, + /@cv/info/.unknown/.style = % + {\pgfkeyscurrentpath/\pgfkeyscurrentname/% + .initial = #1}} +% \end{macrocode} +% first name, second name, picture, position +% \begin{macrocode} +\NewDocumentCommand{\cvID}{mmmm}{ + \@IfNoValueOrEmptyTF{#3}{}{ + \begin{tikzpicture} + \node[ + circle, + text=white, + minimum size=\cvPictureWidth, + path picture={ + \node at (path picture bounding box.center){ + \includegraphics[width=\cvPictureWidth]{#3} + }; + }] + {}; + \end{tikzpicture}\\ + } + {\LARGE + #1 + \vspace{\cvIDNameSep} + #2} + + \vspace{\cvPositionSep} + + \@IfNoValueOrEmptyTF{#4}{}{\color{cvAccent} #4} + + \vspace{\cvPositionSep} + {\globaldefs=1\relax\pgfkeys{/@cv/info/first name = % + #1}\def\cv@FirstNameLetter{\extract{#1}{1}}} + {\globaldefs=1\relax\pgfkeys{/@cv/info/last name = % + #2}\def\cv@LastNameLetter{\extract{#2}{-1}}} + {\globaldefs=1\relax\pgfkeys{/@cv/info/position = % + #4}\def\cv@PositionLetter{\extract{#4}{-1}}} +} +% \end{macrocode} + +% +% \iffalse +%</class> +% \fi +% +% \Finale +\endinput + |