%% start of file `moderncvskillmatrix.sty'.
%% Copyright 2021 David Seus (cryptointerest@posteo.de).
%
% This package provides a skill matrix template for the moderncv package.
% Some recruiting firms require applicants to rate their skills, computer 
% skills, management tools, or similar in a table involving a graphical 
% illustration of their skill level. This package implements this idea 
% and provides the following commands to use within the moderncv 
% package:
% 
% 
% PUBLIC COMMANDS
%     \cvskill{<1-5>}
%         Illustrate skill level with little colored boxes.
%         By default five skill levels are predefined.   
% 
%         Input: 
%             input_1:    integer between 0 and 5
% 
%         Example usages: 
%             \cvskill{3}
% 
% 
%     \cvskilllegend[*][<post_padding>][<first_level>][<second_level>][<third_level>][<fourth_level>][<fifth_level>]{<name>}
%         Print legend table explaining the meaning of \cvskill{1}...\cvskill{5}.
% 
%         Input:
%             asterix (optional): include vertical (dashed) lines. This behaviour depends on the body style. 
%                                 For the fancy style, the asterix has no meaning.
%             input_1 (optional): padding length appended to the legend, default: <0.25em>
%             input_2 (optional): string describing meaning of \cvskill{1}, default: <basic knowledge>
%             input_3 (optional): string describing meaning of \cvskill{2}, default: <intermediate knowledge with some project experience>
%             input_4 (optional): string describing meaning of \cvskill{3}, default: <extensive project experience>
%             input_5 (optional): string describing meaning of \cvskill{4}, default: <deepened expert knowledge>
%             input_6 (optional): string describing meaning of \cvskill{5}, default: <expert/guru>
%             input_7:            string giving a name to the legend, default: <>
% 
%         Example usages:
%             \cvskilllegend{}    print default legend
%             \cvskilllegend[0.5em]{Legend}   print default legend, but adjust post padding and display the word ``Legend''.
%             \cvskilllegend*[0.2em][Grundkenntnisse][Grundkenntnisse und eigene Erfahrung in Projekten][Umfangreiche Erfahrung in Projekten][Vertiefte Expertenkenntnisse][Experte/Guru]{Legende}     Fully adjust legend to German example and including dashed lines
% 
%         Note:
%             -The width of the columns can be adjusted by the \setcvskilllegendcolumns, see \setcvskilllegendcolumns
%             -The design of the table is such that the <second_level> entry stands in the first column but 
%             occupies rows two and three. This has been done to accomodate english and german defaults.
%             An alternative is provided by \cvskillplainlegend
% 
% 
%     \cvskillplainlegend[*][<post_padding>][<first_level>][<second_level>][<third_level>][<fourth_level>][<fifth_level>]{<name>}
%         Print alternative legend table explaining the meaning of \cvskill{1}...\cvskill{5}.
%         In this legend, the first three skill levels are in one column
% 
%         Input:
%             asterix (optional): include vertical (dashed) lines. This behaviour depends on the body style. 
%                                 For the fancy style, the asterix has no meaning.
%             input_1 (optional): padding length appended to the legend, default: <0.25em>
%             input_2 (optional): string describing meaning of \cvskill{1}, default: <basic knowledge>
%             input_3 (optional): string describing meaning of \cvskill{2}, default: <intermediate knowledge with some project experience>
%             input_4 (optional): string describing meaning of \cvskill{3}, default: <extensive project experience>
%             input_5 (optional): string describing meaning of \cvskill{4}, default: <deepened expert knowledge>
%             input_6 (optional): string describing meaning of \cvskill{5}, default: <expert/guru>
%             input_7:            string giving a name to the legend, default: <>
% 
%         Example usages:
%             \cvskillplainlegend{}    print default legend
%             \cvskillplainlegend[0.5em]{Legend}   print default legend, but adjust post padding and display the word ``Legend''.
%             \cvskillplainlegend*[0.2em][Grundkenntnisse][Grundkenntnisse und eigene Erfahrung in Projekten][Umfangreiche Erfahrung in Projekten][Vertiefte Expertenkenntnisse][Experte/Guru]{Legende}     Fully adjust legend to German example and including dashed lines
% 
%         Note:
%             -The width of the columns can be adjusted by the \setcvskilllegendcolumns, see \setcvskilllegendcolumns
% 
% 
%     \cvskillhead[<post_padding>][<Level>][<Skill>][<Years>][<Comment>]%
%         add skill matrix line acting as header explaining the meaning of columns.
% 
%         Input:
%             input_1 (optional): padding length appended to the legend, default: <0.25em>
%             input_2 (optional): string naming the level column (2nd column), default: <Level>
%             input_3 (optional): string naming the skill column (3nd column), default: <Skill>
%             input_4 (optional): string naming the experience-in-years column (4th column), default: <Years>
%             input_5 (optional): string naming the comment column (5th column), default: <Comment>
% 
%         Example usages:
%             \cvskillhead    print default head.
%             \cvskillhead[0.5em]   print default head, but adjust post padding.
%             \cvskillhead[0.25em][Level][F\"ahigkeit][Jahre][Bemerkung]     Fully adjust head to German example
% 
%         Note:   
%             - The width of the columns can be adjusted by the \setcvskillcolumns command, see \setcvskillcolumns.
% 
% 
%     \cvskillentry[*][<post_padding>]{<skill_cathegory>}{<0-5>}{<skill_name>}{<years_of_experience>}{<comment>}%
%         add cvskill matrix row.
% 
%         Input:
%             asterix (optional): include horizontal (dashed) line above the entered line. This behaviour depends on the body style. 
%                                 For the fancy style, the asterix has no meaning.
%             input_1 (optional): padding length appended to the legend, default: <0.25em>
%             input_2: string, naming skill cathegory, default: <>
%             input_3: integer between 0 and 5, describing level of skill. \cvskill{input_2} is called internally, default: <>
%             input_4: string, naming the skill, default: <>
%             input_5: positive real number, stating the number of years of experience with this skill , default: <>
%             input_6: string, explaining details w.r.t. that particual skill default: <>
% 
%         Example usages:
%             \cvskillentry*{Language:}{3}{Python}{2}{I have done a million projects with Python}
%             \cvskillentry{}{2}{Lilypond}{14}{So much sheet music! Man I'm the best!}
%             \cvskillentry{}{3}{\LaTeX}{14}{Clearly I rock at \LaTeX}
%             \cvskillentry*[1.5em]{OS:}{3}{Linux}{2}{I only use Archlinux}
% 
%         Note:   
%             - The width of the columns can be adjusted by the \setcvskillcolumns command, see \setcvskillcolumns.
% 
% 
%     \setcvskillcolumns[<width>][<factor>][<exp_width>]
%         adjust column width of skill table
% 
%         The \cvskillentry command comes with default FIXED width definitions of the kill matrix for the columns 
%         based on the author's own skill matrix. This is necessary to ensure that the entries are nicely aligned 
%         and actually yield a decent looking table. The defaults depend on the style used and are chosen reasonably.
%         However, depending on the user input and the style that is used some of the columns might need adjustments. 
%         The \setcvskillcolumns command provides means to influence the width of the first, the third and the fourth 
%         skill matrix column. The second column containg the output of \cvskill remains fixed width. The last column,
%         the comment column gets recalculated according to the setting of the other columns.
% 
%         Input
%             Input_1 (optional):     width smaller than \textwidth,  default <\skillmatrix@hintscolumnwidth>
%             Input_2 (optional):     float between 0 and 1 adjusting how much percent of the table width without 
%                                     the first column is used columns two, three and four. Through this parameter
%                                     the width of the 3rd column (skill name) can be adjusted,   default <\skillmatrix@columnwidth>
%             Input_3 (optional):     width smaller than \textwidth, setting the width of the 4th column 
%                                     (Years of experience), default <\cvskill@experiencewidth>
% 
%         Example usage
%             \setcvskillcolumns[5em][][]%    adjust first column. Same as \setcvskillcolumns[5em]
%             \setcvskillcolumns[][0.45][]%   adjust third (skill) column. Same as \setcvskillcolumns[][0.45]
%             \setcvskillcolumns[][][\widthof{``Year''}]%     adjust fourth (years) column.
%             \setcvskillcolumns[\widthof{``Language''}][0.48][]%     adjust 1st and 3rd columns. Same as \setcvskillcolumns[\widthof{``Language''}][0.45]    
%             \setcvskillcolumns[\widthof{``Management Tools''}][0.6][3em]%   ajust all at once.
% 
%         Note
%             - For the styles 'classic' and 'casual' the first column is set to hintscolumnwidth such that
%                 it aligns with the rest of the entries. A readjustment of the first column should therefor 
%                 be avoided. It is recomended to only use \setcvskillcolumns in the form of 
%                 \setcvskillcolumns[][<factor>][<width>], thereby leaving the defaults in place for the first column.
% 
% 
%     \setcvskilllegendcolumns[<width>][<factor>]
%         adjust column width of legend
% 
%         The \cvskilllegend command comes with default FIXED width definitions for the columns of the legend matrix 
%         such that the default english and german examples look good. 
%         However, depending on the user input (translation) and the style that is used some adjustment might be needed. 
%         The \setcvskilllegendcolumns command provides means to influence all columns except the ones containing 
%         \cvskill commands. The second column containg the output of \cvskill remains fixed width. The last column,
%         the comment column gets recalculated according to the setting of the other columns.
% 
%         Input
%             Input_1 (optional):     length smaller than \textwidth influencing the width of the first column 
%                                     where depending on the style the legend_string gets printed. In case the 
%                                     string is left empty adjusting this width allows moving the legend horizontally.  
%                                     Default <\skilllegend@hintscolumnwidth>
%             Input_2 (optional):     float between 0 and 1 influencing the width of the left legend descritor column, 
%                                     aka \cvskilllegend@leftdescriptorwidth. The desriptor column on the right, 
%                                     \cvskilllegend@rightdescriptorwidth is influenced by the factor 1-<factor>.
%                                     Default <\skilllegend@leftdesriptorfactor>
% 
%         Example usage
%             \setcvskilllegendcolumns[][0.45]%%    adjust left desriptor column.
%             \setcvskilllegendcolumns[\widthof{``Legend''}][0.45]%   adjust both left descriptor column and string column
% 
%         Note
%             - Due to implementation of \cvskilllegend for style 'fancy' (moderncvbodyv) 
%                 the first optional variable has no effect in this case.
%             - For the styles 'classic' and 'casual' the first column is set to hintscolumnwidth such that
%                 it aligns with the rest of the entries. A readjustment of the first column should therefor 
%                 be avoided. It is recomended to only use \cvskilllegend in the form of 
%                 \cvskilllegend[][<factor>], thereby leaving the defaults in place for the first column.
%             - For style 'banking' the first column is set to align with the rest of the \cvskillentry entries
%                 Therefor adjusting the first column can be used to widen the table while moving it around. If no 
%                 legend string is used, setting \cvskilllegend[0em] maximises the real enstate for the legend.
% 
% 
% PRIVATE COMMANDS
% 
%    \recompute@cvskillmatrix@lengths
%         compute all lengths necessary for the skill matrix depending on 
%         the moderncv style (moderncvbody)
%         
%         Input:  none
%         
%         Example usage (only internally in moderncvbody<i-v>.sty)
%             \recompute@cvskillmatrix@lengths 
% 
% 
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License version 1.3c,
% available at http://www.latex-project.org/lppl/.


%-------------------------------------------------------------------------------
%                identification
%-------------------------------------------------------------------------------
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{moderncvskillmatrix}[2021-07-28 v2.2.0 modern curriculum vitae and letter skill matrix]

% The definitions need to be adjusted depending on which moderncvbody<i-v>.sty style is usde. 
% body type options: "moderncvbodyi" (default), "moderncvbodyii", "moderncvbodyiii", "moderncvbodyiv" or "moderncvbodyv" 
\@initializeif{\if@moderncvbodyi}\@moderncvbodyifalse
\DeclareOption{moderncvbodyi}{\@moderncvbodyitrue\@moderncvbodyiifalse\@moderncvbodyiiifalse\@moderncvbodyivfalse\@moderncvbodyvfalse}
\@initializeif{\if@moderncvbodyii}\@moderncvbodyiifalse % this option is added in case moderncvbodyii gets implemented standalone
\DeclareOption{moderncvbodyii}{\@moderncvbodyifalse\@moderncvbodyiitrue\@moderncvbodyiiifalse\@moderncvbodyivfalse\@moderncvbodyvfalse}
\@initializeif{\if@moderncvbodyiii}\@moderncvbodyiiifalse
\DeclareOption{moderncvbodyiii}{\@moderncvbodyifalse\@moderncvbodyiifalse\@moderncvbodyiiitrue\@moderncvbodyivfalse\@moderncvbodyvfalse}
\@initializeif{\if@moderncvbodyiv}\@moderncvbodyivfalse
\DeclareOption{moderncvbodyiv}{\@moderncvbodyifalse\@moderncvbodyiifalse\@moderncvbodyiiifalse\@moderncvbodyivtrue\@moderncvbodyvfalse}
\@initializeif{\if@moderncvbodyv}\@moderncvbodyvfalse
\DeclareOption{moderncvbodyv}{\@moderncvbodyifalse\@moderncvbodyiifalse\@moderncvbodyiiifalse\@moderncvbodyivfalse\@moderncvbodyvtrue}

\DeclareOption*{}% avoid choking on unknown options
\ExecuteOptions{moderncvbodyi}
\ProcessOptions*\relax% \ProcessOptions* processes the options in the order provided (i.e., with the later ones possibly overriding the former ones), while \ProcessOptions processes them in the order of the package

%-------------------------------------------------------------------------------
%                required packages
%-------------------------------------------------------------------------------
\RequirePackage{tikz}
\RequirePackage{multirow}
% package arydshln is needed for the dashed lines but is incompatible with fancy style
\if@moderncvbodyv%
%     \RequirePackage{arydshln} % incompatible with fancy style
\else%
    \RequirePackage{arydshln} % incompatible with fancy style
\fi

% %-------------------------------------------------------------------------------
% %                \cvskill command
% %-------------------------------------------------------------------------------
% The code for the Skilllevel illustration with the little boxes.
% This is idea stolen from the limecv package, see https://github.com/opieters/limecv.git
\@initializelength{\cvSkill@RectangleSize}
\setlength{\cvSkill@RectangleSize}{1.2ex}
\newcount\my@repeat@count
\DeclareDocumentCommand{\cvskill}{m}{%
%   Illustrate skill level with little colored boxes.
%   By default five skill levels are predefined.   
% 
%   Input: 
%       integer between 0 and 5
%   Example usage: 
%       \cvskill{3}
    \begingroup
        \my@repeat@count=\z@
        \@whilenum\my@repeat@count<#1\do{\tikz\filldraw[color1] (0, 0) rectangle (\cvSkill@RectangleSize, \cvSkill@RectangleSize);\advance%
        \my@repeat@count\@ne\,}%
        \my@repeat@count=\numexpr5-\z@\relax
        \@whilenum\my@repeat@count>#1\do{\tikz\filldraw[color2!30] (0, 0) rectangle (\cvSkill@RectangleSize, \cvSkill@RectangleSize);\advance%
        \my@repeat@count\m@ne\,}%
    \endgroup
}% end \cvskill

% %-------------------------------------------------------------------------------
% %                \recompute@cvskillmatrix@lengths
% %-------------------------------------------------------------------------------

% initialise lengths needed for the skillmatrix
\@initializelength{\cvskill@width}
\@initializelength{\cvskill@descriptorwidth}
\@initializelength{\cvskill@experiencewidth}
\@initializelength{\skillmatrix@columnwidth}
\@initializelength{\skillmatrix@commentwidth}
\@initializelength{\skillmatrix@padding}
\@initializelength{\skillmatrix@hintscolumnwidth}
\@initializelength{\skillmatrix@bodylength}
\@initializelength{\cvskilllegend@leftdescriptorwidth}
\@initializelength{\cvskilllegend@rightdescriptorwidth}
\@initializelength{\skilllegend@hintscolumnwidth}
\@initializelength{\skilllegend@padding}
\@initializelength{\skilllegend@bodylength}

% \separatorrulewidth is defined in moderncvbodyv.sty and we need to 
% define it to not throw an error in the other cases
\if@moderncvbodyv%
% 
\else%
    \@initializelength{\separatorrulewidth}
    \setlength{\separatorrulewidth}{1ex}
\fi

\DeclareDocumentCommand{\skilllegend@leftdesriptorfactor}{}{}%
%% DEFINITION \recompute@cvskillmatrix@lengths
% declare the command \recompute@cvskillmatrix@lengths empty
\DeclareDocumentCommand{\recompute@cvskillmatrix@lengths}{}{}%
%   compute all lengths necessary for the skill matrix depending on 
%   the moderncv style (moderncvbody)
%   
%   Input:  none
%   
%   Example usage (only internally in moderncvbody<i-v>.sty)
%       \recompute@cvskillmatrix@lengths 

% Definition of \recompute@cvskillmatrix@lengths for moderncvbodyi
\if@moderncvbodyi%
    \RenewDocumentCommand{\recompute@cvskillmatrix@lengths}{}{%
        \setlength{\skillmatrix@padding}{1ex}%
        \setlength{\skillmatrix@hintscolumnwidth}{\hintscolumnwidth}%
        \setlength{\cvskill@width}{\widthof{\cvskill{5}}}%
        \setlength{\cvskill@experiencewidth}{\widthof{``Year''}}%
        \setlength{\skillmatrix@bodylength}{\maincolumnwidth}%
        \setlength{\skillmatrix@columnwidth}{0.45\skillmatrix@bodylength}%
        \setlength{\cvskill@descriptorwidth}{\skillmatrix@columnwidth-\cvskill@width-\cvskill@experiencewidth}%
        \setlength{\skillmatrix@commentwidth}{\skillmatrix@bodylength-\skillmatrix@columnwidth-3\skillmatrix@padding}%
        % lengths and definitions needed for the legends
        % note that \skillmatrix@padding also affects the appearance of legends
        \setlength{\skilllegend@padding}{0.25ex}%
        \setlength{\skilllegend@hintscolumnwidth}{\hintscolumnwidth}%
        \setlength{\skilllegend@bodylength}{\skillmatrix@bodylength}%
        \RenewDocumentCommand{\skilllegend@leftdesriptorfactor}{}{0.5}%
    }
\fi
% Definition of \recompute@cvskillmatrix@lengths for moderncvbodyiii
\if@moderncvbodyiii%
    \RenewDocumentCommand{\recompute@cvskillmatrix@lengths}{}{%
        \setlength{\skillmatrix@padding}{1ex}%
        \setlength{\separatorcolumnwidth}{\skillmatrix@padding}%
        \setlength{\skillmatrix@hintscolumnwidth}{\widthof{``Language''}}%
        \setlength{\cvskill@width}{\widthof{\cvskill{5}}}%
        \setlength{\cvskill@experiencewidth}{\widthof{``Year''}}%
        \setlength{\skillmatrix@bodylength}{\maincolumnwidth-\skillmatrix@hintscolumnwidth-\separatorcolumnwidth}%
        \setlength{\skillmatrix@columnwidth}{0.45\skillmatrix@bodylength}%
        \setlength{\cvskill@descriptorwidth}{\skillmatrix@columnwidth-\cvskill@width-\cvskill@experiencewidth}%
        \setlength{\skillmatrix@commentwidth}{\skillmatrix@bodylength-\skillmatrix@columnwidth-3\skillmatrix@padding}%
        % lengths and definitions needed for the legends
        % note that \skillmatrix@padding also affects the appearance of legends      
        \setlength{\skilllegend@padding}{0.25ex}%
        \setlength{\skilllegend@hintscolumnwidth}{\skillmatrix@hintscolumnwidth}%
        \setlength{\skilllegend@bodylength}{\skillmatrix@bodylength}%
        \RenewDocumentCommand{\skilllegend@leftdesriptorfactor}{}{0.5}%
    }
\fi
% Definition of \recompute@cvskillmatrix@lengths for moderncvbodyiv
\if@moderncvbodyiv%
    \RenewDocumentCommand{\recompute@cvskillmatrix@lengths}{}{%
        \setlength{\skillmatrix@padding}{1ex}
        \setlength{\separatorcolumnwidth}{\skillmatrix@padding}
        \setlength{\skillmatrix@hintscolumnwidth}{\widthof{``Languagi''}}
        \setlength{\cvskill@width}{\widthof{\cvskill{5}}}
        \setlength{\cvskill@experiencewidth}{\widthof{``Year''}}
        \setlength{\skillmatrix@bodylength}{\maincolumnwidth-\skillmatrix@hintscolumnwidth-\separatorcolumnwidth}
        \setlength{\skillmatrix@columnwidth}{0.45\skillmatrix@bodylength}%
        \setlength{\cvskill@descriptorwidth}{\skillmatrix@columnwidth-\cvskill@width-\cvskill@experiencewidth}
        \setlength{\skillmatrix@commentwidth}{\skillmatrix@bodylength-\skillmatrix@columnwidth-3\skillmatrix@padding}%
        % lengths and definitions needed for the legends
        % note that \skillmatrix@padding also affects the appearance of legends    
        \setlength{\skilllegend@padding}{0.25ex}
        \setlength{\skilllegend@hintscolumnwidth}{0ex}%\skillmatrix@hintscolumnwidth
        \setlength{\skilllegend@bodylength}{\maincolumnwidth}
        \RenewDocumentCommand{\skilllegend@leftdesriptorfactor}{}{0.45}%
    }
\fi
% Definition of \recompute@cvskillmatrix@lengths for moderncvbodyv
\if@moderncvbodyv%
    \RenewDocumentCommand{\recompute@cvskillmatrix@lengths}{}{%
        \setlength{\skillmatrix@padding}{1ex}%
        \setlength{\skillmatrix@hintscolumnwidth}{\widthof{``Languages''}}%
        \setlength{\cvskill@width}{\widthof{\cvskill{5}}}%
        \setlength{\cvskill@experiencewidth}{\widthof{``Year''}}%
        \setlength{\skillmatrix@bodylength}{\maincolumnwidth-\skillmatrix@hintscolumnwidth-\skillmatrix@padding}%\skillmatrix@hintscolumnwidth
        \setlength{\skillmatrix@columnwidth}{0.45\skillmatrix@bodylength}%
        \setlength{\cvskill@descriptorwidth}{\skillmatrix@columnwidth-\cvskill@width-\cvskill@experiencewidth}%
        \setlength{\skillmatrix@commentwidth}{\skillmatrix@bodylength-\skillmatrix@columnwidth-3\skillmatrix@padding}%
        % lengths and definitions needed for the legends
        % note that \skillmatrix@padding also affects the appearance of legends   
        \setlength{\skilllegend@padding}{0.25ex}%
        \setlength{\skilllegend@hintscolumnwidth}{\skillmatrix@hintscolumnwidth}%
        \setlength{\skilllegend@bodylength}{\maincolumnwidth}%
        \RenewDocumentCommand{\skilllegend@leftdesriptorfactor}{}{0.48}%
    }%
\fi

% %-------------------------------------------------------------------------------
% %                \setcvskillcolumns and \setcvskilllegendcolumns
% %-------------------------------------------------------------------------------
% \setcvskillcolumns[<width>][<factor>][<exp_width>]
\DeclareDocumentCommand{\setcvskillcolumns}{+O{\skillmatrix@hintscolumnwidth} +O{\skillmatrix@columnwidth} +O{\cvskill@experiencewidth}}{%
%   adjust column width of skill table
% 
%   The \cvskillentry command comes with default FIXED width definitions of the kill matrix for the columns 
%   based on the author's own skill matrix. This is necessary to ensure that the entries are nicely aligned 
%   and actually yield a decent looking table. The defaults depend on the style used and are chosen reasonably.
%   However, depending on the user input and the style that is used some of the columns might need adjustments. 
%   The \setcvskillcolumns command provides means to influence the width of the first, the third and the fourth 
%   skill matrix column. The second column containg the output of \cvskill remains fixed width. The last column,
%   the comment column gets recalculated according to the setting of the other columns.
% 
%   Input
%       Input_1 (optional):     width smaller than \textwidth,  default <\skillmatrix@hintscolumnwidth>
%       Input_2 (optional):     float between 0 and 1 adjusting how much percent of the table width without 
%                               the first column is used columns two, three and four. Through this parameter
%                               the width of the 3rd column (skill name) can be adjusted,   default <\skillmatrix@columnwidth>
%       Input_3 (optional):     width smaller than \textwidth, setting the width of the 4th column 
%                               (Years of experience), default <\cvskill@experiencewidth>
% 
%   Example usage
%       \setcvskillcolumns[5em][][]%    adjust first column. Same as \setcvskillcolumns[5em]
%       \setcvskillcolumns[][0.45][]%   adjust third (skill) column. Same as \setcvskillcolumns[][0.45]
%       \setcvskillcolumns[][][\widthof{``Year''}]%     adjust fourth (years) column.
%       \setcvskillcolumns[\widthof{``Language''}][0.48][]%     adjust 1st and 3rd columns. Same as \setcvskillcolumns[\widthof{``Language''}][0.45]    
%       \setcvskillcolumns[\widthof{``Management Tools''}][0.6][3em]%   ajust all at once.
% 
%   Note
%       - For the styles 'classic' and 'casual' the first column is set to hintscolumnwidth such that
%         it aligns with the rest of the entries. A readjustment of the first column should therefor 
%         be avoided. It is recomended to only use \setcvskillcolumns in the form of 
%         \setcvskillcolumns[][<factor>][<width>], thereby leaving the defaults in place for the first column.
% 
    \def\arg@new@hintscolumnwidth{#1}% <-- all these terminal % signs are necessary for the fancy style to not show weird spaces!!!
    \def\arg@new@bodyLengthFactor{#2}% 
    \def\arg@new@experienceWidth{#3}% 
    % Check for empty arguments. Defaults are given. Thus a call of \setcvskillcolumns 
    % without any arguments leads to nonempty arguments \arg@new@hintscolumnwidth and
    % \def\arg@new@bodyLengthFactor{#2}. However, we need to take care of calls like 
    % \setcvskillcolumns[], \setcvskillcolumns[][], \setcvskillcolumns[][][] or even 
    % \setcvskillcolumns[<somelength>][], \setcvskillcolumns[][<somefactor>]  \setcvskillcolumns[][][<length>]
    \ifdefempty{\arg@new@hintscolumnwidth}{%
        % Case \setcvskillcolumns[], \setcvskillcolumns[][] or \setcvskillcolumns[][<somefactor>]
        \ifdefempty{\arg@new@bodyLengthFactor}{%
            % Case \setcvskillcolumns[][] do nothing here and check if third argument is empty
            \ifdefempty{\arg@new@experienceWidth}{%
                % Case \setcvskillcolumns[][][] do nothing here
            }{%
                % Case \setcvskillcolumns[][][<length>]. reset \cvskill@experiencewidth and
                % \cvskill@descriptorwidth accordingly
                \setlength{\cvskill@experiencewidth}{\arg@new@experienceWidth}%
                \setlength{\cvskill@descriptorwidth}{\skillmatrix@columnwidth-\cvskill@width-\cvskill@experiencewidth}%
            }%
        }{%
            % Case \setcvskillcolumns[][<somefactor>], \setcvskillcolumns[][<somefactor>][<possilly length>]
            \setlength{\skillmatrix@columnwidth}{\arg@new@bodyLengthFactor\skillmatrix@bodylength}%
            \ifdefempty{\arg@new@experienceWidth}{%
                % Case \setcvskillcolumns[][<somefactor>][] do nothing here
            }{%
                % Case \setcvskillcolumns[][<somefactor>][<length>]. reset \cvskill@experiencewidth and
                % \cvskill@descriptorwidth accordingly
                \setlength{\cvskill@experiencewidth}{\arg@new@experienceWidth}%
                \setlength{\cvskill@descriptorwidth}{\skillmatrix@columnwidth-\cvskill@width-\cvskill@experiencewidth}%
            }%            
            \setlength{\cvskill@descriptorwidth}{\skillmatrix@columnwidth-\cvskill@width-\cvskill@experiencewidth}%
            \setlength{\skillmatrix@commentwidth}{\skillmatrix@bodylength-\skillmatrix@columnwidth-3\skillmatrix@padding}%
        }%
        % Case \setcvskillcolumns[] nothing needs to be done here recalculate lengths affected by the change
    }{% 
        % Case \setcvskillcolumns, \setcvskillcolumns[<width>], \setcvskillcolumns[<width>][] 
        % or \setcvskillcolumns[<width>][<somefactor>]
        \setlength{\skillmatrix@hintscolumnwidth}{\arg@new@hintscolumnwidth}%
        \setlength{\skillmatrix@bodylength}{\maincolumnwidth-\skillmatrix@hintscolumnwidth-\separatorcolumnwidth}%
        % in case second argument is given but left empty use default
        \ifdefempty{\arg@new@bodyLengthFactor}{%
            % Case \setcvskillcolumns[<width>][] do nothing here and use default
            % \skillmatrix@columnwidth and check third argument
            \ifdefempty{\arg@new@experienceWidth}{%
                % Case \setcvskillcolumns[<width>][][] do nothing here
            }{%
                % Case \setcvskillcolumns[<width>][][<length>]. reset \cvskill@experiencewidth and
                % \cvskill@descriptorwidth accordingly
                \setlength{\cvskill@experiencewidth}{\arg@new@experienceWidth}%
%                 \setlength{\cvskill@descriptorwidth}{\skillmatrix@columnwidth-\cvskill@width-\cvskill@experiencewidth}%
            }%
        }{%
            % Case \setcvskillcolumns, \setcvskillcolumns[<width>], \setcvskillcolumns[<width>][<somefactor>]
            \setlength{\skillmatrix@columnwidth}{\arg@new@bodyLengthFactor\skillmatrix@bodylength}%
            \ifdefempty{\arg@new@experienceWidth}{%
                % Case \setcvskillcolumns[<width>][<somefactor>][] do nothing here
            }{%
                % Case \setcvskillcolumns[<width>][<somefactor>][<length>]. reset \cvskill@experiencewidth and
                % \cvskill@descriptorwidth accordingly
                \setlength{\cvskill@experiencewidth}{\arg@new@experienceWidth}%
%                 \setlength{\cvskill@descriptorwidth}{\skillmatrix@columnwidth-\cvskill@width-\cvskill@experiencewidth}%
            }%
        }%
        \setlength{\cvskill@descriptorwidth}{\skillmatrix@columnwidth-\cvskill@width-\cvskill@experiencewidth}%
        \setlength{\skillmatrix@commentwidth}{\skillmatrix@bodylength-\skillmatrix@columnwidth-3\skillmatrix@padding}%
    }%
}%
% 
% \setcvskilllegendcolumns[<width>][<factor>]
\DeclareDocumentCommand{\setcvskilllegendcolumns}{+O{\skilllegend@hintscolumnwidth} +O{\skilllegend@leftdesriptorfactor}}{%
%   adjust column width of legend
% 
%   The \cvskilllegend command comes with default FIXED width definitions for the columns of the legend matrix 
%   such that the default english and german examples look good. 
%   However, depending on the user input (translation) and the style that is used some adjustment might be needed. 
%   The \setcvskilllegendcolumns command provides means to influence all columns except the ones containing 
%   \cvskill commands. The second column containg the output of \cvskill remains fixed width. The last column,
%   the comment column gets recalculated according to the setting of the other columns.
% 
%   Input
%       Input_1 (optional):     length smaller than \textwidth influencing the width of the first column 
%                               where depending on the style the legend_string gets printed. In case the 
%                               string is left empty adjusting this width allows moving the legend horizontally.  
%                               Default <\skilllegend@hintscolumnwidth>
%       Input_2 (optional):     float between 0 and 1 influencing the width of the left legend descritor column, 
%                               aka \cvskilllegend@leftdescriptorwidth. The desriptor column on the right, 
%                               \cvskilllegend@rightdescriptorwidth is influenced by the factor 1-<factor>.
%                               Default <\skilllegend@leftdesriptorfactor>
% 
%   Example usage
%       \setcvskilllegendcolumns[][0.45]%%    adjust left desriptor column.
%       \setcvskilllegendcolumns[\widthof{``Legend''}][0.45]%   adjust both left descriptor column and string column
% 
%   Note
%       - Due to implementation of \cvskilllegend for style 'fancy' (moderncvbodyv) 
%         the first optional variable has no effect in this case.
%       - For the styles 'classic' and 'casual' the first column is set to hintscolumnwidth such that
%         it aligns with the rest of the entries. A readjustment of the first column should therefor 
%         be avoided. It is recomended to only use \cvskilllegend in the form of 
%         \cvskilllegend[][<factor>], thereby leaving the defaults in place for the first column.
%       - For style 'banking' the first column is set to align with the rest of the \cvskillentry entries
%         Therefor adjusting the first column can be used to widen the table while moving it around. If no 
%         legend string is used, setting \cvskilllegend[0em] maximises the real enstate for the legend.
%
    \def\arg@new@legend@hintscolumnwidth{#1}%
    \def\arg@new@legend@leftDescriptorFactor{#2}%
    % Check for empty arguments. See explanation above
    \ifdefempty{\arg@new@legend@hintscolumnwidth}{%
        % Case \setcvskilllegendcolumns[], \setcvskilllegendcolumns[][] or \setcvskilllegendcolumns[][<somefactor>]
        \ifdefempty{\arg@new@legend@leftDescriptorFactor}{%
%             % Case \setcvskilllegendcolumns[][] do nothing here, i.e. leave default values unaltered
        }{%
            % Case \setcvskilllegendcolumns[][<somefactor>], \setcvskilllegendcolumns[][<somefactor>]
            \RenewDocumentCommand{\skilllegend@leftdesriptorfactor}{}{\arg@new@legend@leftDescriptorFactor}%
        }%
%         % Case \setcvskilllegendcolumns[] nothing needs to be done here i.e. leave default values unaltered
    }{% 
        % Case \setcvskilllegendcolumns, \setcvskilllegendcolumns[<width>], \setcvskilllegendcolumns[<width>][] 
        % or \setcvskilllegendcolumns[<width>][<somefactor>]
        \setlength{\skilllegend@hintscolumnwidth}{\arg@new@legend@hintscolumnwidth}%
        \if@moderncvbodyi%
            \setlength{\skilllegend@bodylength}{\textwidth-\skilllegend@hintscolumnwidth-\separatorcolumnwidth}%
        \fi%
        \if@moderncvbodyiii%
            \setlength{\skilllegend@bodylength}{\textwidth-\skilllegend@hintscolumnwidth-\separatorcolumnwidth}%
        \fi%
        \if@moderncvbodyiv%
            \setlength{\skilllegend@bodylength}{\maincolumnwidth-\skilllegend@hintscolumnwidth-\separatorcolumnwidth}%
        \fi%
        % in case second argument is given but left empty use default
        \ifdefempty{\arg@new@legend@leftDescriptorFactor}{%
            % Case \setcvskilllegendcolumns[<width>][] do nothing here and leave default values unaltered
        }{%
            % Case \setcvskilllegendcolumns, \setcvskilllegendcolumns[<width>], \setcvskilllegendcolumns[<width>][<somefactor>]
            \RenewDocumentCommand{\skilllegend@leftdesriptorfactor}{}{\arg@new@legend@leftDescriptorFactor}%
        }%
    }%
}%
% 
% %-------------------------------------------------------------------------------
% %                \cvskilllegend 
% %-------------------------------------------------------------------------------
% default legend style
% \cvskilllegend[*][<post_padding>][<first_level>][<second_level>][<third_level>][<fourth_level>][<fifth_level>]{<name>}
\NewDocumentCommand\skillLegend@FontSize{}{\scriptsize}
\DeclareDocumentCommand\cvskilllegend{s +O{} +O{} +O{} +O{} +O{} +O{} +m}{}%
%   Print legend table explaining the meaning of \cvskill{1}...\cvskill{5}.
% 
%   Input:
%       asterix (optional): include vertical (dashed) lines. This behaviour depends on the body style. 
%                           For the fancy style, the asterix has no meaning.
%       input_1 (optional): padding length appended to the legend, default: <0.25em>
%       input_2 (optional): string describing meaning of \cvskill{1}, default: <basic knowledge>
%       input_3 (optional): string describing meaning of \cvskill{2}, default: <intermediate knowledge with some project experience>
%       input_4 (optional): string describing meaning of \cvskill{3}, default: <extensive project experience>
%       input_5 (optional): string describing meaning of \cvskill{4}, default: <deepened expert knowledge>
%       input_6 (optional): string describing meaning of \cvskill{5}, default: <expert/guru>
%       input_7:            string giving a name to the legend, default: <>
% 
%   Example usages:
%       \cvskilllegend{}    print default legend
%       \cvskilllegend[0.5em]{Legend}   print default legend, but adjust post padding and display the word ``Legend''.
%       \cvskilllegend*[0.2em][Grundkenntnisse][Grundkenntnisse und eigene Erfahrung in Projekten][Umfangreiche Erfahrung in Projekten][Vertiefte Expertenkenntnisse][Experte/Guru]{Legende}     Fully adjust legend to German example and including dashed lines
% 
%   Note:
%       -The width of the columns can be adjusted by the \setcvskilllegendcolumns, see \setcvskilllegendcolumns
%       -The design of the table is such that the <second_level> entry stands in the first column but 
%       occupies rows two and three. This has been done to accomodate english and german defaults.
%       An alternative is provided by \cvskillplainlegend

% declare default legend entries
\NewDocumentCommand\skillLegend@defaultLevelOne{}{basic knowledge}
\NewDocumentCommand\skillLegend@defaultLevelTwo{}{intermediate knowledge with some project experience}
\NewDocumentCommand\skillLegend@defaultLevelThree{}{extensive project experience}
\NewDocumentCommand\skillLegend@defaultLevelFour{}{deepened expert knowledge}
\NewDocumentCommand\skillLegend@defaultLevelFive{}{expert\,/\,specialist}
% Redefinition of \cvskilllegend valid for moderncvbodyi, moderncvbodyii, moderncvbodyiii
\RenewDocumentCommand\cvskilllegend{s +O{.25em} +O{\skillLegend@defaultLevelOne} +O{\skillLegend@defaultLevelTwo} +O{\skillLegend@defaultLevelThree} +O{\skillLegend@defaultLevelFour} +O{\skillLegend@defaultLevelFive} +m}{%
    \IfBooleanTF#1{% if a star is given, add dashed line
        \begingroup%
            \arrayrulecolor{color1}%
            % calculate descriptor widths
            \setlength{\cvskilllegend@leftdescriptorwidth}{\skilllegend@leftdesriptorfactor\skilllegend@bodylength-\cvskill@width-\skillmatrix@padding-3\skilllegend@padding}%
            \setlength{\cvskilllegend@rightdescriptorwidth}{\skilllegend@bodylength-\skilllegend@leftdesriptorfactor\skilllegend@bodylength-\cvskill@width-\skillmatrix@padding-3\skilllegend@padding}%
            \begin{tabular}{@{}p{\skilllegend@hintscolumnwidth}%
                            @{\hspace{\separatorcolumnwidth}}%
                            p{\cvskill@width}@{\hspace{\skilllegend@padding}};{.6pt/1pt}%%
                            p{2\skilllegend@padding}p{\cvskilllegend@leftdescriptorwidth}@{}@{\hspace{2\skillmatrix@padding}}%
                            p{\cvskill@width}@{\hspace{\skilllegend@padding}};{.6pt/1pt}%
                            p{2\skilllegend@padding}%
                            p{\cvskilllegend@rightdescriptorwidth}@{}}%
                \raggedleft\hintstyle{#8}  & \cvskill{1}& & {\skillLegend@FontSize #3} & \cvskill{3}& &{\skillLegend@FontSize #5 } \\%
                            %
                        & \cvskill{2} & & \multirow{2}{\cvskilllegend@leftdescriptorwidth}{{\skillLegend@FontSize #4}} & \cvskill{4}& & {\skillLegend@FontSize #6 } \\%
                    %         
                        &  & &  & \cvskill{5}& & {\skillLegend@FontSize #7 }%
            \end{tabular}%
        \endgroup
        \par\addvspace{#2}}{%
        % if no star is given, do not add dashed line. We need less padding in this case
        \begingroup%
            % calculate descriptor columns width. note the adjusted padding
            \setlength{\cvskilllegend@leftdescriptorwidth}{\skilllegend@leftdesriptorfactor\skilllegend@bodylength-\cvskill@width-\skillmatrix@padding-1\skilllegend@padding}%
            \setlength{\cvskilllegend@rightdescriptorwidth}{\skilllegend@bodylength-\skilllegend@leftdesriptorfactor\skilllegend@bodylength-\cvskill@width-\skillmatrix@padding-1\skilllegend@padding}%
            \begin{tabular}{@{}p{\skilllegend@hintscolumnwidth}%
                            @{\hspace{\separatorcolumnwidth}}%
                            p{\cvskill@width}@{\hspace{\skilllegend@padding}}%
                            p{\cvskilllegend@leftdescriptorwidth}@{\hspace{2\skillmatrix@padding}}%
                            p{\cvskill@width}@{\hspace{\skilllegend@padding}}%
                            p{\cvskilllegend@rightdescriptorwidth}@{}}%
                \raggedleft\hintstyle{#8}  & \cvskill{1}\, & \,{\skillLegend@FontSize #3} & \cvskill{3}\, &\,{\skillLegend@FontSize #5 } \\%
                            %
                        & \cvskill{2}\, & \,\multirow{2}{\cvskilllegend@leftdescriptorwidth}{{\skillLegend@FontSize #4}} & \cvskill{4}\,  &\,{\skillLegend@FontSize #6 } \\%
                    %         
                        &  &   & \cvskill{5}\, &\,{\skillLegend@FontSize #7 }%
            \end{tabular}%
        \endgroup%
        \par\addvspace{#2}%
    }%
}%
% Redefinition of \cvskilllegend valid for moderncvbodyiv
\if@moderncvbodyiv%
    \RenewDocumentCommand\cvskilllegend{s +O{.25em} +O{\skillLegend@defaultLevelOne} +O{\skillLegend@defaultLevelTwo} +O{\skillLegend@defaultLevelThree} +O{\skillLegend@defaultLevelFour} +O{\skillLegend@defaultLevelFive} +m}{%
        \def\arg@legendString{#8}%
        \ifdefempty{\arg@legendString}{%
        }{%
            \cvitem[0.25em]{\hintstyle{#8}}{}%
        }%
        \IfBooleanTF#1{% if a star is given, add dashed line
            \begingroup%
                % recalculate desrciptor widths on the fly. Allows for different padding 
                % in the stared and nonstared case
                \setlength{\cvskilllegend@leftdescriptorwidth}{\skilllegend@leftdesriptorfactor\skilllegend@bodylength-\cvskill@width-\skillmatrix@padding-4\skilllegend@padding}%
                \setlength{\cvskilllegend@rightdescriptorwidth}{\skilllegend@bodylength-\skilllegend@leftdesriptorfactor\skilllegend@bodylength-\cvskill@width-\skillmatrix@padding-4\skilllegend@padding}%
                \arrayrulecolor{color1}
                \begin{tabular}{@{}p{\skilllegend@hintscolumnwidth}
                                @{\hspace{\separatorcolumnwidth}}p{\cvskill@width}@{\hspace{\skilllegend@padding}};{.6pt/1pt}%
                                p{2\skilllegend@padding}%
                                p{\cvskilllegend@leftdescriptorwidth}@{\hspace{\skillmatrix@padding}}%
                                p{\cvskill@width}@{\hspace{\skilllegend@padding}};{.6pt/1pt}%
                                p{2\skilllegend@padding}p{\cvskilllegend@rightdescriptorwidth}@{}}%
                    \raggedleft\hintstyle{}  & \cvskill{1} & & {\skillLegend@FontSize #3} & \cvskill{3} & & {\skillLegend@FontSize #5 } \\
                                %
                            & \cvskill{2} & & \multirow{2}{\cvskilllegend@leftdescriptorwidth}{{\skillLegend@FontSize #4}} & \cvskill{4} &  &{\skillLegend@FontSize #6 } \\
                        %         
                            & & &   & \cvskill{5}& & {\skillLegend@FontSize #7 } 
                \end{tabular}%
            \endgroup%
            \par\addvspace{#2}}{
            \begingroup%
                % oddly enough, we should only need to subtract 2 paddings in the descritorwidths. 
                % but while testing I got overflow of text into the margin
                \setlength{\cvskilllegend@leftdescriptorwidth}{\skilllegend@leftdesriptorfactor\skilllegend@bodylength-\cvskill@width-\skillmatrix@padding-4\skilllegend@padding}%
                \setlength{\cvskilllegend@rightdescriptorwidth}{\skilllegend@bodylength-\skilllegend@leftdesriptorfactor\skilllegend@bodylength-\cvskill@width-\skillmatrix@padding-5\skilllegend@padding}%
                \begin{tabular}{@{}p{\skilllegend@hintscolumnwidth}
                                @{\hspace{\separatorcolumnwidth}}p{\cvskill@width}@{\hspace{2\skilllegend@padding}}%
                                p{\cvskilllegend@leftdescriptorwidth}@{\hspace{2\skillmatrix@padding}}%
                                p{\cvskill@width}@{\hspace{2\skilllegend@padding}}%
                                p{\cvskilllegend@rightdescriptorwidth}@{}}%
                    \raggedleft\hintstyle{}  & \cvskill{1} & {\skillLegend@FontSize #3} & \cvskill{3} & {\skillLegend@FontSize #5 } \\
                                %
                            & \cvskill{2} & \multirow{2}{\cvskilllegend@leftdescriptorwidth}{{\skillLegend@FontSize #4}} & \cvskill{4} &{\skillLegend@FontSize #6 } \\
                        %         
                            & &   & \cvskill{5} & {\skillLegend@FontSize #7 } 
                \end{tabular}%
            \endgroup%
            \par\addvspace{#2}
        }
    }
\fi
% Redefinition of \cvskilllegend valid for moderncvbodyv
\if@moderncvbodyv%
    \DeclareDocumentCommand\@starIndependentTabular{}{}%
    \RenewDocumentCommand\cvskilllegend{s +O{.25em} +O{\skillLegend@defaultLevelOne} +O{\skillLegend@defaultLevelTwo} +O{\skillLegend@defaultLevelThree} +O{\skillLegend@defaultLevelFour} +O{\skillLegend@defaultLevelFive} +m}{%
        % check whether Argument #8 is given and if so provide it as cvitem
        \def\arg@legendString{#8}%
        \ifdefempty{\arg@legendString}{%
            \vspace*{-\separatorrulewidth}% HACK; I don't understand where the space is coming from, nor what it's exact value is :(
        }{%
            \cvitem[-0.5em]{#8}{}%
        }%
        \arrayrulecolor{color1}%
        \setlength\arrayrulewidth{\separatorrulewidth}%
        \RenewDocumentCommand{\@starIndependentTabular}{}{%
            \begingroup%
            \setlength{\cvskilllegend@leftdescriptorwidth}{\skilllegend@leftdesriptorfactor\skilllegend@bodylength-\cvskill@width-\skillmatrix@padding-3\skilllegend@padding}%
            \setlength{\cvskilllegend@rightdescriptorwidth}{\skilllegend@bodylength-\skilllegend@leftdesriptorfactor\skilllegend@bodylength-\cvskill@width-\skillmatrix@padding-3\skilllegend@padding}%
%             \renewcommand{\arraystretch}{1.0}%
            \begin{tabular}[t]{@{}p{\hintscolumnwidth}%\skilllegend@hintscolumnwidth
                    @{\hspace{\separatorcolumnwidth}}|@{\hspace{\separatorcolumnwidth}}%
                    p{\cvskill@width}@{\hspace{3\skilllegend@padding}}%
                    p{\cvskilllegend@leftdescriptorwidth}@{\hspace{2\skillmatrix@padding}}%
                    p{\cvskill@width}@{\hspace{3\skilllegend@padding}}%
                    p{\cvskilllegend@rightdescriptorwidth}@{}}%
                \@moderncvstrut{4pt}{16pt}  & \cvskill{1}& {\skillLegend@FontSize #3} & \cvskill{3}& {\skillLegend@FontSize #5 }\\%
                            %
                        & \cvskill{2}& \multirow{2}{\cvskilllegend@leftdescriptorwidth}{{\skillLegend@FontSize #4}} & \cvskill{4}& {\skillLegend@FontSize #6 }\\%
                    %         
                        & & & \cvskill{5} & {\skillLegend@FontSize #7 }\\[#2]% the spacing needs to be inside the cell for the vertical rule to extend correctly
            \end{tabular}%
            \endgroup%
            \par\@aftersectionfalse\ignorespaces%    
        }%
        % because of this weird style and the position of the parameter [#2], the dashed lines of the other version look bad. So no lines. 
        \IfBooleanTF#1{%
                \@starIndependentTabular%
            }{% 
                \@starIndependentTabular%
        }%
    }%
\fi

% %-------------------------------------------------------------------------------
% %                \cvskillplainlegend 
% %-------------------------------------------------------------------------------
% alternative legend style
% \cvskillplainlegend[*][<post_padding>][<first_level>][<second_level>][<third_level>][<fourth_level>][<fifth_level>]{<name>}
\DeclareDocumentCommand\cvskillplainlegend{s +O{} +O{} +O{} +O{} +O{} +O{} +m}{}%
%   Print alternative legend table explaining the meaning of \cvskill{1}...\cvskill{5}.
%   In this legend, the first three skill levels are in one column
% 
%   Input:
%       asterix (optional): include vertical (dashed) lines. This behaviour depends on the body style. 
%                           For the fancy style, the asterix has no meaning.
%       input_1 (optional): padding length appended to the legend, default: <0.25em>
%       input_2 (optional): string describing meaning of \cvskill{1}, default: <basic knowledge>
%       input_3 (optional): string describing meaning of \cvskill{2}, default: <intermediate knowledge with some project experience>
%       input_4 (optional): string describing meaning of \cvskill{3}, default: <extensive project experience>
%       input_5 (optional): string describing meaning of \cvskill{4}, default: <deepened expert knowledge>
%       input_6 (optional): string describing meaning of \cvskill{5}, default: <expert/guru>
%       input_7:            string giving a name to the legend, default: <>
% 
%   Example usages:
%       \cvskillplainlegend{}    print default legend
%       \cvskillplainlegend[0.5em]{Legend}   print default legend, but adjust post padding and display the word ``Legend''.
%       \cvskillplainlegend*[0.2em][Grundkenntnisse][Grundkenntnisse und eigene Erfahrung in Projekten][Umfangreiche Erfahrung in Projekten][Vertiefte Expertenkenntnisse][Experte/Guru]{Legende}     Fully adjust legend to German example and including dashed lines
% 
%   Note:
%       -The width of the columns can be adjusted by the \setcvskilllegendcolumns, see \setcvskilllegendcolumns

% declare default legend entries
\NewDocumentCommand\skillPlainLegend@defaultLevelOne{}{basic knowlegde}
\NewDocumentCommand\skillPlainLegend@defaultLevelTwo{}{intermediate knowledge, some project experience}
\NewDocumentCommand\skillPlainLegend@defaultLevelThree{}{extensive project experience}
\NewDocumentCommand\skillPlainLegend@defaultLevelFour{}{deepened expert knowledge}
\NewDocumentCommand\skillPlainLegend@defaultLevelFive{}{expert/guru}
% Redefinition of \cvskillplainlegend valid for moderncvbodyi, moderncvbodyii, moderncvbodyiii
\RenewDocumentCommand\cvskillplainlegend{s +O{.25em} +O{\skillPlainLegend@defaultLevelOne} +O{\skillPlainLegend@defaultLevelTwo} +O{\skillPlainLegend@defaultLevelThree} +O{\skillPlainLegend@defaultLevelFour} +O{\skillPlainLegend@defaultLevelFive} +m}{%
    \IfBooleanTF#1{% if a star is given, add dashed line
        \begingroup%
            \arrayrulecolor{color1}%
            % calculate descriptor widths
            \setlength{\cvskilllegend@leftdescriptorwidth}{\skilllegend@leftdesriptorfactor\skilllegend@bodylength-\cvskill@width-\skillmatrix@padding-3\skilllegend@padding}%
            \setlength{\cvskilllegend@rightdescriptorwidth}{\skilllegend@bodylength-\skilllegend@leftdesriptorfactor\skilllegend@bodylength-\cvskill@width-\skillmatrix@padding-3\skilllegend@padding}%
            \begin{tabular}{@{}p{\skilllegend@hintscolumnwidth}%
                            @{\hspace{\separatorcolumnwidth}}%
                            p{\cvskill@width}@{\hspace{\skilllegend@padding}};{.6pt/1pt}%%
                            p{2\skilllegend@padding}p{\cvskilllegend@leftdescriptorwidth}@{}@{\hspace{2\skillmatrix@padding}}%
                            p{\cvskill@width}@{\hspace{\skilllegend@padding}};{.6pt/1pt}%
                            p{2\skilllegend@padding}%
                            p{\cvskilllegend@rightdescriptorwidth}@{}}%
                \raggedleft\hintstyle{#8}  & \cvskill{1}& & {\skillLegend@FontSize #3} & \cvskill{4}& &{\skillLegend@FontSize #6} \\%
                            %
                        & \cvskill{2} & & {\skillLegend@FontSize #4} & \cvskill{5}& & {\skillLegend@FontSize #7} \\%
                    %         
                        & \cvskill{3} & & {\skillLegend@FontSize #5} & & & %
            \end{tabular}%
        \endgroup%
        \par\addvspace{#2}}{%
        % if no star is given, do not add dashed line
        \begingroup%
            % calculate descriptor widths, note that we use less padding
            \setlength{\cvskilllegend@leftdescriptorwidth}{\skilllegend@leftdesriptorfactor\skilllegend@bodylength-\cvskill@width-\skillmatrix@padding-2\skilllegend@padding}%
            \setlength{\cvskilllegend@rightdescriptorwidth}{\skilllegend@bodylength-\skilllegend@leftdesriptorfactor\skilllegend@bodylength-\cvskill@width-\skillmatrix@padding-2\skilllegend@padding}%
            \begin{tabular}{@{}p{\skilllegend@hintscolumnwidth}%
                            @{\hspace{\separatorcolumnwidth}}%
                            p{\cvskill@width}@{\hspace{2\skilllegend@padding}}%
                            p{\cvskilllegend@leftdescriptorwidth}@{\hspace{2\skillmatrix@padding}}%
                            p{\cvskill@width}@{\hspace{2\skilllegend@padding}}%
                            p{\cvskilllegend@rightdescriptorwidth}@{}}%
                \raggedleft\hintstyle{#8}  & \cvskill{1} & {\skillLegend@FontSize #3} & \cvskill{4} &{\skillLegend@FontSize #6} \\%
                            %
                        & \cvskill{2} & {\skillLegend@FontSize #4} & \cvskill{5}  &{\skillLegend@FontSize #7} \\%
                    %         
                        & \cvskill{3} & {\skillLegend@FontSize #5 }  &  & %
            \end{tabular}%
        \endgroup%
        \par\addvspace{#2}%
    }%
}%
% Redefinition of \cvskillplainlegend valid for moderncvbodyiv
\if@moderncvbodyiv%
    \RenewDocumentCommand\cvskillplainlegend{s +O{.25em} +O{\skillPlainLegend@defaultLevelOne} +O{\skillPlainLegend@defaultLevelTwo} +O{\skillPlainLegend@defaultLevelThree} +O{\skillPlainLegend@defaultLevelFour} +O{\skillPlainLegend@defaultLevelFive} +m}{%
        \def\arg@legendString{#8}%
        \ifdefempty{\arg@legendString}{%
        }{%
            \cvitem[0.25em]{\hintstyle{#8}}{}%
        }%
        \IfBooleanTF#1{% if a star is given, add dashed line
            \begingroup%
                \arrayrulecolor{color1}
                \setlength{\cvskilllegend@leftdescriptorwidth}{\skilllegend@leftdesriptorfactor\skilllegend@bodylength-\cvskill@width-\skillmatrix@padding-6\skilllegend@padding}%
                \setlength{\cvskilllegend@rightdescriptorwidth}{\skilllegend@bodylength-\skilllegend@leftdesriptorfactor\skilllegend@bodylength-\cvskill@width-\skillmatrix@padding-6\skilllegend@padding}%
                \begin{tabular}{@{}p{\skilllegend@hintscolumnwidth}
                                @{\hspace{\separatorcolumnwidth}}p{\cvskill@width}@{\hspace{\skilllegend@padding}};{.6pt/1pt}%
                                p{2\skilllegend@padding}%
                                p{\cvskilllegend@leftdescriptorwidth}@{\hspace{2\skillmatrix@padding}}%
                                p{\cvskill@width}@{\hspace{\skilllegend@padding}};{.6pt/1pt}%
                                p{2\skilllegend@padding}p{\cvskilllegend@rightdescriptorwidth}@{}}%
                    \raggedleft\hintstyle{} & \cvskill{1} & & {\skillLegend@FontSize#3} & \cvskill{4} & & {\skillLegend@FontSize#6}\\%
                                %
                            & \cvskill{2} & &{\skillLegend@FontSize#4} & \cvskill{5} &  &{\skillLegend@FontSize#7}\\%
                        %         
                            & \cvskill{3} & &{\skillLegend@FontSize#5} & & &% 
                \end{tabular}%
            \endgroup%
            \par\addvspace{#2}}{
            % if no star is given, do not add dashed line
            \begingroup
                \setlength{\cvskilllegend@leftdescriptorwidth}{\skilllegend@leftdesriptorfactor\skilllegend@bodylength-\cvskill@width-\skillmatrix@padding-3\skilllegend@padding}%
                \setlength{\cvskilllegend@rightdescriptorwidth}{\skilllegend@bodylength-\skilllegend@leftdesriptorfactor\skilllegend@bodylength-\cvskill@width-\skillmatrix@padding-4\skilllegend@padding}%
                \begin{tabular}{@{}p{\skilllegend@hintscolumnwidth}
                                @{\hspace{\separatorcolumnwidth}}p{\cvskill@width}@{\hspace{\skilllegend@padding}}%
                                p{\cvskilllegend@leftdescriptorwidth}@{\hspace{2\skillmatrix@padding}}%
                                p{\cvskill@width}@{\hspace{\skilllegend@padding}}%
                                p{\cvskilllegend@rightdescriptorwidth}@{}}%
                    \raggedleft\hintstyle{}  & \cvskill{1} & {\skillLegend@FontSize #3} & \cvskill{4} & {\skillLegend@FontSize #6} \\
                                %
                            & \cvskill{2} & {\skillLegend@FontSize #4} & \cvskill{5} & {\skillLegend@FontSize #7} \\
                        %         
                            & \cvskill{3} & {\skillLegend@FontSize #5}  & & %
                \end{tabular}%
            \endgroup
            \par\addvspace{#2}
        }
    }
\fi
% Redefinition of \cvskillplainlegend valid for moderncvbodyv
\if@moderncvbodyv%
    \RenewDocumentCommand\cvskillplainlegend{s +O{.25em} +O{\skillPlainLegend@defaultLevelOne} +O{\skillPlainLegend@defaultLevelTwo} +O{\skillPlainLegend@defaultLevelThree} +O{\skillPlainLegend@defaultLevelFour} +O{\skillPlainLegend@defaultLevelFive} +m}{%
        % check whether Argument #8 is given and if so provide it as cvitem
        \def\arg@legendString{#8}%
        \ifdefempty{\arg@legendString}{%
            \vspace*{-\separatorrulewidth}% HACK; I don't understand where the space is coming from, nor what it's exact value is :(
        }{%
            \cvitem[-0.5em]{#8}{}%
        }%
        \arrayrulecolor{color1}%
        \setlength\arrayrulewidth{\separatorrulewidth}%
        \RenewDocumentCommand{\@starIndependentTabular}{}{%
            \begingroup%
%             \renewcommand{\arraystretch}{1.0}%
            \setlength{\cvskilllegend@leftdescriptorwidth}{\skilllegend@leftdesriptorfactor\skilllegend@bodylength-\cvskill@width-\skillmatrix@padding-2\skilllegend@padding}%
            \setlength{\cvskilllegend@rightdescriptorwidth}{\skilllegend@bodylength-\skilllegend@leftdesriptorfactor\skilllegend@bodylength-\cvskill@width-\skillmatrix@padding-2\skilllegend@padding}%
            \begin{tabular}[t]{@{}p{\hintscolumnwidth}%\skilllegend@hintscolumnwidth
                    @{\hspace{\separatorcolumnwidth}}|@{\hspace{\separatorcolumnwidth}}%
                    p{\cvskill@width}@{\hspace{2\skilllegend@padding}}%
                    p{\cvskilllegend@leftdescriptorwidth}@{\hspace{2\skillmatrix@padding}}%
                    p{\cvskill@width}@{\hspace{2\skilllegend@padding}}%
                    p{\cvskilllegend@rightdescriptorwidth}@{}}%
                \@moderncvstrut{4pt}{16pt}  & \cvskill{1} & {\skillLegend@FontSize #3} & \cvskill{4} & {\skillLegend@FontSize #6}\\%
                            %
                        & \cvskill{2} & {\skillLegend@FontSize #4} & \cvskill{5} & {\skillLegend@FontSize #7}\\%
                    %         
                        & \cvskill{3} & {\skillLegend@FontSize #5}  & & \\[#2]% the spacing needs to be inside the cell for the vertical rule to extend correctly
            \end{tabular}%
            \endgroup%
            \par\@aftersectionfalse\ignorespaces%    
        }%
        % because of this weird style and the position of the parameter [#2], the dashed lines of the other version look bad. So no lines. 
        \IfBooleanTF#1{%
                \@starIndependentTabular%
            }{% 
                \@starIndependentTabular%
        }%
    }%
\fi

% %-------------------------------------------------------------------------------
% %                \cvskillhead
% %-------------------------------------------------------------------------------
\NewDocumentCommand\cvSkillMatrix@HeadFont{}{\normalfont}
\DeclareDocumentCommand\cvskillhead{+O{} +O{} +O{} +O{} +O{}}{}%
%   add skill matrix line acting as header explaining the meaning of columns.
% 
%   Input:
%       input_1 (optional): padding length appended to the legend, default: <0.25em>
%       input_2 (optional): string naming the level column (2nd column), default: <Level>
%       input_3 (optional): string naming the skill column (3nd column), default: <Skill>
%       input_4 (optional): string naming the experience-in-years column (4th column), default: <Years>
%       input_5 (optional): string naming the comment column (5th column), default: <Comment>
% 
%   Example usages:
%       \cvskillhead    print default head.
%       \cvskillhead[0.5em]   print default head, but adjust post padding.
%       \cvskillhead[0.25em][Level][F\"ahigkeit][Jahre][Bemerkung]     Fully adjust head to German example
% 
%   Note:   
%       - The width of the columns can be adjusted by the \setcvskillcolumns command, see \setcvskillcolumns.

\NewDocumentCommand\skillMatrix@HeaderDefaultOne{}{Level}
\NewDocumentCommand\skillMatrix@HeaderDefaultTwo{}{Skill}
\NewDocumentCommand\skillMatrix@HeaderDefaultThree{}{Years}
\NewDocumentCommand\skillMatrix@HeaderDefaultFour{}{Comment}
% Definition of \cvskillhead valid for moderncvbodyi, moderncvbodyii, moderncvbodyiii, moderncvbodyiv
\RenewDocumentCommand\cvskillhead{O{.25em} +O{\skillMatrix@HeaderDefaultOne} +O{\skillMatrix@HeaderDefaultTwo} +O{\skillMatrix@HeaderDefaultThree} +O{\skillMatrix@HeaderDefaultFour}}{%
    \begingroup
        \renewcommand{\arraystretch}{1.25}
        \arrayrulecolor{color1}
        \begin{tabular}{@{}p{\skillmatrix@hintscolumnwidth}@{\hspace{\separatorcolumnwidth}}%
                p{\cvskill@width}@{\hspace{\skillmatrix@padding}}%
                p{\cvskill@descriptorwidth}@{\hspace{\skillmatrix@padding}}%
                p{\cvskill@experiencewidth}@{\hspace{\skillmatrix@padding}}
                p{\skillmatrix@commentwidth}@{}}%
            & \centering{\cvSkillMatrix@HeadFont #2} & \centering{\cvSkillMatrix@HeadFont #3} & \centering{\cvSkillMatrix@HeadFont #4} & {\cvSkillMatrix@HeadFont #5}  
        \end{tabular}%
    \endgroup
    \par\addvspace{#1}
}
% Definition of \cvskillhead valid moderncvbodyv
\if@moderncvbodyv%
    \RenewDocumentCommand\cvskillhead{O{.25em} +O{\skillMatrix@HeaderDefaultOne} +O{\skillMatrix@HeaderDefaultTwo} +O{\skillMatrix@HeaderDefaultThree} +O{\skillMatrix@HeaderDefaultFour}}{%
        \arrayrulecolor{color1}%
        \setlength\arrayrulewidth{\separatorrulewidth}%
        \vspace*{-\separatorrulewidth}% HACK; I don't understand where the space is coming from, nor what it's exact value is :(
        \begingroup%
    %     \renewcommand{\arraystretch}{1.25}%
        \begin{tabular}[t]{@{}p{\hintscolumnwidth}%
                @{\hspace{\separatorcolumnwidth}}|@{\hspace{\separatorcolumnwidth}}%
                p{\skillmatrix@hintscolumnwidth}%
                @{\hspace{\skillmatrix@padding}}%
                p{\cvskill@width}@{\hspace{\skillmatrix@padding}}%
                p{\cvskill@descriptorwidth}@{\hspace{\skillmatrix@padding}}%
                p{\cvskill@experiencewidth}@{\hspace{\skillmatrix@padding}}%
                p{\skillmatrix@commentwidth}@{}}%
            & & \centering{\cvSkillMatrix@HeadFont#2} & \centering{\cvSkillMatrix@HeadFont#3} & \centering{\cvSkillMatrix@HeadFont#4} & {\cvSkillMatrix@HeadFont#5} \\[#1]% the spacing needs to be inside the cell for the vertical rule to extend correctly
        \end{tabular}%
        \endgroup%
        \par\@aftersectionfalse\ignorespaces%    
    }%
\fi

% %-------------------------------------------------------------------------------
% %                \cvskillentry 
% %-------------------------------------------------------------------------------
% \cvskillentry[*][<post_padding>]{<skill_cathegory>}{<0-5>}{<skill_name>}{<years_of_experience>}{<comment>}%
\DeclareDocumentCommand\cvskillentry{s +O{} +m +m +m +m +m}{}%
%     add cvskill matrix row.
% 
%     Input:
%         asterix (optional): include horizontal (dashed) line above the entered line. This behaviour depends on the body style. 
%                             For the fancy style, the asterix has no meaning.
%         input_1 (optional): padding length appended to the legend, default: <0.25em>
%         input_2: string, naming skill cathegory, default: <>
%         input_3: integer between 0 and 5, describing level of skill. \cvskill{input_2} is called internally, default: <>
%         input_4: string, naming the skill, default: <>
%         input_5: positive real number, stating the number of years of experience with this skill , default: <>
%         input_6: string, explaining details w.r.t. that particual skill default: <>
% 
%     Example usages:
%         \cvskillentry*{Language:}{3}{Python}{2}{I have done a million projects with Python}
%         \cvskillentry{}{2}{Lilypond}{14}{So much sheet music! Man I'm the best!}
%         \cvskillentry{}{3}{\LaTeX}{14}{Clearly I rock at \LaTeX}
%         \cvskillentry*[1.5em]{OS:}{3}{Linux}{2}{I only use Archlinux}
% 
%     Note:   
%         - The width of the columns can be adjusted by the \setcvskillcolumns command, see \setcvskillcolumns.

% Definition of \cvskillentry valid for moderncvbodyi, moderncvbodyii, moderncvbodyiii, moderncvbodyiv
\RenewDocumentCommand\cvskillentry{s +O{.25em} +m +m +m +m +m}{%
    %test for the star * in the command
    \IfBooleanTF{#1}{% If a star is seen a dotted line is drawn above the entry
        \begingroup
            \renewcommand{\arraystretch}{1.25}
            \arrayrulecolor{color1}
            \begin{tabular}{@{}p{\skillmatrix@hintscolumnwidth}@{\hspace{\separatorcolumnwidth}}%
                    p{\cvskill@width}@{\hspace{\skillmatrix@padding}}%
                    p{\cvskill@descriptorwidth}@{\hspace{\skillmatrix@padding}}%
                    p{\cvskill@experiencewidth} @{\hspace{\skillmatrix@padding}}%
                    p{\skillmatrix@commentwidth}@{}}%
                \cdashline{2-5}[.6pt/1pt]
                \raggedleft\hintstyle{#3} &\centering \cvskill{#4} &\centering {#5} & \centering {#6} &{\itshape#7}%
            \end{tabular}%
        \endgroup
        \par\addvspace{#2}
    }{% If no star is seen no line is drawn
        \begin{tabular}{@{}p{\skillmatrix@hintscolumnwidth}@{\hspace{\separatorcolumnwidth}}%
                p{\cvskill@width}@{\hspace{\skillmatrix@padding}}%
                p{\cvskill@descriptorwidth}@{\hspace{\skillmatrix@padding}}%
                p{\cvskill@experiencewidth}%
                @{\hspace{\skillmatrix@padding}}%
                p{\skillmatrix@commentwidth}@{}}%
            \raggedleft\hintstyle{#3} &\centering \cvskill{#4} &\centering {#5} & \centering {#6} &{\itshape#7}%
        \end{tabular}%
        \par\addvspace{#2}
    }
}

% Definition of \cvskillentry valid for moderncvbodyv
\if@moderncvbodyv%
    \DeclareDocumentCommand\@starIndependentMatrixEntry{}{}%
    \RenewDocumentCommand\cvskillentry{s O{.25em} +m +m +m +m +m}{%
        \arrayrulecolor{color1}%
        \setlength\arrayrulewidth{\separatorrulewidth}%
        \vspace*{-\separatorrulewidth}% HACK; I don't understand where the space is coming from, nor what it's exact value is :(
        %test for the star * in the command
        \RenewDocumentCommand{\@starIndependentMatrixEntry}{}{%
            \begingroup%
                \renewcommand{\arraystretch}{1.25}%
                \begin{tabular}[t]{@{}p{\hintscolumnwidth}%
                                @{\hspace{\separatorcolumnwidth}}|@{\hspace{\separatorcolumnwidth}}p{\skillmatrix@hintscolumnwidth}
                                @{\hspace{\skillmatrix@padding}}%
                                p{\cvskill@width}@{\hspace{\skillmatrix@padding}}%
                                p{\cvskill@descriptorwidth}@{\hspace{\skillmatrix@padding}}%
                                p{\cvskill@experiencewidth} @{\hspace{\skillmatrix@padding}}p{\skillmatrix@commentwidth}@{}}%
    %                 \cline{3-6}%
                    & \raggedleft\hintstyle{#3} &\centering \cvskill{#4} &\centering {#5} & \centering {#6} &{\itshape#7}\\[#2]%
                \end{tabular}%
            \endgroup%
        }%
        \IfBooleanTF{#1}{% the star does not do anything here
            \@starIndependentMatrixEntry%
        }{% 
            \@starIndependentMatrixEntry%
        }%
        \par\@aftersectionfalse\ignorespaces%
    }%
\fi
% 
\endinput


%% end of file `moderncvskillmatrix.sty'.
