init
authorratten <ratten@buecherratten.in-berlin.de>
Sun, 10 Aug 2025 09:58:47 +0000 (11:58 +0200)
committerratten <ratten@buecherratten.in-berlin.de>
Sun, 10 Aug 2025 09:58:47 +0000 (11:58 +0200)
39 files changed:
Stromnetz-Berlin.tex [new file with mode: 0644]
moderncv.cls [new file with mode: 0644]
moderncvbodyi.sty [new file with mode: 0644]
moderncvbodyii.sty [new file with mode: 0644]
moderncvbodyiii.sty [new file with mode: 0644]
moderncvbodyiv.sty [new file with mode: 0644]
moderncvbodyv.sty [new file with mode: 0644]
moderncvcolorblack.sty [new file with mode: 0644]
moderncvcolorblue.sty [new file with mode: 0644]
moderncvcolorburgundy.sty [new file with mode: 0644]
moderncvcolorgreen.sty [new file with mode: 0644]
moderncvcolorgrey.sty [new file with mode: 0644]
moderncvcolororange.sty [new file with mode: 0644]
moderncvcolorpurple.sty [new file with mode: 0644]
moderncvcolorred.sty [new file with mode: 0644]
moderncvfooti.sty [new file with mode: 0644]
moderncvheadi.sty [new file with mode: 0644]
moderncvheadii.sty [new file with mode: 0644]
moderncvheadiii.sty [new file with mode: 0644]
moderncvheadiv.sty [new file with mode: 0644]
moderncvheadv.sty [new file with mode: 0644]
moderncvheadvi.sty [new file with mode: 0644]
moderncvheadvii.sty [new file with mode: 0644]
moderncvheadvii.sty~ [new file with mode: 0644]
moderncviconsacademic.sty [new file with mode: 0644]
moderncviconsawesome.sty [new file with mode: 0644]
moderncviconsletters.sty [new file with mode: 0644]
moderncviconsmarvosym.sty [new file with mode: 0644]
moderncviconssymbols.sty [new file with mode: 0644]
moderncviconstikz.sty [new file with mode: 0644]
moderncvskillmatrix.sty [new file with mode: 0644]
moderncvstylebanking.sty [new file with mode: 0644]
moderncvstylecasual.sty [new file with mode: 0644]
moderncvstyleclassic.sty [new file with mode: 0644]
moderncvstyleempty.sty [new file with mode: 0644]
moderncvstylefancy.sty [new file with mode: 0644]
moderncvstyleoldstyle.sty [new file with mode: 0644]
moderncvstyleratten.sty [new file with mode: 0644]
moderncvstyleratten.sty~ [new file with mode: 0644]

diff --git a/Stromnetz-Berlin.tex b/Stromnetz-Berlin.tex
new file mode 100644 (file)
index 0000000..cc53182
--- /dev/null
@@ -0,0 +1,315 @@
+%% start of file `template.tex'.
+%% Copyright 2006-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv).
+%
+% 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/.
+
+
+\documentclass[11pt,a4paper,sans]{moderncv}        % possible options include font size ('10pt', '11pt' and '12pt'), paper size ('a4paper', 'letterpaper', 'a5paper', 'legalpaper', 'executivepaper' and 'landscape') and font family ('sans' and 'roman')
+\usepackage{ragged2e}
+
+% moderncv themes
+\moderncvstyle{ratten}                            % style options are 'casual' (default), 'classic', 'banking', 'oldstyle' and 'fancy'
+\moderncvcolor{green}                               % color options 'black', 'blue' (default), 'burgundy', 'green', 'grey', 'orange', 'purple' and 'red'
+%\renewcommand{\familydefault}{\sfdefault}         % to set the default font; use '\sfdefault' for the default sans serif font, '\rmdefault' for the default roman one, or any tex font name
+%\nopagenumbers{}                                  % uncomment to suppress automatic page numbering for CVs longer than one page
+
+% adjust the page margins
+\usepackage[scale=0.78]{geometry}
+%\usepackage[bottom=1cm]{geometry}
+%\geometry{bottom=1cm}
+\setlength{\footskip}{49.60005pt} % depending on the amount of information in the footer, you need to change this value. comment this line out and set it to the size given in the warning
+%\setlength{\hintscolumnwidth}{3cm}                % if you want to change the width of the column with the dates
+%\setlength{\makecvheadnamewidth}{10cm}            % for the 'classic' style, if you want to force the width allocated to your name and avoid line breaks. be careful though, the length is normally calculated to avoid any overlap with your personal info; use this at your own typographical risks...
+
+% font loading
+% for luatex and xetex, do not use inputenc and fontenc
+% see https://tex.stackexchange.com/a/496643
+\ifxetexorluatex
+  \usepackage{fontspec}
+  \usepackage{unicode-math}
+  \defaultfontfeatures{Ligatures=TeX}
+  \setmainfont{Latin Modern Roman}
+  \setsansfont{Latin Modern Sans}
+  \setmonofont{Latin Modern Mono}
+  \setmathfont{Latin Modern Math}
+\else
+  \usepackage[utf8]{inputenc}
+  \usepackage[T1]{fontenc}
+  \usepackage{lmodern}
+\fi
+
+% document language
+\usepackage[german]{babel}  % FIXME: using spanish breaks moderncv
+
+\setlength{\hintscolumnwidth}{4cm}
+%%macht die Balken Größer
+
+
+% personal data
+\name{Susanne}{Schütze}
+\title{Lebenslauf}                               % optional, remove / comment the line if not wanted
+\address{Türrschmidtstr. 34a}{10317 Berlin}{}
+%\address{street and number}{postcode city}{country}% optional, remove / comment the line if not wanted; the "postcode city" and "country" arguments can be omitted or provided empty
+%\phone[mobile]{+1~(234)~567~890}                   % optional, remove / comment the line if not wanted; the optional "type" of the phone can be "mobile" (default), "fixed" or "fax"
+\born{06.03.1984}
+\phone[fixed]{(030) 98-32-26-01}
+%\phone[fixed]{+2~(345)~678~901}
+%\phone[fax]{+3~(456)~789~012}
+\email{susanne.schuetze@mailbox.org}
+%\email{john@doe.org}                               % optional, remove / comment the line if not wanted
+%\homepage{www.johndoe.com}                         % optional, remove / comment the line if not wanted
+\extrainfo{GnuPG-Key: 0E42 3FA3 838E E7ED 5AA2 20E7 ACA3 EA4A C038 CCFD}
+
+
+% bibliography adjustments (only useful if you make citations in your resume, or print a list of publications using BibTeX)
+%   to show numerical labels in the bibliography (default is to show no labels)
+%\makeatletter\renewcommand*{\bibliographyitemlabel}{\@biblabel{\arabic{enumiv}}}\makeatother
+\renewcommand*{\bibliographyitemlabel}{[\arabic{enumiv}]}
+%   to redefine the bibliography heading string ("Publications")
+%\renewcommand{\refname}{Articles}
+
+% bibliography with mutiple entries
+%\usepackage{multibib}
+%\newcites{book,misc}{{Books},{Others}}
+%----------------------------------------------------------------------------------
+%            content
+%----------------------------------------------------------------------------------
+
+\begin{document}
+%\begin{CJK*}{UTF8}{gbsn}                          % to typeset your resume in Chinese using CJK
+
+%-----       letter       ---------------------------------------------------------
+% recipient data
+
+\recipient{Stromnetz Berlin GmbH}{Jasmin Sonko\\ Eichenstraße 3a\\ 10871 Berlin}
+\date{\today}
+
+\subject{Bewerbung als Linux Systemadministratorin}
+\opening{Sehr geehrte Frau Jasmin Sonko,}
+\closing{Mit freundlichen Grüßen,}
+
+\signature{0.5}{Bilder/unterschrift.jpg}     % optional, remove / comment the line if not wanted: first argument goes to \includegraphics > scale
+%\enclosure[Anhang]{Lebenslauf\\Zeugnisse}    % use an optional argument to use a string other than "Enclosure", or redefine \enclname
+
+\makelettertitle
+
+\begin{justify}
+\setlength{\parskip}{0.5pt}  
+%\begin{flushleft}
+%Flatterstaz aktivieren
+\par\vspace{-0.5cm}
+
+sehr gerne möchte ich mich den Herausforderungen, wie Nachhaltigkeit im Zusammenhang mit Digitalisierung in Ihnem Unternehmen stellen. Durch Zufall bin ich auf die Stellenanzeige auf Ihrer Webseite aufmerksam geworden.
+
+Durch den Besuch von Veranstaltungen, wie den Chaos Communication Congress und Linux-Tagen stetze ich mich regelmäßig mit neuen und nachhaltigen Technologien, sowie IT-Sicherheit auseinander.
+Die Fähigkeiten zur Administration von Linux-Systemen habe ich mir selbstständig angeeignet. Sehr gerne vertiefe ich mein Wissen durch das Geben von Kursen und Vorträgen in der OpenSource Community.
+Zur Zeit arbeite ich als Linux und OpenSource Administratorin bei B1-Systems, im Bereich Linux Client Management mit Salt. Davor habe ich als Linux Administratorin im ITDZ-Berlin die Automatisierung mit Ansible vorangetrieben.
+
+Ich bin es durch meine Schwerbehinderung gewohnt, mit Herausforderungen umzugehen. Leider bin ich deswegen auf eine Teilzeitstelle angewiesen, was ich mit hoher Motivation kompensiere.
+Programmierung sowohl in Bash, als auch Python und die damit verbundene Automatisierung und Optimierung bereiten mir besondere Freude.
+Ich habe bereits einige Erfahrungen mit RedHat Enterprise Linux und mich hier im Speziellen mit dem IT-Sicherheitsthema Crypto-Policies auseinander gesetzt.
+Unter anderem konnte ich mich in dem Projekt Linux Client Management mit Docker/Podman beschäftigen.
+2019 habe ich zudem einen einführenden Vortrag zu Docker gehalten.
+Neben Containerisierung habe ich mich auch mit Virtualisierung beschäftigt.
+Hier habe ich vor allem Kenntnisse in KVM/Qemu sowie Proxmox als Lösungen.
+
+Immer wieder helfe ich gerne neuen Kolleg*innen bei der Einarbeitung in das Linux Client Management-Projekt und kann so die Dokumentation des Projektes erweitern.
+Beeindrucken konnte ich durch mein Fachwissen bei der Fehleranalyse zu der Problematik bei der Festplattenverschlüsselung mit LUKS im Zusammenhang mit dem TPM 2.0.
+Bei dem User-Support während der Treffen der LinuxUserGroups liegt mir die Hilfe zur Selbsthilfe besonders am Herzen.
+Schwierige Probleme begreife ich stets als Herausforderung, um kreative Lösungen zu finden.
+Dabei lerne ich gerne neue Methoden und Wege kennen.
+Hier ist für mich die Zusammenarbeit im Team von besonderer Bedeutung.\\
+  
+Ich freue mich über Ihre Einladung zum Vorstellungsgespräch.
+%\par\vspace{-0.5cm}
+%\end{flushleft}
+
+\end{justify}
+% \vspace{-0.5cm}
+\makeletterclosing
+\vspace{-0.5cm}
+\clearpage
+
+%-----       resume       ---------------------------------------------------------
+\makecvtitle
+
+%Fußinfos
+
+\lfoot{\upshape{Susanne Schütze}}
+\cfoot{\scriptsize{Bewerbung als Linux Administratorin }}
+\rfoot{S. \thepage}
+
+
+\section{Persönliche Daten}
+
+\cventry{Geburtsdatum}{6. März 1984}{Münster (Westfalen)}{}{}{}{}
+\cventry{Staatsangehörigkeit}{Deutsch}{}{}{}{}
+
+\section{beruflicher Werdegang}
+
+\cventry{seit Juni 2024}{Angestellt als Linux/OpenSource Administratorin}{ bei B1 Systems GmbH}{Berlin/Vohburg}{im Projekt Linux Client Management}{Schwerpunkt: Salt-Entwicklung und Linux Administration}
+\cventry{Juni 2022 -- Juni 2024}{Angestellt als Administratorin}{ beim IT-DienstleistungsZentrum}{Berlin}{im Bereich Automatisierung}{Schwerpunkt: Ansible-Entwicklung und Linux Administration}
+
+\subsection{Technisches Jahr}
+
+\cventry{Juli 2019 -- Aug. 2019}{Einsatzstelle bei SchindlerTechnik AG}{Berlin}{im Bereich Anwendungsentwicklung}{}{}
+\cventry{März 2019 -- Mai 2019}{Einsatzstelle bei der Berliner Stadtreinigung}{Berlin}{im Bereich IT}{}{}
+\cventry{Dez. 2018 -- Feb. 2019}{Einsatzstelle beim IT-DienstleistungsZentrum}{Berlin}{im Bereich Bürgerdienste}{}{}
+\cventry{Sep. 2018 -- Nov. 2018}{Einsatzstelle bei Lebenswege Wohnprojekte GmbH in Kooperation mit systeminte\-gration.berlin gmbh}{Berlin}{}{}{}
+
+\section{Bildung}
+
+\subsection{Ausbildung}
+\cventry{Feb. 2020 -- Juli 2022}{Ausbildung zur Fachinformatikerin im Bereich Systemintegration}{Berlin}{IT-DienstleistungsZentrum}{Abschlussnote: 2}{}
+\cventry{Sep. 2019 -- Nov. 2019}{Ausbildung zur Fachinformatikerin im Bereich Systemintegration}{Berlin}{Dawico Deutschland GmbH}{Kündigung aus betrieblichen Gründen}{}
+\cventry{2005 -- 2006}{Berufskolleg des Landschaftsverbandes Rheinland}{Düsseldorf}{Ausbildung zur Erzieherin Schwerpunkt: Jugend- und Heimerziehung}{1.Ausbildungsjahr abgeschlossen}{}
+
+\subsection{Kurse}
+\cventry{2011}{Computerkurs im FrauenComputerZentrum Berlin}{}{}{}{}
+\newpage
+\subsection{Freiwilliges Jahr im Bereich Kultur}
+\cventry{2008 -- 2009}{Zentral- und Landesbibliothek Berlin, Kinder- Jugendbibliothek}{Hallescher Komet}{}{}{}
+
+\subsection{Schulabschluss}
+
+\cventry{2005}{Mildred-Scheel-Berufskolleg}{Solingen}{Fachhochschulreife}{Fachrichtung: Erziehungswissenschaften}{}
+\cventry{2002}{Anne-Frank-Schule (Berufskolleg)}{Münster}{Berufliche Grundbildung im Berufsfeld: Sozial und Gesundheitswesen}{}{}
+
+\section{Vorträge und Workshops}
+\cventry{Juni 2025}{Gulaschprogrammiernacht 23}{Vortrag: „Zusammenspiel von LUKS und TPM 2.0 unter Linux“}{}{}{}
+\cventry{April 2025}{Augsburger Linux-Infotag}{Vortrag: „TCP \& UDP Netzwerkbasics mit Linux erkunden“}{}{}{}
+\cventry{März 2025}{Chemnitzer Linux-Tage}{Vortrag: „Festplattenverschlüsselung mit TPM 2.0 “, Workshop: „A Way to (S)hell – Einstieg in die Programmierung mit bash“}{}{}{}
+\cventry{Dez. 2024}{38C3 Chaos Communication Congress}{Workshop in der Haecksen Assembly: „A Way to (S)hell - ein Einstieg in die Programmierung mit bash“}{}{}{}
+\cventry{Sep. 2024}{Kieler OpenSource und Linux Tage}{Vortrag: „Crypto-Policies - Was ist das?“}{}{}{}
+\cventry{März 2024}{Chemnitzer Linux-Tage}{Vorträge: „IPv6 Grundlagen in Zusammenhang mit IPoAC“, „Crypto-Policies – Was ist das?“}{}{}{}
+\cventry{Dez. 2023}{37C3 Chaos Communication Congress}{Workshop in der Haecksen Assembly: „Experimentelles Spiel zur IT-Netzwerk Kommunikation“}{}{}{}
+\cventry{Dez. 2023}{LinuxWorks!}{Vortrag: „Cryptopolicies - one Tool to rule all Crypto in Linux“}{}{}{}
+\cventry{Juni 2023}{Gulaschprogrammiernacht 21}{Vortrag: „IPv6 - Eine kleine Einführung mit Linux“}{}{}{}
+\cventry{Feb. 2020}{BeLUG}{Vortrag: „My Way to (S)Hell - Einführung in die Programmierung mit bash“}{}{}{}
+\cventry{Mai 2019}{BeLUG}{Vortrag: „Container-Spielplatz mit Docker für Neugierige“}{}{}{}
+\cventry{März 2018}{Chemnitzer Linux-Tage}{Vortrag: „Schlüssel gesucht -- GnuPG für blutige Anfänger/innen“}{}{}{}
+
+\section{Ehrenamt}
+\cvitemwithcomment{seit Jan. 2025}{Beisitzerin im Vorstand BeLUG e.V. und Mailing-Listen-Admine}{}
+\cvitemwithcomment{2023}{Organisation der Treffen der „Berliner Haecksen“}{}
+\cvitemwithcomment{2023 -- 2024}{Durchführung „Computersprechstunde“, Evas Haltestelle}{}
+\cventry{Dez. 2019}{36C3 Chaos Communication Congress}{Mitwirkung bei Betreuung der FSFE-Assembly}{Mitwirkung beim Haecksen-Assembly}{}{}
+\cventry{März 2019}{Chemnitzer Linux-Tage}{Standbetreuung für BeLUG e.V. und „LinuxWorks!“}{}{}{}
+\cventry{Dez. 2018}{35C3 Chaos Communication Congress}{Mitwirkung bei Betreuung der FSFE-Assembly}{Mitwirkung beim Aufbau des C-base Assembly}{}{}
+\cvitemwithcomment{Jun. 2018 -- Aug. 2018}{Mitarbeit bei den Treffen der „HackerShell“}{}
+\cventry{05.05.2018}{Netzfest im Rahmen der Republica}{Mitwirkung bei der Standbetreuung der FSFE e.V}{}{}{}
+\cvitemwithcomment{Jan. 2018 -- Jan. 2019}{Beisitzerin im Vorstand BeLUG e.V. und Useradmin}{}
+\cventry{Dez. 2017}{34C3 Chaos Communication Congress}{Mitwirkung bei der Betreuung der FSFE-Assembly}{}{}{}
+\cventry{Dez. 2016}{33C3 Chaos Communication Congress}{Mitwirkung bei der Betreuung der FSFE-Assembly}{}{}{}
+\cventry{Mai 2016}{LinuxPresentationDay}{Vorbereitung und Durchführung am Standort „LinuxWorks!“}{}{}{}
+\cventry{Juli 2016}{OpenTechSummit}{Mitwirkung bei der Standbetreuung der FSFE e.V.}{}{}{}
+\cventry{2015--2016}{Durchführung des LinuxUserinnen Treffs „Spiel-Linux“}{Netzwerk behinderter Frauen Berlin e.V.}{}{}{}
+\cvitemwithcomment{seit 2015}{Free Software Foundation Europe (FSFE) e.V., Fellowshipmember}{}
+\cventry{März 2015}{Chemnitzer Linux-Tage}{Standbetreuung für „LinuxWorks!“}{}{}{}
+\cvitemwithcomment{seit 2014}{Mitfrau im Netzwerk behinderter Frauen Berlin e.V.}{}
+
+\section{Computerkenntnisse}
+
+\subsection{Programmiersprachen \enskip Betriebsysteme}
+
+
+\cvcomputer{Assembler}{\cvskill{1}}  {Ubuntu/LinuxMint}{\cvskill{4}}
+\cvcomputer{python}{\cvskill{2}}     {ArchLinux}{\cvskill{4}}
+\cvcomputer{bash}{\cvskill{4}}       {Debian}{\cvskill{3}}
+\cvcomputer{Ansible}{\cvskill{3}}    {RHEL}{\cvskill{4}}  
+\cvcomputer{Salt}{\cvskill{1}}       {openSUSE}{\cvskill{2}}  
+\cvcomputer{\LaTeX}{\cvskill{4}}     {Mircosoft Windows}{\cvskill{0}}
+
+\subsection{Programme}
+\cvcomputer{Backuptool}{rsync}{Verschlüsselungstool}{\enskip GnuPG}
+\cvcomputer{Remoteshelltool}{ssh}{Versionierung}{\enskip git}
+\cvcomputer{initsystem}{systemd}{Automatisierungswerkzeug}{\enskip Ansible}
+\cvcomputer{Editor}{Emacs/helix}{Cloud}{\enskip NextCloud}
+
+\subsection{weitere Kenntnisse}
+\cvitem{Virtualisierung (Qemu/KVM)}{\cvskill{3}}
+\cvitem{ContainerEngine (Docker, Podman)}{\cvskill{2}}
+\cvitem{Ansible Automation Platform}{\cvskill{1}}
+\cvitem{Foreman}{\cvskill{1}}
+\cvitem{Einplatinen Computer}{Raspberry PI, Banana PI, Orange PI}
+
+\section{Sprachen}
+\cvitem{Englisch}{schriftlich \cvskill{2}, mündlich \cvskill{3}}
+
+\section{Hobbies}
+\begin{itemize}
+\item{Lesen}{}
+\item{Löten}{}
+\item{Lernen}{}
+\item{Basteln}{}
+\item{Zeichnen}{}
+\item{Programmierung}{}
+\item{Besuch von IT-Vorträgen}{}
+\item{Besuch der Treffen von der BeLUG e.V.}{}
+\end{itemize}
+  
+~\\
+Berlin, \today
+~\\
+\includegraphics[scale=0.5]{Bilder/unterschrift.jpg}
+
+\newpage
+\section{Zeugnisse}
+\includegraphics[scale=0.75]{Bilder/IHK-Zeugnis00.jpg}
+\newpage
+\includegraphics[scale=0.75]{Bilder/IHK-Zeugnis01.jpg}
+\newpage
+\includegraphics[scale=0.75]{Bilder/OSZIMT-Zeugnis00.jpg}
+\newpage
+\includegraphics[scale=0.75]{Bilder/OSZIMT-Zeugnis01.jpg}
+\newpage
+\includegraphics[scale=0.75]{Bilder/OSZIMT-Zeugnis02.jpg}
+\newpage
+\includegraphics[scale=0.75]{Bilder/ITDZ-Zeugnis.jpg}
+\newpage
+\includegraphics[scale=0.75]{Bilder/ITDZ-Zeugnis01.jpg}
+\newpage
+\includegraphics[scale=0.75]{Bilder/ITDZ-Zeugnis02.jpg}
+%% \newpage
+%% \includegraphics[scale=0.75]{Bilder/ZeugnisAE.jpg} %292k
+\newpage
+\includegraphics[scale=0.75]{Bilder/abschluss00.jpg} %780k
+\newpage
+\includegraphics[scale=0.75]{Bilder/abschluss10.jpg} %296k
+\newpage
+\includegraphics[scale=0.75]{Bilder/abschluss20.jpg} %820k
+\newpage
+\section{TechnischesJahr}
+\includegraphics[scale=0.75]{Bilder/TJ-Zertifikat1.jpg}
+\newpage
+\includegraphics[scale=0.75]{Bilder/stag-zeugnis1.jpg}
+\newpage
+%% \includegraphics[scale=0.75]{Bilder/itdz-zeugnis3.jpg}
+%% \newpage
+%% \includegraphics[scale=0.75]{Bilder/itdz-zeugnis4.jpg}
+%% \newpage
+\section{FSJK}
+\includegraphics[scale=0.75]{Bilder/fsjk51.jpg} %1,2m
+\newpage
+\includegraphics[scale=0.75]{Bilder/fsjk41.jpg} %892k 
+\newpage
+\includegraphics[scale=0.75]{Bilder/fsjk31-1.jpg} %800k
+\newpage
+\includegraphics[scale=0.75]{Bilder/fsjk21.jpg} %724k
+\newpage
+\section{Ehrenämter}
+%% \includegraphics[scale=0.75]{Bilder/belug.jpg} %96k
+%% \newpage
+\includegraphics[scale=0.75]{Bilder/netzwerk.jpg} %288k
+%% \newpage
+%% \section{Ausweis}
+%% \includegraphics{Bilder/Schuetze-Ausweis-1.jpg}
+%% \includegraphics{Bilder/Schuetze-Ausweis-2.jpg}
+
+\end{document}
+
+
+%% end of file `template.tex'.
diff --git a/moderncv.cls b/moderncv.cls
new file mode 100644 (file)
index 0000000..271ca6c
--- /dev/null
@@ -0,0 +1,823 @@
+%% start of file `moderncv.cls'.
+%% Copyright 2006-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv).
+%
+% 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}
+\ProvidesClass{moderncv}[2022-02-21 v2.3.1 modern curriculum vitae and letter document class]
+
+
+%-------------------------------------------------------------------------------
+%                class options
+%
+% (need to be done before the external package loading, for example because
+% we need \paperwidth, \paperheight and \@ptsize to be defined before loading
+% geometry and fancyhdr)
+%-------------------------------------------------------------------------------
+% paper size option
+\DeclareOption{a4paper}{
+  \setlength\paperheight{297mm}
+  \setlength\paperwidth{210mm}}
+\DeclareOption{a5paper}{
+  \setlength\paperheight{210mm}
+  \setlength\paperwidth{148mm}}
+\DeclareOption{b5paper}{
+  \setlength\paperheight{250mm}
+  \setlength\paperwidth{176mm}}
+\DeclareOption{letterpaper}{
+  \setlength\paperheight{11in}
+  \setlength\paperwidth{8.5in}}
+\DeclareOption{legalpaper}{
+  \setlength\paperheight{14in}
+  \setlength\paperwidth{8.5in}}
+\DeclareOption{executivepaper}{
+  \setlength\paperheight{10.5in}
+  \setlength\paperwidth{7.25in}}
+\DeclareOption{landscape}{
+  \setlength\@tempdima{\paperheight}
+  \setlength\paperheight{\paperwidth}
+  \setlength\paperwidth{\@tempdima}}
+
+% font size options
+\newcommand\@ptsize{}
+\DeclareOption{10pt}{\renewcommand\@ptsize{0}}
+\DeclareOption{11pt}{\renewcommand\@ptsize{1}}
+\DeclareOption{12pt}{\renewcommand\@ptsize{2}}
+
+% font type options
+\DeclareOption{sans}{\AtBeginDocument{\renewcommand{\familydefault}{\sfdefault}}}
+\DeclareOption{roman}{\AtBeginDocument{\renewcommand{\familydefault}{\rmdefault}}}
+
+% draft/final option
+\DeclareOption{draft}{\setlength\overfullrule{5pt}}
+\DeclareOption{final}{\setlength\overfullrule{0pt}}
+
+% execute default options
+\ExecuteOptions{a4paper,11pt,final}
+
+% process given options
+\ProcessOptions\relax
+\input{size1\@ptsize.clo}
+
+
+%-------------------------------------------------------------------------------
+%                required packages
+%-------------------------------------------------------------------------------
+% \AtEndPreamble hook (loading etoolbox instead of defining the macro, as to avoid incompatibilities with etoolbox (and packages relying on it) defining the macro too)
+\RequirePackage{etoolbox}
+%\let\@endpreamblehook\@empty
+%\def\AtEndPreamble{\g@addto@macro\@endpreamblehook}
+%\let\document@original\document
+%\def\document{\endgroup\@endpreamblehook\begingroup\document@original}
+
+% if... then... else... constructs
+\RequirePackage{ifthen}
+% TODO: move to xifthen and \isempty{<arg>} instead of \equal{<arg>}{}
+
+% color
+\RequirePackage[table]{xcolor}
+
+% tex compiler checking for symbol loading
+\RequirePackage{iftex}
+\newif\ifxetexorluatex
+\ifxetex
+  \xetexorluatextrue
+\else
+  \ifluatex
+    \xetexorluatextrue
+  \else
+    \xetexorluatexfalse
+  \fi
+\fi
+
+
+% hyper links (hyperref is loaded at the end of the preamble to pass options required by loaded packages such as CJK)
+\newcommand*\pdfpagemode{UseNone}% do not show thumbnails or bookmarks on opening (on supporting browsers); set \pdfpagemode to "UseOutlines" to show bookmarks
+\RequirePackage{url}
+\urlstyle{tt}
+\AtEndPreamble{
+  \pagenumbering{arabic}% has to be issued before loading hyperref, as to set \thepage and hence to avoid hyperref issuing a warning and setting pdfpagelabels=false
+  \PassOptionsToPackage{unicode}{hyperref}
+  \RequirePackage{hyperref}
+  \hypersetup{
+    breaklinks,
+    pdfborder     = 0 0 0,
+    pdfpagemode   = \pdfpagemode,
+    pdfstartpage  = 1,
+    pdfcreator    = {\LaTeX{} with 'moderncv' package},
+%    pdfproducer   = {\LaTeX{}},% will/should be set automatically to the correct TeX engine used
+    bookmarksopen = true,
+    bookmarksdepth= 2,% to show sections and subsections
+    pdfauthor     = {\@firstname{}~\@lastname{}},
+    pdftitle      =
+    {\@firstname{}~\@lastname{}\expandafter\notblank\expandafter{\@title}{ -- \@title}{}},  %\notblank does not expand argument automatically
+    pdfsubject    = {R\'{e}sum\'{e} of \@firstname{}~\@lastname{}},
+    pdfkeywords   = {\@firstname{}~\@lastname{}, curriculum vit\ae{}, r\'{e}sum\'{e}}}}
+
+% pdftex not using pdfmanagement-testphase requires T1 font encoding in order to handle links containing special characters somewhat properly
+\ifpdftex
+  \IfPDFManagementActiveTF{}{\RequirePackage[T1]{fontenc}}
+\fi
+
+% graphics
+\RequirePackage{graphicx}
+
+% headers and footers
+\RequirePackage{fancyhdr}
+\fancypagestyle{plain}{
+  \renewcommand{\headrulewidth}{0pt}
+  \renewcommand{\footrulewidth}{0pt}
+  \fancyhf{}}
+% page numbers in footer if more than 1 page
+\newif\if@displaypagenumbers\@displaypagenumberstrue
+\newcommand*{\nopagenumbers}{\@displaypagenumbersfalse}
+\AtEndPreamble{%
+  \AtBeginDocument{%
+    % fancyhdr length
+    \renewcommand{\headwidth}{\textwidth}
+    \if@displaypagenumbers%
+      \@ifundefined{r@lastpage}{}{%
+        \ifthenelse{\pageref{lastpage}>1}{%
+          \newlength{\pagenumberwidth}%
+          \settowidth{\pagenumberwidth}{\color{color2}\addressfont\itshape\strut\thepage/\pageref{lastpage}}%
+          \fancypagestyle{plain}{%
+            \fancyfoot[r]{\parbox[b]{\pagenumberwidth}{\color{color2}\pagenumberfont\strut\thepage/\protect\NoHyper\pageref{lastpage}\protect\endNoHyper}}}% the parbox is required to ensure alignment with a possible center footer (e.g., as in the casual style)
+          \pagestyle{plain}}{}}\fi}%
+  \AtEndDocument{\label{lastpage}}}
+\pagestyle{plain}
+
+% reduced list spacing
+% package providing hooks into lists
+%   originally developped by Jakob Schiotz (see http://dcwww.camd.dtu.dk/~schiotz/comp/LatexTips/tweaklist.sty)
+%   modified and distributed with moderncv(not available otherwise on ctan)
+\RequirePackage{tweaklist}
+\renewcommand*{\itemhook}{%
+  \@minipagetrue% removes spacing before lists as they use \addvspace, which doesn't add vertical space inside minipages
+  \@noparlisttrue% removes spacing at end of lists, caused by \par
+  \setlength{\topsep}{0pt}% normally not required thanks to \@minipagetrue
+  \setlength{\partopsep}{0pt}% normally not required thanks to \@minipagetrue
+  \setlength{\parsep}{0pt}% not required when \itemsep and \parskip are set to 0pt (?)
+  \setlength{\parskip}{0pt}%
+  \setlength{\itemsep}{0pt}}
+\renewcommand*{\enumhook}{\itemhook{}}
+\renewcommand*{\deschook}{\itemhook{}}
+
+% lengths calculations
+\RequirePackage{calc}
+
+% advanced command arguments (LaTeX 3)
+\RequirePackage{xparse}
+% TODO (?): replace all \newcommand by \NewDocumentCommand
+
+% micro-typography (e.g., character protrusion, font expansion, hyphenatable letterspacing)
+\RequirePackage{microtype}
+
+% stack of key-value elements, used to save personal information
+\RequirePackage{moderncvcollection}
+
+% compatibility package with older versions of moderncv
+\RequirePackageWithOptions{moderncvcompatibility}
+
+\RequirePackage{expl3}
+
+%-------------------------------------------------------------------------------
+%                class definition
+%-------------------------------------------------------------------------------
+% minimal base settings
+\setlength\lineskip{1\p@}
+\setlength\normallineskip{1\p@}
+\renewcommand\baselinestretch{}
+\setlength{\parindent}{0\p@}
+\setlength{\parskip}{0\p@}
+\setlength\columnsep{10\p@}
+\setlength\columnseprule{0\p@}
+\setlength\fboxsep{3\p@}
+\setlength\fboxrule{.4\p@}
+\setlength\arrayrulewidth{.4\p@}
+\setlength\doublerulesep{2\p@}
+
+% not set on purpose
+%\setlength\arraycolsep{5\p@}
+%\setlength\tabcolsep{6\p@}
+%\setlength\tabbingsep{\labelsep}
+
+\raggedbottom
+\onecolumn
+
+
+%-------------------------------------------------------------------------------
+%                overall design commands definitions
+%-------------------------------------------------------------------------------
+% elements
+%---------
+% defines one's name
+% usage: \name{<firstname>}{<lastname>}
+\newcommand*{\name}[2]{\def\@firstname{#1}\def\@lastname{#2}}
+
+% defines one's title (optional)
+% usage: \title{<title>}
+\renewcommand*{\title}[1]{\def\@title{#1}}
+
+% defines one's address (optional)
+% usage: \address{<street>}{<city>}{<country>}
+% where the <city> and <country> arguments can be omitted or provided empty
+\NewDocumentCommand{\address}{mG{}G{}}{\def\@addressstreet{#1}\def\@addresscity{#2}\def\@addresscountry{#3}}
+
+% defines one's birthday (optional)
+% usage: \born{date, place}
+\newcommand*{\born}[1]{\def\@born{#1}}
+
+% defines one's email (optional)
+% usage: \email{<email adress>}
+\newcommand*{\email}[1]{\def\@email{#1}}
+
+% defines one's home page (optional)
+% usage: \homepage[<optional protocol>]{<url>}
+% where <optional protocol> should be either "https" (default) or "http"
+\NewDocumentCommand{\homepage}{O{https}m}{\def\@homepageprotocol{#1}\def\@homepage{#2}}
+
+% adds a fixed/mobile/fax number to one's personal information (optional)
+% usage: \phone[<optional type>]{<number>}
+% where <optional type> should be either "fixed" (default), "mobile" or "fax
+\collectionnew{phones}
+\NewDocumentCommand{\phone}{O{fixed}m}{%
+  \ifthenelse{\equal{#1}{fax}}%
+    {\collectionadd[#1]{phones}{#2}}
+    {\collectionadd[#1]{phones}{\protect\tellink{#2}}}
+    }
+
+
+% http://latex.org/forum/viewtopic.php?t=12239
+\def\SplitMyMacro#1/#2{#2}
+
+
+% adds a social link to one's personal information (optional)
+% usage: \social[<optional type>][<optional url>]{<account name>}
+% where <optional type> should be either:
+% - "linkedin"
+% - "xing"
+% - "twitter"
+% - "mastodon"
+% - "github"
+% - "gitlab"
+% - "stackoverflow"
+% - "bitbucket"
+% - "skype"
+% - "orcid"
+% - "researchgate"
+% - "researcherid"
+% - "telegram"
+% - "whatsapp"
+% - "signal"
+% - "matrix"
+% - "googlescholar"
+% - "codeberg"
+% - "discord"
+% - "twitch"
+% - "youtube"
+% - "tiktok"
+% - "instagram"
+% - "soundcloud"
+% - "steam
+% - "xbox"
+% - "playstation"
+% - "battlenet"
+\collectionnew{socials}
+\NewDocumentCommand{\social}{O{}O{}m}{%
+  \ifthenelse{\equal{#2}{}}%
+    {%
+      \ifthenelse{\equal{#1}{linkedin}}     {\collectionadd[linkedin]{socials}     {\protect\httpslink[#3]{www.linkedin.com/in/#3}}}               {}%
+      \ifthenelse{\equal{#1}{xing}}         {\collectionadd[xing]{socials}         {\protect\httpslink[#3]{www.xing.com/profile/#3}}}              {}%
+      \ifthenelse{\equal{#1}{twitter}}      {\collectionadd[twitter]{socials}      {\protect\httpslink[#3]{twitter.com/#3}}}                       {}%
+      \ifthenelse{\equal{#1}{mastodon}}     {\collectionadd[mastodon]{socials}     {\protect\httpslink[#3]{#3}}}                                   {}%
+      \ifthenelse{\equal{#1}{github}}       {\collectionadd[github]{socials}       {\protect\httpslink[#3]{github.com/#3}}}                        {}%
+      \ifthenelse{\equal{#1}{gitlab}}       {\collectionadd[gitlab]{socials}       {\protect\httpslink[#3]{gitlab.com/#3}}}                        {}%
+      \ifthenelse{\equal{#1}{stackoverflow}}{\collectionadd[stackoverflow]{socials}{\protect\httpslink[#3]{stackoverflow.com/users/#3}}}           {}%
+      \ifthenelse{\equal{#1}{bitbucket}}    {\collectionadd[bitbucket]{socials}    {\protect\httpslink[#3]{bitbucket.org/#3}}}                     {}%
+      \ifthenelse{\equal{#1}{skype}}        {\collectionadd[skype]{socials}        {#3}}                                                           {}%
+      \ifthenelse{\equal{#1}{orcid}}        {\collectionadd[orcid]{socials}        {\protect\httpslink[#3]{orcid.org/#3}}}                         {}%
+      \ifthenelse{\equal{#1}{researchgate}} {\collectionadd[researchgate]{socials} {\protect\httpslink[#3]{www.researchgate.net/profile/#3}}}      {}%
+      \ifthenelse{\equal{#1}{researcherid}} {\collectionadd[researcherid]{socials} {\protect\httpslink[#3]{www.researcherid.com/rid/#3}}}          {}%
+      \ifthenelse{\equal{#1}{telegram}}     {\collectionadd[telegram]{socials}     {\protect\httpslink[#3]{t.me/#3}}}                              {}%
+      \ifthenelse{\equal{#1}{whatsapp}}     {\collectionadd[whatsapp]{socials}     {\protect\httpslink[#3]{wa.me/#3}}}                             {}%
+      \ifthenelse{\equal{#1}{signal}}       {\collectionadd[signal]{socials}       {#3}}                                                           {}%
+      \ifthenelse{\equal{#1}{matrix}}       {\collectionadd[matrix]{socials}       {\httpslink[#3]{matrix.to/\#/#3}}}                              {}%
+      \ifthenelse{\equal{#1}{googlescholar}}{\collectionadd[googlescholar]{socials}{\protect\httpslink[#3]{scholar.google.com/citations?user=#3}}} {}%
+      \ifthenelse{\equal{#1}{codeberg}}     {\collectionadd[codeberg]{socials}     {\protect\httpslink[#3]{codeberg.org/#3}}}                      {}%
+      \ifthenelse{\equal{#1}{discord}}      {\collectionadd[discord]{socials}      {#3}}                                                           {}%
+      \ifthenelse{\equal{#1}{twitch}}       {\collectionadd[twitch]{socials}       {\protect\httpslink[#3]{twitch.tv/#3}}}                         {}%
+      \ifthenelse{\equal{#1}{youtube}}      {\collectionadd[youtube]{socials}      {\protect\httpslink[#3]{youtube.com/#3}}}                       {}%
+      \ifthenelse{\equal{#1}{tiktok}}       {\collectionadd[tiktok]{socials}       {\protect\httpslink[#3]{tiktok.com/@#3}}}                       {}%
+      \ifthenelse{\equal{#1}{instagram}}    {\collectionadd[instagram]{socials}    {\protect\httpslink[#3]{instagram.com/#3}}}                     {}%
+      \ifthenelse{\equal{#1}{soundcloud}}   {\collectionadd[soundcloud]{socials}   {\protect\httpslink[#3]{soundcloud.com/#3}}}                    {}%
+      \ifthenelse{\equal{#1}{steam}}        {\collectionadd[steam]{socials}        {\protect\httpslink[#3]{steamcommunity.com/id/#3}}}             {}%
+      \ifthenelse{\equal{#1}{xbox}}         {\collectionadd[xbox]{socials}         {\protect\httpslink[#3]{account.xbox.com/profile?gamertag=#3}}} {}%
+      \ifthenelse{\equal{#1}{playstation}}  {\collectionadd[playstation]{socials}  {#3}} {}%
+      \ifthenelse{\equal{#1}{battlenet}}    {\collectionadd[battlenet]{socials}    {#3}} {}%
+      }
+    {\collectionadd[#1]{socials}{\protect\httpslink[#3]{#2}}}}%
+
+% defines additional personal information (optional)
+% usage: \extrainfo{<text>}
+\newcommand*{\extrainfo}[1]{\def\@extrainfo{#1}}
+
+% colors
+%-------
+\definecolor{color0}{rgb}{0,0,0}% main default color, normally left to black
+\definecolor{color1}{rgb}{0,0,0}% primary scheme color
+\definecolor{color2}{rgb}{0,0,0}% secondary scheme color
+\definecolor{color3}{rgb}{0,0,0}% tertiary scheme color
+
+% symbols
+%--------
+% itemize labels (the struts were added to correct inter-item spacing (works for single line items, until a solution is found for multi-line ones...)
+\newcommand*{\labelitemi}          {\strut\textcolor{color1}{\large\rmfamily\textbullet}}% the \rmfamily is required to force Latin Modern fonts when using sans serif, as OMS/lmss/m/n is not defined and gets substituted by OMS/cmsy/m/n
+\newcommand*{\labelitemii}         {\strut\textcolor{color1}{\large\bfseries-}}
+\newcommand*{\labelitemiii}        {\strut\textcolor{color1}{\rmfamily\textperiodcentered}}% alternative: \textasteriskcentered; the \rmfamily is required to force Latin Modern fonts when using sans serif, as OMS/lmss/m/n is not defined and gets substituted by OMS/cmsy/m/n
+\newcommand*{\labelitemiv}         {\labelitemiii}
+
+% enumerate labels
+\renewcommand{\theenumi}           {\@arabic\c@enumi}
+\renewcommand{\theenumii}          {\@alph\c@enumii}
+\renewcommand{\theenumiii}         {\@roman\c@enumiii}
+\renewcommand{\theenumiv}          {\@Alph\c@enumiv}
+
+% other symbols
+\newcommand*{\listitemsymbol}           {\labelitemi~}
+\newcommand*{\addresssymbol}            {}
+\newcommand*{\bornsymbol}               {}
+\newcommand*{\mobilephonesymbol}        {}
+\newcommand*{\fixedphonesymbol}         {}
+\newcommand*{\faxphonesymbol}           {}
+\newcommand*{\emailsymbol}              {}
+\newcommand*{\homepagesymbol}           {}
+\newcommand*{\linkedinsocialsymbol}     {}
+\newcommand*{\xingsocialsymbol}         {}
+\newcommand*{\twittersocialsymbol}      {}
+\newcommand*{\mastodonsocialsymbol}     {}
+\newcommand*{\githubsocialsymbol}       {}
+\newcommand*{\gitlabsocialsymbol}       {}
+\newcommand*{\stackoverflowsocialsymbol}{}
+\newcommand*{\bitbucketsocialsymbol}    {}
+\newcommand*{\skypesocialsymbol}        {}
+\newcommand*{\orcidsocialsymbol}        {}
+\newcommand*{\researchgatesocialsymbol} {}
+\newcommand*{\researcheridsocialsymbol} {}
+\newcommand*{\googlescholarsocialsymbol}{}
+\newcommand*{\telegramsocialsymbol}     {}
+\newcommand*{\whatsappsocialsymbol}     {}
+\newcommand*{\matrixsocialsymbol}       {}
+\newcommand*{\signalsocialsymbol}       {}
+\newcommand*{\codebergsocialsymbol}     {}
+\newcommand*{\discordsocialsymbol}      {}
+\newcommand*{\twitchsocialsymbol}       {}
+\newcommand*{\youtubesocialsymbol}      {}
+\newcommand*{\tiktoksocialsymbol}       {}
+\newcommand*{\instagramsocialsymbol}    {}
+\newcommand*{\soundcloudsocialsymbol}   {}
+\newcommand*{\steamsocialsymbol}        {}
+\newcommand*{\xboxsocialsymbol}         {}
+\newcommand*{\playstationsocialsymbol}  {}
+\newcommand*{\battlenetsocialsymbol}    {}
+
+% other
+%------
+% fonts
+\AtBeginDocument{\normalfont\color{color0}}
+
+% strings for internationalisation
+\newcommand*{\refname}{Publications}
+\newcommand*{\enclname}{Enclosure}
+
+% makes the footer (normally used both for the resume and the letter)
+% usage: \makefooter
+\newcommand*{\makefooter}{}%
+
+\newcommand*{\@loadmoderncvpackage}[3][]{%
+  \begingroup\edef\x{\endgroup%
+    \noexpand\RequirePackage[#1]{moderncv#2\ifcase#3\or i\or ii\or iii\or iv\or v\or vi\or vii\or viii\or ix\or x\fi}%
+  }\x}
+
+% loads a style variant (a combination of header, body and footer)
+% usage: \moderncvstyle{<style variant name>}
+\newcommand*{\moderncvstyle}[2][]{%
+  \RequirePackage[#1]{moderncvstyle#2}}
+
+% loads a header variant
+% usage: \moderncvhead[<optional head option>]{<header variant number>}
+\newcommand*{\moderncvhead}[2][]{%
+  \@loadmoderncvpackage[#1]{head}{#2}}
+
+% loads a body variant
+% usage: \moderncvbody[<optional body option>]{<body variant number>}
+\newcommand*{\moderncvbody}[2][]{%
+  \@loadmoderncvpackage[#1]{body}{#2}}
+
+% loads a footer variant
+% usage: \moderncvfoot[<optional foot option>]{<foot variant number>}
+\newcommand*{\moderncvfoot}[2][]{%
+  \@loadmoderncvpackage[#1]{foot}{#2}}
+
+% loads a color scheme
+% usage: \moderncvcolor{<color scheme name>}
+\newcommand*{\moderncvcolor}[1]{%
+  \RequirePackage{moderncvcolor#1}}
+
+% loads an icons set
+% usage: \moderncvicons{<icon set name>}
+\newcommand*{\moderncvicons}[1]{%
+  \RequirePackage{moderncvicons#1}}
+
+% recomputes all automatic lengths
+\newcommand*{\recomputeheadlengths}{\recomputecvheadlengths}
+\newcommand*{\recomputebodylengths}{\recomputecvbodylengths}
+\newcommand*{\recomputefootlengths}{\recomputecvfootlengths}
+\newcommand*{\recomputelengths}{\recomputecvlengths}
+\AtBeginDocument{\recomputelengths{}}
+
+% creates a command if not yet defined
+\newcommand*{\@initializecommand}[2]{%
+  \ifdefined#1
+    \renewcommand{#1}{#2}%
+  \else%
+    \newcommand*{#1}{#2}\fi}
+
+% creates a length if not yet defined
+\newcommand*{\@initializelength}[1]{%
+  \ifdefined#1
+  \else%
+    \newlength{#1}\fi%
+  \setlength{#1}{0pt}}
+
+% creates a box if not yet defined
+\newcommand*{\@initializebox}[1]{%
+  \ifdefined#1
+    \savebox{#1}{}%
+  \else%
+    \newsavebox{#1}\fi}
+
+% creates an if switch if not yet defined
+\newcommand*{\@initializeif}[1]{%
+%  \ifdefined#1% not working due to the nested \if
+%  \else%
+    \newif#1%\fi
+  }
+
+% custom strut for spacing; the first argument is the vertical offset of the strut, the second its total height
+\newcommand*{\@moderncvstrut}[2]{%
+  \rule[-#1]{0pt}{#2}}
+
+
+%-------------------------------------------------------------------------------
+%                resume design commands definitions
+%-------------------------------------------------------------------------------
+% elements
+% defines one's picture (optional)
+% usage: photo[<picture width>][<picture frame thickness>]{<picture filename>}
+\NewDocumentCommand{\photo}{O{64pt}O{0.4pt}m}{\def\@photowidth{#1}\def\@photoframewidth{#2}\def\@photo{#3}}
+\newcommand*{\quote}[1]{\def\@quote{#1}}
+
+% fonts
+\newcommand*{\namefont}{}
+\newcommand*{\titlefont}{}
+\newcommand*{\addressfont}{}
+\newcommand*{\quotefont}{}
+\newcommand*{\sectionfont}{}
+\newcommand*{\subsectionfont}{}
+\newcommand*{\hintfont}{}
+\newcommand*{\pagenumberfont}{\addressfont\itshape}
+% fake small caps - cfr http://tex.stackexchange.com/questions/55664/fake-small-caps-with-xetex-fontspec
+%\def\fakesc{\bgroup\obeyspaces\fakescaux}
+%\def\fakescaux#1{\fakescauxii #1\relax\relax\egroup}
+%\def\fakescauxii#1{%
+%\ifx\relax#1\else \ifcat#1\@sptoken{} \expandafter\expandafter\expandafter\fakescauxii\else
+%\ifnum`#1=\uccode`#1 {\normalsize #1}\else {\footnotesize \uppercase{#1}}\fi \expandafter\expandafter\expandafter\fakescauxii\expandafter\fi\fi}
+
+% styles
+\newcommand*{\namestyle}[1]{{\namefont#1}}
+\newcommand*{\titlestyle}[1]{{\titlefont#1}}
+\newcommand*{\addressstyle}[1]{{\addressfont#1}}
+\newcommand*{\quotestyle}[1]{{\quotefont#1}}
+\newcommand*{\sectionstyle}[1]{{\sectionfont#1}}
+\newcommand*{\subsectionstyle}[1]{{\subsectionfont#1}}
+\newcommand*{\hintstyle}[1]{{\hintfont#1}}
+\newcommand*{\pagenumberstyle}[1]{{\pagenumberfont#1}}
+
+% recompute all resume lengths
+\newcommand*{\recomputecvheadlengths}{}
+\newcommand*{\recomputecvbodylengths}{}
+\newcommand*{\recomputecvfootlengths}{}
+\newcommand*{\recomputecvlengths}{%
+  \recomputecvheadlengths%
+  \recomputecvbodylengths%
+  \recomputecvfootlengths}
+
+% internal maketitle command to issue a new line only when required
+\newif\if@firstdetailselement\@firstdetailselementtrue
+\newcommand*{\makenewline}[1][0pt]{%
+  \if@firstdetailselement%
+    \strut% to ensure baseline alignment, e.g. with when put in the margin vs sections that also contains a \strut
+  \else%
+    \\[#1]\fi%
+  \@firstdetailselementfalse}
+
+% makes the resume title
+% usage: \makecvtitle
+\newcommand*{\makecvtitle}{%
+  \makecvhead%
+  \makecvfoot}
+\newcommand*{\makecvhead}{}
+\newcommand*{\makecvfoot}{}
+
+% makes a resume section
+% usage: \section{<title>}
+% identical starred and non-starred variants should be defined for compatibility with other packages (e.g. with natbib, that uses \section*{} for the bibliography header)
+\NewDocumentCommand{\section}{sm}{}
+
+% makes a resume subsection
+% usage: \subsection{title}
+\NewDocumentCommand{\subsection}{sm}{}
+
+% makes a resume line with a header and a corresponding text
+% usage: \cvitem[spacing]{header}{text}
+\newcommand*{\cvitem}[3][.25em]{}
+
+% makes a resume line 2 headers and their corresponding text
+% usage: \cvdoubleitem[spacing]{header1}{text1}{header2}{text2}
+\newcommand*{\cvdoubleitem}[5][.25em]{}
+
+% makes a resume line with a list item
+% usage: \cvlistitem[label]{item}
+\newcommand*{\cvlistitem}[2][\listitemsymbol]{}
+
+% makes a resume line with 2 list items
+% usage: \cvlistdoubleitem[label]{item1}{item2}
+\newcommand*{\cvlistdoubleitem}[3][\listitemsymbol]{}
+
+% makes a typical resume job / education entry
+% usage: \cventry[spacing]{years}{degree/job title}{institution/employer}{localization}{optionnal: grade/...}{optional: comment/job description}
+\newcommand*{\cventry}[7][.25em]{}
+
+% makes a resume entry with a proficiency comment
+% usage: \cvitemwithcomment[spacing]{header}{text}{comment}
+\newcommand*{\cvitemwithcomment}[4][.25em]{}
+
+% makes a generic hyperlink
+% usage: \link[optional text]{link}
+% uses pdfmanagement-testphase when available, which provides url encoding of special characters
+\NewDocumentCommand{\link}{O{}m}{%
+  \IfPDFManagementActiveTF{%
+    \ifthenelse{\equal{#1}{}}%
+      {\hrefurl[urlencode]{#2}{#2}}%
+      {\hrefurl[urlencode]{#2}{#1}}}{%
+    \ifthenelse{\equal{#1}{}}%
+      {\href{#2}{#2}}%
+      {\href{#2}{#1}}}}
+
+% makes a http hyperlink
+% usage: \httplink[optional text]{link}
+% uses pdfmanagement-testphase when available, which provides url encoding of special characters
+\NewDocumentCommand{\httplink}{O{}m}{%
+  \IfPDFManagementActiveTF{%
+    \ifthenelse{\equal{#1}{}}%
+      {\hrefurl[urlencode]{http://#2}{#2}}%
+      {\hrefurl[urlencode]{http://#2}{#1}}}{%
+    \ifthenelse{\equal{#1}{}}%
+      {\href{http://#2}{#2}}%
+      {\href{http://#2}{#1}}}}
+
+% makes an https hyperlink
+% usage: \httpslink[optional text]{link}
+% uses pdfmanagement-testphase when available, which provides url encoding of special characters
+\NewDocumentCommand{\httpslink}{O{}m}{%
+  \IfPDFManagementActiveTF{%
+    \ifthenelse{\equal{#1}{}}%
+      {\hrefurl[urlencode]{https://#2}{#2}}%
+      {\hrefurl[urlencode]{https://#2}{#1}}}{%
+    \ifthenelse{\equal{#1}{}}%
+      {\href{https://#2}{#2}}%
+      {\href{https://#2}{#1}}}}
+
+% makes an email hyperlink
+% usage: \emaillink[optional text]{link}
+\newcommand*{\emaillink}[2][]{%
+  \ifthenelse{\equal{#1}{}}%
+    {\href{mailto:#2}{#2}}%
+    {\href{mailto:#2}{#1}}}
+
+% makes a tel hyperlink
+% usage: \tellink[optional text]{link}
+\newcommand*{\tellink}[2][]{%
+  \ifthenelse{\equal{#1}{}}%
+    {\expandafter\onlynumberslink\expandafter{#2}{#2}}%
+    {\expandafter\onlynumberslink\expandafter{#2}{#1}}}
+
+\ExplSyntaxOn
+\tl_new:N \l_onlynumberslink_tl
+\cs_new:Npn \onlynumberslink #1 #2  {
+    \tl_set:Nn \l_onlynumberslink_tl {#1}
+    \regex_replace_all:nnN {[^0-9+]} {} \l_onlynumberslink_tl
+    \href{ tel\token_to_str:N : \tl_use:N \l_onlynumberslink_tl}{ #2 }
+}
+\ExplSyntaxOff
+
+% cvcolumns environment, where every column is created through \cvcolumn
+% usage: \begin{cvcolumns}
+%          \cvcolumn[width]{head}{content}
+%          \cvcolumn[width]{head}{content}
+%          ...
+%        \end{cvcolumns}
+% where "width" is the width as a fraction of the line length (between 0 and 1), "head" is the column header and "content" its content
+\newcounter{cvcolumnscounter}% counter for the number of columns
+\newcounter{cvcolumnsautowidthcounter}% counter for the number of columns with no column width provided, and which will then be equally distributed
+\newcounter{tmpiteratorcounter}% counter for any temporary purpose (e.g., iterating loops)
+\newlength{\cvcolumnsdummywidth}\setlength{\cvcolumnsdummywidth}{1000pt}% dummy width for total width, in order to enable arithmetics (TeX has no float variables, only integer counters or lengths)
+\newlength{\cvcolumnswidth}% total width available for head / content
+\newlength{\cvcolumnsautowidth}% total width of columns with no explicit width provided
+\newlength{\cvcolumnautowidth}% width of one of the columns with no explicit width provided (based on equal distribution of remaining space)
+\newif\if@cvcolumns@head@empty% whether or not at least one of the columns has a header
+\newenvironment*{cvcolumns}%
+  {% at environment opening: reset counters, lengths and ifs
+    \setcounter{cvcolumnscounter}{0}%
+    \setcounter{cvcolumnsautowidthcounter}{0}%
+    \setlength{\cvcolumnsautowidth}{\cvcolumnsdummywidth}%
+    \setlength{\cvcolumnautowidth}{0pt}%
+    \@cvcolumns@head@emptytrue\ignorespaces}%
+  {% at environment closing: typeset environment
+    % compute the width of each cvcolumn, considering a spacing of \separatorcolumnwidth and the columns with set width
+    \ifnum\thecvcolumnscounter>0%
+      \setlength{\cvcolumnswidth}{\maincolumnwidth-\value{cvcolumnscounter}\separatorcolumnwidth+\separatorcolumnwidth}%
+      \setlength{\cvcolumnautowidth}{\cvcolumnswidth*\ratio{\cvcolumnsautowidth}{\cvcolumnsdummywidth}/\value{cvcolumnsautowidthcounter}}\fi%
+    % pre-aggregate the tabular definition, heading and content (required before creating the tabular, as the tabular environment doesn't like loops --- probably because "&" generates a \endgroup)
+    % - the tabular definition is the aggregation of the different "\cvcolumn<i>@def" (by default "p{\cvcolumnautowidth}"), separated by "@{\hspace*{\separatorcolumnwidth}}"
+    % - the tabular heading is the aggregation of the different "\cvcolumn<i>@head", separated by "&"
+    % - the tabular content is the aggregation of the different "\cvcolumn<i>@content", separated by "&"
+    % to aggregate the different elements, \protected@edef or \g@addto@macro is required to avoid that \cvcolumns@def, -@head and -@content get expanded in subsequent redefinitions, which would cause errors due to the expansions of \hspace, of \subsectionstyle and possibly of user content/argument such as font commands
+    \def\cvcolumns@def{}%
+    \def\cvcolumns@head{}%
+    \def\cvcolumns@content{}%
+    \setcounter{tmpiteratorcounter}{0}%
+    % loop based on \g@addto@macro
+    \loop\ifnum\thetmpiteratorcounter<\thecvcolumnscounter%
+      \ifnum\thetmpiteratorcounter=0\else%
+        \g@addto@macro\cvcolumns@def{@{\hspace*{\separatorcolumnwidth}}}%
+        \g@addto@macro\cvcolumns@head{&}%
+        \g@addto@macro\cvcolumns@content{&}\fi%
+%      \expandafter\g@addto@macro\expandafter\cvcolumns@def\expandafter{\csname cvcolumn\roman{tmpiteratorcounter}@def\endcsname}%      % this creates issues with the colortbl" package (loaded by xcolor when passing the "table" option) as the column definitions passed to \begin{tabular} contains \cvcolumn<i>@def references that it doesn't understand; the next 2 lines expand \cvcolumn@def to the point it doesn't
+      \edef\tmpcvcolumn@def{\csname cvcolumn\roman{tmpiteratorcounter}@def\endcsname}%
+      \expandafter\g@addto@macro\expandafter\cvcolumns@def\expandafter{\tmpcvcolumn@def}%
+      \expandafter\g@addto@macro\expandafter\cvcolumns@head\expandafter{\csname cvcolumn\roman{tmpiteratorcounter}@head\endcsname}%
+      \expandafter\g@addto@macro\expandafter\cvcolumns@content\expandafter{\csname cvcolumn\roman{tmpiteratorcounter}@content\endcsname}%
+      \stepcounter{tmpiteratorcounter}%
+      \repeat%
+%    % same loop based on \protected@edef
+%    \loop\ifnum\thetmpiteratorcounter<\thecvcolumnscounter%
+%      \ifnum\thetmpiteratorcounter=0\else%
+%        \protected@edef\cvcolumns@def{\cvcolumns@def @{\hspace*{\separatorcolumnwidth}}}%
+%        \protected@edef\cvcolumns@head{\cvcolumns@head &}%
+%        \protected@edef\cvcolumns@content{\cvcolumns@content &}\fi%
+%      \expandafter\protected@edef\expandafter\cvcolumns@def\expandafter{\expandafter\cvcolumns@def\expandafter\protect\csname cvcolumn\roman{tmpiteratorcounter}@def\endcsname}%
+%      \expandafter\protected@edef\expandafter\cvcolumns@head\expandafter{\expandafter\cvcolumns@head\expandafter\protect\csname cvcolumn\roman{tmpiteratorcounter}@head\endcsname}%
+%      \expandafter\protected@edef\expandafter\cvcolumns@content\expandafter{\expandafter\cvcolumns@content\expandafter\protect\csname cvcolumn\roman{tmpiteratorcounter}@content\endcsname}%
+%      \stepcounter{tmpiteratorcounter}%
+%      \repeat%
+    % create the tabular
+    \cvitem{}{%
+%      \begin{tabular}{\cvcolumns@def}% this conflicts with the "colortbl" package (loaded by xcolor when passing the "table" option), and requires the below 2 lines to expand \cvcolumns@def
+      \def\begincvcolumns{\begin{tabular}[t]}% "[t]" is required for some body styles; the default alignment is "[c]"
+      \expandafter\begincvcolumns\expandafter{\cvcolumns@def}%
+        \if@cvcolumns@head@empty\else%
+          \cvcolumns@head%\\[-.8em]%
+%          {\color{color1}\rule{\maincolumnwidth}{.25pt}}%
+          \\\fi%
+        \cvcolumns@content%
+      \end{tabular}}}
+
+% cvcolumn command, to create a column inside a cvcolumns environment
+% usage: \cvcolumn[width]{head}{content}
+% where "width" is the width as a fraction of the line length (between 0 and 1), "head" is the column header and "content" its content ("head" and "content" can contain "\\", "\newline" or any other paragraph command such as "itemize")
+\newcommand*{\cvcolumn}[3][\cvcolumnautowidth]{%
+%  \def\cvcolumn@width{}%
+  \ifthenelse{\equal{#1}{\cvcolumnautowidth}}%
+    {% if no width fraction is provided, count this column as auto-adjusted and set its width to \cvcolumnsautowidth
+      \stepcounter{cvcolumnsautowidthcounter}%
+      \expandafter\expandafter\expandafter\def\expandafter\csname cvcolumn\roman{cvcolumnscounter}@def\endcsname{p{\cvcolumnautowidth}}%
+      \expandafter\expandafter\expandafter\def\expandafter\csname cvcolumn\roman{cvcolumnscounter}@head\endcsname{\protect\parbox[b]{\cvcolumnautowidth}{\protect\subsectionstyle{#2}}}}%
+    {% if a width is provided, set the width of the column to it and decrease the available space for auto-adjusted columns
+      \addtolength{\cvcolumnsautowidth}{-#1\cvcolumnsdummywidth}%
+      \expandafter\expandafter\expandafter\def\expandafter\csname cvcolumn\roman{cvcolumnscounter}@def\endcsname{p{#1\cvcolumnswidth}}%
+      \expandafter\expandafter\expandafter\def\expandafter\csname cvcolumn\roman{cvcolumnscounter}@head\endcsname{\protect\parbox[b]{#1\cvcolumnswidth}{\protect\subsectionstyle{#2}}}}%
+  \ifthenelse{\equal{#2}{}}{}{\@cvcolumns@head@emptyfalse}%
+  \expandafter\expandafter\expandafter\def\expandafter\csname cvcolumn\roman{cvcolumnscounter}@content\endcsname{\protect\cvcolumncell{#3}}%
+  \stepcounter{cvcolumnscounter}%
+  \ignorespaces}
+
+% internal cvcolumncell command, that enables a cvcolumn cell to contain paragraph commands (lists, newlines, etc)
+\newcommand*{\cvcolumncell}[1]{{% put cell inside a group, so that command redefinitions are only local
+  % roughly restore \\ to its regular definition (outside of tabular)
+  \renewcommand*{\\}{\newline}%
+  % enclose the contents of the cell inside a vertical box, to allow paragraph commands
+  \protect\vtop{#1}}}
+
+% thebibliography environment, for use with BibTeX and possibly multibib
+\newlength{\bibindent}
+\setlength{\bibindent}{1.5em}
+% bibliography item label
+\newcommand*{\bibliographyitemlabel}{}% use \@biblabel{\arabic{enumiv}} for BibTeX labels
+%\newif\if@multibibfirstbib\@multibibfirstbibfalse
+% bibliography head (section, etc}, depending on whether multibib is used
+\newcommand*{\bibliographyhead}[1]{\section{#1}}
+\AtEndPreamble{\@ifpackageloaded{multibib}{\renewcommand*{\bibliographyhead}[1]{\subsection{#1}}}{}}
+% thebibliography environment definition
+\newenvironment{thebibliography}[1]{}{}
+\newcommand*{\newblock}{\hskip .11em\@plus.33em\@minus.07em}
+\let\@openbib@code\@empty
+%% fix a bug (hardcoded bib label) in \@bibitem
+%\renewcommand\@bibitem[1]{%
+%  \item\if@filesw \immediate\write\@auxout
+%    {\string\bibcite{#1}{\theenumiv}}\fi\ignorespaces}% replaced "\the\value{\@listctr}" with "\theenumiv"
+
+% itemize, enumerate and description environment
+\setlength{\leftmargini}   {1em}
+\leftmargin\leftmargini
+\setlength{\leftmarginii}  {\leftmargini}
+\setlength{\leftmarginiii} {\leftmargini}
+\setlength{\leftmarginiv}  {\leftmargini}
+\setlength{\leftmarginv}   {\leftmargini}
+\setlength{\leftmarginvi}  {\leftmargini}
+\setlength{\labelsep}      {.5em}% this is the distance between the label and the body, but it pushes the label to the left rather than pushing the body to the right (to do the latter, modify \leftmargin(i)
+\setlength{\labelwidth}    {\leftmargini}% unfortunately, \labelwidth is not defined by item level (i.e. no \labeliwidth, \labeliiwidth, etc)
+\addtolength{\labelwidth}  {-\labelsep}
+\@beginparpenalty -\@lowpenalty
+\@endparpenalty   -\@lowpenalty
+\@itempenalty     -\@lowpenalty
+\newcommand\labelenumi{\theenumi.}
+\newcommand\labelenumii{(\theenumii)}
+\newcommand\labelenumiii{\theenumiii.}
+\newcommand\labelenumiv{\theenumiv.}
+\renewcommand\p@enumii{\theenumi}
+\renewcommand\p@enumiii{\p@enumii(\theenumii)}
+\renewcommand\p@enumiv{\p@enumiii\theenumiii}
+% description label
+\newcommand*\descriptionlabel[1]{\hspace\labelsep\normalfont\bfseries#1}
+
+% classical \today definition
+\def\today{\ifcase\month\or
+  January\or February\or March\or April\or May\or June\or
+  July\or August\or September\or October\or November\or December\fi
+  \space\number\day, \number\year}
+
+%\newcommand{\widthofautobox}[1]{%
+%  \widthof{\begin{tabular}{@{}l@{}}#1\end{tabular}}}
+
+%\newcommand{\autobox}[2][b]{%
+%  \parbox[#1]{\widthofautobox{#2}}{#2}}
+
+
+%-------------------------------------------------------------------------------
+%                letter design commands definitions
+%-------------------------------------------------------------------------------
+% elements
+\newcommand*{\recipient}[2]{\def\@recipientname{#1}\def\@recipientaddress{#2}}
+\renewcommand*{\date}[1]{\def\@date{#1}}\date{\today}
+\newcommand*{\subject}[1]{\def\@subject{#1}}
+\newcommand*{\opening}[1]{\def\@opening{#1}}
+\newcommand*{\closing}[1]{\def\@closing{#1}}
+\newcommand*{\signature}[2]{\def\@signature{\includegraphics[scale=#1]{#2}}}
+\newcommand*{\enclosure}[2][]{%
+  % if an optional argument is provided, use it to redefine \enclname
+  \ifthenelse{\equal{#1}{}}{}{\renewcommand*{\enclname}{#1}}%
+  \def\@enclosure{#2}}
+
+% recompute all letter lengths
+\newcommand*{\recomputeletterheadlengths}{}
+\newcommand*{\recomputeletterbodylengths}{}
+\newcommand*{\recomputeletterfootlengths}{}
+\newcommand*{\recomputeletterlengths}{%
+  \recomputeletterheadlengths%
+  \recomputeletterbodylengths%
+  \recomputeletterfootlengths}
+
+% makes the letter title
+% usage: \makelettertitle
+\newcommand*{\makelettertitle}{%
+  \makeletterhead%
+  \makeletterfoot}
+\newcommand*{\makeletterhead}{}
+\newcommand*{\makeletterfoot}{}
+
+% makes the letter closing
+% usage: \makeletterclosing
+\newcommand*{\makeletterclosing}{}
+
+
+\endinput
+
+
+%% end of file `moderncv.cls'.
diff --git a/moderncvbodyi.sty b/moderncvbodyi.sty
new file mode 100644 (file)
index 0000000..5099ad2
--- /dev/null
@@ -0,0 +1,179 @@
+%% start of file `moderncvbodyi.sty'.
+%% Copyright 2006-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv).
+%
+% 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{moderncvbodyi}[2022-02-21 v2.3.1 modern curriculum vitae and letter body variant: 1]
+
+
+%-------------------------------------------------------------------------------
+%                required packages
+%-------------------------------------------------------------------------------
+% provides the commands for the skillmatrix as well as the command
+% \recompute@cvskillmatrix@lengths
+\RequirePackage[moderncvbodyi]{moderncvskillmatrix}
+
+%-------------------------------------------------------------------------------
+%                overall body definition
+%-------------------------------------------------------------------------------
+% fonts
+\renewcommand*{\sectionfont}{\Large\mdseries\upshape}
+\renewcommand*{\subsectionfont}{\large\mdseries\upshape}
+\renewcommand*{\hintfont}{}
+
+% styles
+\renewcommand*{\sectionstyle}[1]{{\sectionfont\textcolor{color1}{#1}}}
+\renewcommand*{\subsectionstyle}[1]{{\subsectionfont\textcolor{color1}{#1}}}
+\renewcommand*{\hintstyle}[1]{{\hintfont\textcolor{color0}{#1}}}
+
+
+%-------------------------------------------------------------------------------
+%                resume body definition
+%-------------------------------------------------------------------------------
+% lengths
+%   used by \cvitem (and all children command)
+\@initializelength{\hintscolumnwidth}             \setlength{\hintscolumnwidth}{0.175\textwidth}
+\@initializelength{\separatorcolumnwidth}         \setlength{\separatorcolumnwidth}{0.025\textwidth}
+\@initializelength{\maincolumnwidth}
+%   used by \cvdoubleitem
+\@initializelength{\doubleitemcolumnwidth}
+%   used by \cvlistitem
+\@initializelength{\listitemsymbolwidth}          \settowidth{\listitemsymbolwidth}{\listitemsymbol}
+\@initializelength{\listitemcolumnwidth}
+%   used by \cvlistdoubleitem
+\@initializelength{\listdoubleitemcolumnwidth}
+%   default moderncv \photo (change the definition such that by default the photo and its box align with the section bars
+\RenewDocumentCommand{\photo}{O{\hintscolumnwidth-0.8pt-2\fboxsep}O{0.4pt}m}{\def\@photowidth{#1}\def\@photoframewidth{#2}\def\@photo{#3}}%
+
+% commands
+\renewcommand*{\recomputecvbodylengths}{%
+  % body lengths
+  \setlength{\maincolumnwidth}{\textwidth-\leftskip-\rightskip-\separatorcolumnwidth-\hintscolumnwidth}%
+  \setlength{\listitemcolumnwidth}{\maincolumnwidth-\listitemsymbolwidth}%
+  \setlength{\doubleitemcolumnwidth}{\maincolumnwidth-\hintscolumnwidth-\separatorcolumnwidth-\separatorcolumnwidth}%
+  \setlength{\doubleitemcolumnwidth}{0.5\doubleitemcolumnwidth}%
+  \setlength{\listdoubleitemcolumnwidth}{\maincolumnwidth-\listitemsymbolwidth-\separatorcolumnwidth-\listitemsymbolwidth}%
+  \setlength{\listdoubleitemcolumnwidth}{0.5\listdoubleitemcolumnwidth}%
+  \recompute@cvskillmatrix@lengths
+  % regular lengths
+  \setlength{\parskip}{0\p@}}
+
+
+\@initializelength{\baseletterheight}
+\settoheight{\baseletterheight}{\sectionstyle{o}}
+\setlength{\baseletterheight}{\baseletterheight-0.95ex}
+\RenewDocumentCommand{\section}{sm}{%
+  \par\addvspace{2.5ex}%
+  \phantomsection{}% reset the anchor for hyperrefs
+  \addcontentsline{toc}{section}{#2}%
+  \cvitem[0ex]{\strut\raggedleft\raisebox{\baseletterheight}{\color{color1}\rule{\hintscolumnwidth}{0.95ex}}}{\strut\sectionstyle{#2}}%
+  \par\nobreak\addvspace{1ex}\@afterheading}% to avoid a pagebreak after the heading
+
+\RenewDocumentCommand{\subsection}{sm}{%
+  \par\addvspace{1ex}%
+  \phantomsection{}% reset the anchor for hyperrefs
+  \addcontentsline{toc}{subsection}{#2}%
+  \cvitem[0ex]{}{\strut\subsectionstyle{#2}}%
+  \par\nobreak\addvspace{.5ex}\@afterheading}% to avoid a pagebreak after the heading
+
+\renewcommand*{\cvitem}[3][.25em]{%
+  \begin{tabular}{@{}p{\hintscolumnwidth}@{\hspace{\separatorcolumnwidth}}p{\maincolumnwidth}@{}}%
+    \raggedleft\hintstyle{#2} &{#3}%
+  \end{tabular}%
+  \par\addvspace{#1}}
+
+\renewcommand*{\cvdoubleitem}[5][.25em]{%
+  \cvitem[#1]{#2}{%
+    \begin{minipage}[t]{\doubleitemcolumnwidth}#3\end{minipage}%
+    \hfill% fill of \separatorcolumnwidth
+    \begin{minipage}[t]{\hintscolumnwidth}\raggedleft\hintstyle{#4}\end{minipage}%
+    \hspace*{\separatorcolumnwidth}%
+    \begin{minipage}[t]{\doubleitemcolumnwidth}#5\end{minipage}}}
+
+\renewcommand*{\cvlistitem}[2][.25em]{%
+  \cvitem[#1]{}{\listitemsymbol\begin{minipage}[t]{\listitemcolumnwidth}#2\end{minipage}}}
+
+\renewcommand*{\cvlistdoubleitem}[3][.25em]{%
+  \cvitem[#1]{}{\listitemsymbol\begin{minipage}[t]{\listdoubleitemcolumnwidth}#2\end{minipage}%
+  \hfill% fill of \separatorcolumnwidth
+  \ifthenelse{\equal{#3}{}}%
+    {}%
+    {\listitemsymbol\begin{minipage}[t]{\listdoubleitemcolumnwidth}#3\end{minipage}}}}
+
+\renewcommand*{\cventry}[7][.25em]{%
+  \cvitem[#1]{#2}{%
+    {\bfseries#3}%
+    \ifthenelse{\equal{#4}{}}{}{, {\slshape#4}}%
+    \ifthenelse{\equal{#5}{}}{}{, #5}%
+    \ifthenelse{\equal{#6}{}}{}{, #6}%
+    \strut%
+    \ifx&#7&%
+    \else{\newline{}\begin{minipage}[t]{\linewidth}\small#7\end{minipage}}\fi}}
+
+\@initializebox{\cvitemwithcommentbox}
+\@initializelength{\cvitemwithcommentskilllength}
+\@initializelength{\cvitemwithcommentcommentlength}
+\renewcommand*{\cvitemwithcomment}[4][.25em]{%
+  \savebox{\cvitemwithcommentbox}{{#3}}%
+  \setlength{\cvitemwithcommentskilllength}{\widthof{\usebox{\cvitemwithcommentbox}}}%
+  \setlength{\cvitemwithcommentcommentlength}{\maincolumnwidth-\separatorcolumnwidth-\cvitemwithcommentskilllength}%
+  \cvitem[#1]{#2}{%
+    \begin{minipage}[t]{\cvitemwithcommentskilllength}\usebox{\cvitemwithcommentbox}\end{minipage}%
+    \hfill% fill of \separatorcolumnwidth
+    \begin{minipage}[t]{\cvitemwithcommentcommentlength}\raggedleft\small\itshape#4\end{minipage}}}
+
+\renewenvironment{thebibliography}[1]%
+  {%
+    \bibliographyhead{\refname}%
+%    \small%
+    \begin{list}{\bibliographyitemlabel}%
+      {%
+        \setlength{\topsep}{0pt}%
+        \setlength{\labelwidth}{\hintscolumnwidth}%
+        \setlength{\labelsep}{\separatorcolumnwidth}%
+        \leftmargin\labelwidth%
+        \advance\leftmargin\labelsep%
+        \@openbib@code%
+        \usecounter{enumiv}%
+        \let\p@enumiv\@empty%
+        \renewcommand\theenumiv{\@arabic\c@enumiv}}%
+        \sloppy%
+        \clubpenalty4000%\@clubpenalty \clubpenalty%
+        \widowpenalty4000%
+        \sfcode`\.\@m%
+        \sfcode `\=1000\relax}%
+  {%
+    \def\@noitemerr{\@latex@warning{Empty `thebibliography' environment}}%
+    \end{list}}
+
+
+%-------------------------------------------------------------------------------
+%                letter style definition
+%-------------------------------------------------------------------------------
+% commands
+\renewcommand*{\recomputeletterbodylengths}{%
+  \recomputecvlengths%
+  \setlength{\parskip}{6\p@}}
+
+\renewcommand*{\makeletterclosing}{%
+  \@closing\ifthenelse{\isundefined{\@signature}}{\\[3em]}{\\[1em]}% shrink space when signature is set
+  \ifthenelse{\isundefined{\@signature}}{}{{\@signature\\}}
+  {\bfseries\@firstname~\@lastname}%
+  \ifthenelse{\isundefined{\@enclosure}}{}{%
+    \\%
+    \vfil%
+    {\color{color2}\itshape\enclname: \@enclosure}}%
+    \vfil}
+
+
+\endinput
+
+
+%% end of file `moderncvbodyi.sty'.
diff --git a/moderncvbodyii.sty b/moderncvbodyii.sty
new file mode 100644 (file)
index 0000000..5099ad2
--- /dev/null
@@ -0,0 +1,179 @@
+%% start of file `moderncvbodyi.sty'.
+%% Copyright 2006-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv).
+%
+% 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{moderncvbodyi}[2022-02-21 v2.3.1 modern curriculum vitae and letter body variant: 1]
+
+
+%-------------------------------------------------------------------------------
+%                required packages
+%-------------------------------------------------------------------------------
+% provides the commands for the skillmatrix as well as the command
+% \recompute@cvskillmatrix@lengths
+\RequirePackage[moderncvbodyi]{moderncvskillmatrix}
+
+%-------------------------------------------------------------------------------
+%                overall body definition
+%-------------------------------------------------------------------------------
+% fonts
+\renewcommand*{\sectionfont}{\Large\mdseries\upshape}
+\renewcommand*{\subsectionfont}{\large\mdseries\upshape}
+\renewcommand*{\hintfont}{}
+
+% styles
+\renewcommand*{\sectionstyle}[1]{{\sectionfont\textcolor{color1}{#1}}}
+\renewcommand*{\subsectionstyle}[1]{{\subsectionfont\textcolor{color1}{#1}}}
+\renewcommand*{\hintstyle}[1]{{\hintfont\textcolor{color0}{#1}}}
+
+
+%-------------------------------------------------------------------------------
+%                resume body definition
+%-------------------------------------------------------------------------------
+% lengths
+%   used by \cvitem (and all children command)
+\@initializelength{\hintscolumnwidth}             \setlength{\hintscolumnwidth}{0.175\textwidth}
+\@initializelength{\separatorcolumnwidth}         \setlength{\separatorcolumnwidth}{0.025\textwidth}
+\@initializelength{\maincolumnwidth}
+%   used by \cvdoubleitem
+\@initializelength{\doubleitemcolumnwidth}
+%   used by \cvlistitem
+\@initializelength{\listitemsymbolwidth}          \settowidth{\listitemsymbolwidth}{\listitemsymbol}
+\@initializelength{\listitemcolumnwidth}
+%   used by \cvlistdoubleitem
+\@initializelength{\listdoubleitemcolumnwidth}
+%   default moderncv \photo (change the definition such that by default the photo and its box align with the section bars
+\RenewDocumentCommand{\photo}{O{\hintscolumnwidth-0.8pt-2\fboxsep}O{0.4pt}m}{\def\@photowidth{#1}\def\@photoframewidth{#2}\def\@photo{#3}}%
+
+% commands
+\renewcommand*{\recomputecvbodylengths}{%
+  % body lengths
+  \setlength{\maincolumnwidth}{\textwidth-\leftskip-\rightskip-\separatorcolumnwidth-\hintscolumnwidth}%
+  \setlength{\listitemcolumnwidth}{\maincolumnwidth-\listitemsymbolwidth}%
+  \setlength{\doubleitemcolumnwidth}{\maincolumnwidth-\hintscolumnwidth-\separatorcolumnwidth-\separatorcolumnwidth}%
+  \setlength{\doubleitemcolumnwidth}{0.5\doubleitemcolumnwidth}%
+  \setlength{\listdoubleitemcolumnwidth}{\maincolumnwidth-\listitemsymbolwidth-\separatorcolumnwidth-\listitemsymbolwidth}%
+  \setlength{\listdoubleitemcolumnwidth}{0.5\listdoubleitemcolumnwidth}%
+  \recompute@cvskillmatrix@lengths
+  % regular lengths
+  \setlength{\parskip}{0\p@}}
+
+
+\@initializelength{\baseletterheight}
+\settoheight{\baseletterheight}{\sectionstyle{o}}
+\setlength{\baseletterheight}{\baseletterheight-0.95ex}
+\RenewDocumentCommand{\section}{sm}{%
+  \par\addvspace{2.5ex}%
+  \phantomsection{}% reset the anchor for hyperrefs
+  \addcontentsline{toc}{section}{#2}%
+  \cvitem[0ex]{\strut\raggedleft\raisebox{\baseletterheight}{\color{color1}\rule{\hintscolumnwidth}{0.95ex}}}{\strut\sectionstyle{#2}}%
+  \par\nobreak\addvspace{1ex}\@afterheading}% to avoid a pagebreak after the heading
+
+\RenewDocumentCommand{\subsection}{sm}{%
+  \par\addvspace{1ex}%
+  \phantomsection{}% reset the anchor for hyperrefs
+  \addcontentsline{toc}{subsection}{#2}%
+  \cvitem[0ex]{}{\strut\subsectionstyle{#2}}%
+  \par\nobreak\addvspace{.5ex}\@afterheading}% to avoid a pagebreak after the heading
+
+\renewcommand*{\cvitem}[3][.25em]{%
+  \begin{tabular}{@{}p{\hintscolumnwidth}@{\hspace{\separatorcolumnwidth}}p{\maincolumnwidth}@{}}%
+    \raggedleft\hintstyle{#2} &{#3}%
+  \end{tabular}%
+  \par\addvspace{#1}}
+
+\renewcommand*{\cvdoubleitem}[5][.25em]{%
+  \cvitem[#1]{#2}{%
+    \begin{minipage}[t]{\doubleitemcolumnwidth}#3\end{minipage}%
+    \hfill% fill of \separatorcolumnwidth
+    \begin{minipage}[t]{\hintscolumnwidth}\raggedleft\hintstyle{#4}\end{minipage}%
+    \hspace*{\separatorcolumnwidth}%
+    \begin{minipage}[t]{\doubleitemcolumnwidth}#5\end{minipage}}}
+
+\renewcommand*{\cvlistitem}[2][.25em]{%
+  \cvitem[#1]{}{\listitemsymbol\begin{minipage}[t]{\listitemcolumnwidth}#2\end{minipage}}}
+
+\renewcommand*{\cvlistdoubleitem}[3][.25em]{%
+  \cvitem[#1]{}{\listitemsymbol\begin{minipage}[t]{\listdoubleitemcolumnwidth}#2\end{minipage}%
+  \hfill% fill of \separatorcolumnwidth
+  \ifthenelse{\equal{#3}{}}%
+    {}%
+    {\listitemsymbol\begin{minipage}[t]{\listdoubleitemcolumnwidth}#3\end{minipage}}}}
+
+\renewcommand*{\cventry}[7][.25em]{%
+  \cvitem[#1]{#2}{%
+    {\bfseries#3}%
+    \ifthenelse{\equal{#4}{}}{}{, {\slshape#4}}%
+    \ifthenelse{\equal{#5}{}}{}{, #5}%
+    \ifthenelse{\equal{#6}{}}{}{, #6}%
+    \strut%
+    \ifx&#7&%
+    \else{\newline{}\begin{minipage}[t]{\linewidth}\small#7\end{minipage}}\fi}}
+
+\@initializebox{\cvitemwithcommentbox}
+\@initializelength{\cvitemwithcommentskilllength}
+\@initializelength{\cvitemwithcommentcommentlength}
+\renewcommand*{\cvitemwithcomment}[4][.25em]{%
+  \savebox{\cvitemwithcommentbox}{{#3}}%
+  \setlength{\cvitemwithcommentskilllength}{\widthof{\usebox{\cvitemwithcommentbox}}}%
+  \setlength{\cvitemwithcommentcommentlength}{\maincolumnwidth-\separatorcolumnwidth-\cvitemwithcommentskilllength}%
+  \cvitem[#1]{#2}{%
+    \begin{minipage}[t]{\cvitemwithcommentskilllength}\usebox{\cvitemwithcommentbox}\end{minipage}%
+    \hfill% fill of \separatorcolumnwidth
+    \begin{minipage}[t]{\cvitemwithcommentcommentlength}\raggedleft\small\itshape#4\end{minipage}}}
+
+\renewenvironment{thebibliography}[1]%
+  {%
+    \bibliographyhead{\refname}%
+%    \small%
+    \begin{list}{\bibliographyitemlabel}%
+      {%
+        \setlength{\topsep}{0pt}%
+        \setlength{\labelwidth}{\hintscolumnwidth}%
+        \setlength{\labelsep}{\separatorcolumnwidth}%
+        \leftmargin\labelwidth%
+        \advance\leftmargin\labelsep%
+        \@openbib@code%
+        \usecounter{enumiv}%
+        \let\p@enumiv\@empty%
+        \renewcommand\theenumiv{\@arabic\c@enumiv}}%
+        \sloppy%
+        \clubpenalty4000%\@clubpenalty \clubpenalty%
+        \widowpenalty4000%
+        \sfcode`\.\@m%
+        \sfcode `\=1000\relax}%
+  {%
+    \def\@noitemerr{\@latex@warning{Empty `thebibliography' environment}}%
+    \end{list}}
+
+
+%-------------------------------------------------------------------------------
+%                letter style definition
+%-------------------------------------------------------------------------------
+% commands
+\renewcommand*{\recomputeletterbodylengths}{%
+  \recomputecvlengths%
+  \setlength{\parskip}{6\p@}}
+
+\renewcommand*{\makeletterclosing}{%
+  \@closing\ifthenelse{\isundefined{\@signature}}{\\[3em]}{\\[1em]}% shrink space when signature is set
+  \ifthenelse{\isundefined{\@signature}}{}{{\@signature\\}}
+  {\bfseries\@firstname~\@lastname}%
+  \ifthenelse{\isundefined{\@enclosure}}{}{%
+    \\%
+    \vfil%
+    {\color{color2}\itshape\enclname: \@enclosure}}%
+    \vfil}
+
+
+\endinput
+
+
+%% end of file `moderncvbodyi.sty'.
diff --git a/moderncvbodyiii.sty b/moderncvbodyiii.sty
new file mode 100644 (file)
index 0000000..638bfd4
--- /dev/null
@@ -0,0 +1,248 @@
+%% start of file `moderncvbodyiii.sty'.
+%% Copyright 2006-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv).
+%
+% 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{moderncvbodyiii}[2022-02-21 v2.3.1 modern curriculum vitae and letter body variant: 3]
+
+% rules type options: "fullrules", "shortrules", "mixedrules" (default) or "norules"
+\@initializeif{\if@fullrules}\@fullrulesfalse
+\DeclareOption{fullrules} {\@fullrulestrue\@shortrulesfalse\@mixedrulesfalse\@norulesfalse}
+\@initializeif{\if@shortrules}\@shortrulesfalse
+\DeclareOption{shortrules}{\@fullrulesfalse\@shortrulestrue\@mixedrulesfalse\@norulesfalse}
+\@initializeif{\if@mixedrules}\@mixedrulesfalse
+\DeclareOption{mixedrules}{\@fullrulesfalse\@shortrulesfalse\@mixedrulestrue\@norulesfalse}
+\@initializeif{\if@norules}\@norulesfalse
+\DeclareOption{norules}   {\@fullrulesfalse\@shortrulesfalse\@mixedrulesfalse\@norulestrue}
+
+% section alignment options: "left" (default), "center" or "right"
+\@initializeif{\if@left}\@leftfalse
+\DeclareOption{left}      {\@lefttrue\@centerfalse\@rightfalse}
+\@initializeif{\if@center}\@centerfalse
+\DeclareOption{center}    {\@leftfalse\@centertrue\@rightfalse}
+\@initializeif{\if@right}\@rightfalse
+\DeclareOption{right}     {\@leftfalse\@centerfalse\@righttrue}
+
+\DeclareOption*{}% avoid choking on unknown options
+\ExecuteOptions{mixedrules,left}
+\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
+%-------------------------------------------------------------------------------
+% provides the commands for the skillmatrix as well as the command
+% \recompute@cvskillmatrix@lengths
+\RequirePackage[moderncvbodyiii]{moderncvskillmatrix}
+
+%-------------------------------------------------------------------------------
+%                overall body definition
+%-------------------------------------------------------------------------------
+% fonts
+\renewcommand*{\sectionfont}{%
+  \if@norules%
+    \Large\bfseries\scshape%
+  \else%
+    \Large\bfseries\upshape\fi}
+\renewcommand*{\subsectionfont}{%
+  \if@norules%
+    \large\mdseries\itshape%
+  \else%
+    \large\upshape\fontseries{sb}\selectfont\fi}
+\renewcommand*{\hintfont}{\bfseries}
+
+% styles
+\renewcommand*{\sectionstyle}[1]{{%
+  \if@center\centering\else%
+  \if@right\raggedleft\fi\fi%
+  \sectionfont\textcolor{color1}{#1}%
+  \if@shortrules\else%
+    \par\fi}}
+\renewcommand*{\subsectionstyle}[1]{{%
+  \if@center\centering\else%
+  \if@right\raggedleft\fi\fi%
+  \subsectionfont\textcolor{color1}{#1}%
+  \if@shortrules\else\if@mixedrules\else%
+    \par\fi\fi}}
+\renewcommand*{\hintstyle}[1]{{\hintfont\textcolor{color0}{#1}}}
+
+
+%-------------------------------------------------------------------------------
+%                resume body definition
+%-------------------------------------------------------------------------------
+% lengths
+%   used by \cvitem (and all children command)
+\@initializelength{\hintscolumnwidth}             \setlength{\hintscolumnwidth}{0.3\textwidth}
+\@initializelength{\separatorcolumnwidth}         \setlength{\separatorcolumnwidth}{0.025\textwidth}
+\@initializelength{\maincolumnwidth}
+%   used by \cvdoubleitem
+\@initializelength{\doubleitemcolumnwidth}
+%   used by \cvlistitem
+\@initializelength{\listitemsymbolwidth}          \settowidth{\listitemsymbolwidth}{\listitemsymbol}
+\@initializelength{\listitemcolumnwidth}
+%   used by \cvlistdoubleitem
+\@initializelength{\listdoubleitemcolumnwidth}
+
+% commands
+\renewcommand*{\recomputecvbodylengths}{%
+  % body lengths
+  \setlength{\maincolumnwidth}{\textwidth-\leftskip-\rightskip}%
+  \setlength{\listitemcolumnwidth}{\maincolumnwidth-\listitemsymbolwidth}%
+  \setlength{\doubleitemcolumnwidth}{\maincolumnwidth-\separatorcolumnwidth}%
+  \setlength{\doubleitemcolumnwidth}{0.5\doubleitemcolumnwidth}%
+  \setlength{\listdoubleitemcolumnwidth}{\maincolumnwidth-\listitemsymbolwidth-\separatorcolumnwidth-\listitemsymbolwidth}%
+  \setlength{\listdoubleitemcolumnwidth}{0.5\listdoubleitemcolumnwidth}%
+  \recompute@cvskillmatrix@lengths
+  % regular lengths
+  \setlength{\parskip}{0\p@}}
+
+\RenewDocumentCommand{\section}{sm}{%
+  \par\addvspace{2.5ex}%
+  \phantomsection{}% reset the anchor for hyperrefs
+  \addcontentsline{toc}{section}{#2}%
+  \if@left\else\if@fullrules\else\if@mixedrules\else%
+    \sectionrule\fi\fi\fi%
+  \strut\sectionstyle{#2}%
+  \if@fullrules%
+    \sectionrule%
+  \else\if@mixedrules%
+    \sectionrule%
+  \else\if@right\else%
+    \sectionrule\fi\fi\fi%
+  \par\nobreak\addvspace{1ex}\@afterheading}
+
+\RenewDocumentCommand{\subsection}{sm}{%
+  \par\addvspace{1ex}%
+  \phantomsection{}%
+  \addcontentsline{toc}{subsection}{#2}%
+  \if@left\else\if@fullrules\else%
+    \subsectionrule\fi\fi%
+  \strut\subsectionstyle{#2}%
+  \if@fullrules%
+    \subsectionrule%
+  \else\if@right\else%
+    \subsectionrule\fi\fi%
+  \par\nobreak\addvspace{0.5ex}\@afterheading}
+
+\newcommand*{\sectionrule}{}
+\newcommand*{\subsectionrule}{}
+\if@fullrules%
+  \renewcommand*{\sectionrule}{\par\nobreak\vspace*{-.7\baselineskip}\leavevmode{\color{color1}\leaders\hbox{\rule{1pt}{0.4pt}}\hfill\kern0pt}}
+  \renewcommand*{\subsectionrule}{\par\nobreak\vspace*{-.7\baselineskip}\leavevmode{\color{color1}\xleaders\hbox to 0.35em{\scriptsize.}\hfill}}\fi% different subsectionrules will not be perfectly aligned, but remaining space at the end of the fill will be distributed evenly between leaders, so it will be barely visible}
+\if@shortrules%
+  \renewcommand*{\sectionrule}{\leavevmode{\color{color1}\leaders\hbox{\rule{1pt}{0.4pt}}\hfill\kern0pt}}
+  \renewcommand*{\subsectionrule}{\leavevmode{\color{color1}\xleaders\hbox to 0.35em{\scriptsize.}\hfill}}\fi% different subsectionrules will not be perfectly aligned, but remaining space at the end of the fill will be distributed evenly between leaders, so it will be barely visible}}
+\if@mixedrules%
+  \renewcommand*{\sectionrule}{\par\nobreak\vspace*{-.7\baselineskip}\leavevmode{\color{color1}\leaders\hbox{\rule{1pt}{0.4pt}}\hfill\kern0pt}}
+  \renewcommand*{\subsectionrule}{\leavevmode{\color{color1}\xleaders\hbox to 0.35em{\scriptsize.}\hfill}}\fi% different subsectionrules will not be perfectly aligned, but remaining space at the end of the fill will be distributed evenly between leaders, so it will be barely visible}}
+\if@norules%
+  \renewcommand*{\sectionrule}{}
+  \renewcommand*{\subsectionrule}{}\fi
+
+\renewcommand*{\cvitem}[3][.25em]{%
+  \ifstrempty{#2}{}{\hintstyle{#2}: }{#3}%
+  \par\addvspace{#1}}
+
+\renewcommand*{\cvdoubleitem}[5][.25em]{%
+  \begin{minipage}[t]{\doubleitemcolumnwidth}\hintstyle{#2}: #3\end{minipage}%
+  \hfill% fill of \separatorcolumnwidth
+  \begin{minipage}[t]{\doubleitemcolumnwidth}\ifstrempty{#4}{}{\hintstyle{#4}: }#5\end{minipage}%
+  \par\addvspace{#1}}
+
+\renewcommand*{\cvlistitem}[2][.25em]{%
+  \listitemsymbol\begin{minipage}[t]{\listitemcolumnwidth}#2\end{minipage}%
+  \par\addvspace{#1}}
+
+\renewcommand*{\cvlistdoubleitem}[3][.25em]{%
+  \cvitem[#1]{}{\listitemsymbol\begin{minipage}[t]{\listdoubleitemcolumnwidth}#2\end{minipage}%
+  \hfill% fill of \separatorcolumnwidth
+  \ifstrempty{#3}%
+    {}%
+    {\listitemsymbol\begin{minipage}[t]{\listdoubleitemcolumnwidth}#3\end{minipage}}}}
+
+\renewcommand*{\cventry}[7][.25em]{
+  \begin{tabular*}{\maincolumnwidth}{l@{\extracolsep{\fill}}r}%
+    % skip the company name and location line if both are empty, allowing one to show multiple roles within the same company without repeating it
+    \ifboolexpr{%
+      test {\ifstrempty{#4}}
+      and
+      test {\ifstrempty{#5}}}%
+      {}%
+      {{\bfseries #4} & {\bfseries #5}\\}%
+    {\itshape #3\ifstrempty{#6}{}{, #6}} & {\itshape #2}\\%
+  \end{tabular*}%
+  \ifx&#7&%
+  \else{\\%
+    \begin{minipage}{\maincolumnwidth}%
+      \small#7%
+    \end{minipage}}\fi%
+  \par\addvspace{#1}}
+
+\@initializebox{\cvitemwithcommentmainbox}
+\@initializelength{\cvitemwithcommentmainlength}
+\@initializelength{\cvitemwithcommentcommentlength}
+\renewcommand*{\cvitemwithcomment}[4][.25em]{%
+  \savebox{\cvitemwithcommentmainbox}{\ifstrempty{#2}{}{\hintstyle{#2}: }#3}%
+  \setlength{\cvitemwithcommentmainlength}{\widthof{\usebox{\cvitemwithcommentmainbox}}}%
+  \setlength{\cvitemwithcommentcommentlength}{\maincolumnwidth-\separatorcolumnwidth-\cvitemwithcommentmainlength}%
+  \begin{minipage}[t]{\cvitemwithcommentmainlength}\usebox{\cvitemwithcommentmainbox}\end{minipage}%
+  \hfill% fill of \separatorcolumnwidth
+  \begin{minipage}[t]{\cvitemwithcommentcommentlength}\raggedleft\small\itshape#4\end{minipage}%
+  \par\addvspace{#1}}
+
+\renewenvironment{thebibliography}[1]%
+  {%
+    \bibliographyhead{\refname}%
+%    \small%
+    \begin{list}{\bibliographyitemlabel}%
+      {%
+        \setlength{\topsep}{0pt}%
+        \setlength{\labelwidth}{0pt}%
+        \ifthenelse{\equal{\bibliographyitemlabel}{}}%
+          {\setlength{\labelsep}{0pt}}%
+          {\setlength{\labelsep}{\separatorcolumnwidth}}%
+        \leftmargin\labelwidth%
+        \advance\leftmargin\labelsep%
+        \@openbib@code%
+        \usecounter{enumiv}%
+        \let\p@enumiv\@empty%
+        \renewcommand\theenumiv{\@arabic\c@enumiv}}%
+        \sloppy%
+        \clubpenalty4000%\@clubpenalty \clubpenalty%
+        \widowpenalty4000%
+        \sfcode`\.\@m%
+        \sfcode `\=1000\relax}%
+  {%
+    \def\@noitemerr{\@latex@warning{Empty `thebibliography' environment}}%
+    \end{list}}
+
+
+%-------------------------------------------------------------------------------
+%                letter style definition
+%-------------------------------------------------------------------------------
+% commands
+\renewcommand*{\recomputeletterbodylengths}{%
+  \recomputecvbodylengths%
+  \setlength{\parskip}{6\p@}}
+
+\renewcommand*{\makeletterclosing}{%
+  \@closing\ifthenelse{\isundefined{\@signature}}{\\[3em]}{\\[1em]}% shrink space when signature is set
+  \ifthenelse{\isundefined{\@signature}}{}{{\@signature\\}}
+  {\bfseries\@firstname~\@lastname}%
+  \ifthenelse{\isundefined{\@enclosure}}{}{%
+    \\%
+    \vfil%
+    {\color{color2}\itshape\enclname: \@enclosure}}%
+    \vfil}
+
+
+\endinput
+
+
+%% end of file `moderncvbodyiii.sty'.
diff --git a/moderncvbodyiv.sty b/moderncvbodyiv.sty
new file mode 100644 (file)
index 0000000..22d9ac7
--- /dev/null
@@ -0,0 +1,187 @@
+%% start of file `moderncvbodyiv.sty'.
+%% Copyright 2006-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv).
+%
+% 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{moderncvbodyiv}[2022-02-21 v2.3.1 modern curriculum vitae and letter body variant: 4]
+
+
+%-------------------------------------------------------------------------------
+%                required packages
+%-------------------------------------------------------------------------------
+% provides the commands for the skillmatrix as well as the command
+% \recompute@cvskillmatrix@lengths
+\RequirePackage[moderncvbodyiv]{moderncvskillmatrix}
+
+%-------------------------------------------------------------------------------
+%                overall body definition
+%-------------------------------------------------------------------------------
+% fonts
+\renewcommand*{\sectionfont}{\Large\bfseries\upshape}
+\renewcommand*{\subsectionfont}{\large\bfseries\itshape}
+\renewcommand*{\hintfont}{\bfseries}
+
+% styles
+\renewcommand*{\sectionstyle}[1]{{\sectionfont\textcolor{color1}{#1}}}
+\renewcommand*{\subsectionstyle}[1]{{\subsectionfont\textcolor{color1}{#1}}}
+\renewcommand*{\hintstyle}[1]{{\hintfont\textcolor{color0}{#1}}}
+
+
+%-------------------------------------------------------------------------------
+%                resume body definition
+%-------------------------------------------------------------------------------
+% lengths
+%   used by \cvitem (and all children command)
+\@initializelength{\hintscolumnwidth}             \setlength{\hintscolumnwidth}{0.3\textwidth}
+\@initializelength{\separatorcolumnwidth}         \setlength{\separatorcolumnwidth}{0.025\textwidth}
+\@initializelength{\maincolumnwidth}
+%   used by \cvdoubleitem
+\@initializelength{\doubleitemcolumnwidth}
+%   used by \cvlistitem
+\@initializelength{\listitemsymbolwidth}          \settowidth{\listitemsymbolwidth}{\listitemsymbol}
+\@initializelength{\listitemcolumnwidth}
+%   used by \cvlistdoubleitem
+\@initializelength{\listdoubleitemcolumnwidth}
+
+% commands
+\renewcommand*{\recomputecvbodylengths}{%
+  % body lengths
+  \setlength{\maincolumnwidth}{\textwidth-\leftskip-\rightskip}%
+  \setlength{\listitemcolumnwidth}{\maincolumnwidth-\listitemsymbolwidth}%
+  \setlength{\doubleitemcolumnwidth}{\maincolumnwidth-\separatorcolumnwidth}%
+  \setlength{\doubleitemcolumnwidth}{0.5\doubleitemcolumnwidth}%
+  \setlength{\listdoubleitemcolumnwidth}{\maincolumnwidth-\listitemsymbolwidth-\separatorcolumnwidth-\listitemsymbolwidth}%
+  \setlength{\listdoubleitemcolumnwidth}{0.5\listdoubleitemcolumnwidth}%
+  \recompute@cvskillmatrix@lengths
+  % regular lengths
+  \setlength{\parskip}{0\p@}}
+
+\RenewDocumentCommand{\section}{sm}{%
+  \par\addvspace{2.5ex}%
+  \phantomsection{}% reset the anchor for hyperrefs
+  \addcontentsline{toc}{section}{#2}%
+  \strut\sectionstyle{#2}%
+  \par\nobreak\addvspace{1ex}\@afterheading}
+
+\RenewDocumentCommand{\subsection}{sm}{%
+  \par\addvspace{1ex}%
+  \phantomsection{}%
+  \addcontentsline{toc}{subsection}{#2}%
+  \strut\subsectionstyle{#2}%
+  \par\nobreak\addvspace{0.5ex}\@afterheading}
+
+\renewcommand*{\cvitem}[3][.25em]{%
+  \ifthenelse{\equal{#2}{}}{}{\hintstyle{#2}: }{#3}%
+  \par\addvspace{#1}}
+
+\renewcommand*{\cvdoubleitem}[5][.25em]{%
+  \begin{minipage}[t]{\doubleitemcolumnwidth}\hintstyle{#2}: #3\end{minipage}%
+  \hfill% fill of \separatorcolumnwidth
+  \begin{minipage}[t]{\doubleitemcolumnwidth}\ifthenelse{\equal{#4}{}}{}{\hintstyle{#4}: }#5\end{minipage}%
+  \par\addvspace{#1}}
+
+\renewcommand*{\cvlistitem}[2][.25em]{%
+  \cvitem[#1]{}{\listitemsymbol\begin{minipage}[t]{\listitemcolumnwidth}#2\end{minipage}}}
+
+\renewcommand*{\cvlistdoubleitem}[3][.25em]{%
+  \cvitem[#1]{}{\listitemsymbol\begin{minipage}[t]{\listdoubleitemcolumnwidth}#2\end{minipage}%
+  \hfill% fill of \separatorcolumnwidth
+  \ifthenelse{\equal{#3}{}}%
+    {}%
+    {\listitemsymbol\begin{minipage}[t]{\listdoubleitemcolumnwidth}#3\end{minipage}}}}
+
+\@initializebox{\cventryyearbox}
+\@initializelength{\cventrytitleboxwidth}
+\renewcommand*{\cventry}[7][.25em]{%
+  \savebox{\cventryyearbox}{%
+    \hspace*{2\separatorcolumnwidth}%
+    \hintstyle{#2}}%
+  \setlength{\cventrytitleboxwidth}{\widthof{\usebox{\cventryyearbox}}}%
+  \setlength{\cventrytitleboxwidth}{\maincolumnwidth-\cventrytitleboxwidth}%
+  \begin{minipage}{\maincolumnwidth}%
+    \parbox[t]{\cventrytitleboxwidth}{%
+      \strut%
+      {\bfseries#3}%
+      \ifthenelse{\equal{#4}{}}{}{, {\slshape#4}}%
+      \ifthenelse{\equal{#5}{}}{}{, #5}%
+      \ifthenelse{\equal{#6}{}}{}{, #6}%
+      .\strut}%
+    \usebox{\cventryyearbox}%
+  \end{minipage}\strut%
+  \ifx&#7&%
+    \else{%
+      \newline{}%
+      \strut%
+      \begin{minipage}[t]{\maincolumnwidth}%
+        \small%
+        #7%
+      \end{minipage}}\fi%
+  \par\addvspace{#1}}
+
+\@initializebox{\cvitemwithcommentmainbox}
+\@initializelength{\cvitemwithcommentmainlength}
+\@initializelength{\cvitemwithcommentcommentlength}
+\renewcommand*{\cvitemwithcomment}[4][.25em]{%
+  \savebox{\cvitemwithcommentmainbox}{\ifthenelse{\equal{#2}{}}{}{\hintstyle{#2}: }#3}%
+  \setlength{\cvitemwithcommentmainlength}{\widthof{\usebox{\cvitemwithcommentmainbox}}}%
+  \setlength{\cvitemwithcommentcommentlength}{\maincolumnwidth-\separatorcolumnwidth-\cvitemwithcommentmainlength}%
+  \begin{minipage}[t]{\cvitemwithcommentmainlength}\usebox{\cvitemwithcommentmainbox}\end{minipage}%
+  \hfill% fill of \separatorcolumnwidth
+  \begin{minipage}[t]{\cvitemwithcommentcommentlength}\raggedleft\small\itshape#4\end{minipage}%
+  \par\addvspace{#1}}
+
+\renewenvironment{thebibliography}[1]%
+  {%
+    \bibliographyhead{\refname}%
+%    \small%
+    \begin{list}{\bibliographyitemlabel}%
+      {%
+        \setlength{\topsep}{0pt}%
+        \setlength{\labelwidth}{\hintscolumnwidth}%
+        \setlength{\labelsep}{\separatorcolumnwidth}%
+        \leftmargin\labelwidth%
+        \advance\leftmargin\labelsep%
+        \@openbib@code%
+        \usecounter{enumiv}%
+        \let\p@enumiv\@empty%
+        \renewcommand\theenumiv{\@arabic\c@enumiv}}%
+        \sloppy%
+        \clubpenalty4000%\@clubpenalty \clubpenalty%
+        \widowpenalty4000%
+        \sfcode`\.\@m%
+        \sfcode `\=1000\relax}%
+  {%
+    \def\@noitemerr{\@latex@warning{Empty `thebibliography' environment}}%
+    \end{list}}
+
+
+%-------------------------------------------------------------------------------
+%                letter style definition
+%-------------------------------------------------------------------------------
+% commands
+\renewcommand*{\recomputeletterbodylengths}{%
+  \recomputecvbodylengths%
+  \setlength{\parskip}{6\p@}}
+
+\renewcommand*{\makeletterclosing}{%
+  \@closing\ifthenelse{\isundefined{\@signature}}{\\[3em]}{\\[1em]}% shrink space when signature is set
+  \ifthenelse{\isundefined{\@signature}}{}{{\@signature\\}}
+  {\bfseries\@firstname~\@lastname}%
+  \ifthenelse{\isundefined{\@enclosure}}{}{%
+    \\%
+    \vfil%
+    {\color{color2}\itshape\enclname: \@enclosure}}%
+    \vfil}
+
+
+\endinput
+
+
+%% end of file `moderncvbodyiv.sty'.
diff --git a/moderncvbodyv.sty b/moderncvbodyv.sty
new file mode 100644 (file)
index 0000000..96be31e
--- /dev/null
@@ -0,0 +1,222 @@
+%% start of file `moderncvbodyv.sty'.
+%% Copyright 2015-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv).
+%
+% 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{moderncvbodyv}[2022-02-21 v2.3.1 modern curriculum vitae and letter body variant: 5]
+
+
+%-------------------------------------------------------------------------------
+%                required packages
+%-------------------------------------------------------------------------------
+% provides the commands for the skillmatrix as well as the command
+% \recompute@cvskillmatrix@lengths
+\RequirePackage[moderncvbodyv]{moderncvskillmatrix}
+
+%-------------------------------------------------------------------------------
+%                overall style definition
+%-------------------------------------------------------------------------------
+
+
+%-------------------------------------------------------------------------------
+%                resume style definition
+%-------------------------------------------------------------------------------
+% fonts
+\renewcommand*{\sectionfont}{\Large\mdseries\upshape}
+\renewcommand*{\subsectionfont}{\large\mdseries\slshape}
+\renewcommand*{\hintfont}{\bfseries}
+
+% styles
+\renewcommand*{\sectionstyle}[1]{{\sectionfont\textcolor{color1}{#1}}}
+\renewcommand*{\subsectionstyle}[1]{{\subsectionfont\textcolor{color1}{#1}}}
+\renewcommand*{\hintstyle}[1]{{\hintfont\textcolor{color0}{#1}}}
+
+% lengths
+%   used by \cvitem (and all children command)
+\@initializelength{\hintscolumnwidth}             \setlength{\hintscolumnwidth}{0.25\textwidth}
+\@initializelength{\separatorcolumnwidth}         \setlength{\separatorcolumnwidth}{0.025\textwidth}
+\@initializelength{\separatorrulewidth}           \setlength{\separatorrulewidth}{1.2\p@}%
+\@initializelength{\maincolumnwidth}
+%   used by \cvdoubleitem
+\@initializelength{\doubleitemcolumnwidth}
+%   used by \cvlistitem
+\@initializelength{\listitemsymbolwidth}           \settowidth{\listitemsymbolwidth}{\listitemsymbol}
+\@initializelength{\listitemcolumnwidth}
+%\@initializelength{\listitemmaincolumnwidth}
+%   used by \cvlistdoubleitem
+\@initializelength{\listdoubleitemcolumnwidth}
+%\@initializelength{\listdoubleitemmaincolumnwidth}
+
+% commands
+\@initializecommand{\recomputecvbodylengths}{%
+  % body lengths
+  \setlength{\maincolumnwidth}{\textwidth-\leftskip-\rightskip-\separatorcolumnwidth-\separatorcolumnwidth-\hintscolumnwidth-\separatorrulewidth}%
+  \setlength{\listitemcolumnwidth}{\maincolumnwidth-\listitemsymbolwidth}%
+  \setlength{\doubleitemcolumnwidth}{\maincolumnwidth-\separatorcolumnwidth}%
+  \setlength{\doubleitemcolumnwidth}{0.5\doubleitemcolumnwidth}%
+  \setlength{\listdoubleitemcolumnwidth}{\maincolumnwidth-\listitemsymbolwidth-\separatorcolumnwidth-\listitemsymbolwidth}%
+  \setlength{\listdoubleitemcolumnwidth}{0.5\listdoubleitemcolumnwidth}%
+  \recompute@cvskillmatrix@lengths
+  % regular lengths
+  \setlength{\parskip}{0\p@}}
+
+\@initializeif{\if@aftersection}\@aftersectionfalse%
+\RenewDocumentCommand{\section}{sm}{%
+  \addvspace{2.5ex}%
+  \phantomsection{}% reset the anchor for hyperrefs
+  \addcontentsline{toc}{section}{#2}%
+  \noindent\rlap{\@cvitem{\raggedleft\sectionstyle{#2}}{}}%
+  \nobreak\@afterheading\@aftersectiontrue\ignorespaces}
+
+%\@initializeif{\if@aftersubsection}\@aftersubsectionfalse%
+\RenewDocumentCommand{\subsection}{sm}{%
+  %\addvspace{1ex}%
+  \vspace*{-\arrayrulewidth}% HACK; I don't understand where the space is coming from, nor what it's exact value is :(
+  \if@aftersection%
+    \par\ignorespaces\fi%
+  \phantomsection{}% reset the anchor for hyperrefs
+  \addcontentsline{toc}{subsection}{#2}%
+  \noindent\rlap{\@cvitem{\if@aftersection\else\@moderncvstrut{4pt}{24pt}\fi\raggedleft\subsectionstyle{#2}}{}}%
+  \nobreak\@afterheading\@aftersectiontrue\ignorespaces}
+
+\renewcommand*{\cvitem}[3][.5ex]{%
+  \@cvitem[#1]{}{\ifthenelse{\equal{#2}{}}{}{\hintstyle{#2}: }{#3}}%
+  }
+% \RenewDocumentCommand{\cvitem}{+O{.5ex} +m +m}{%
+%     \IfNoValueTF{#2}{%
+%         \@cvitem[#1]{}{#3}%
+%     }{%
+%         \@cvitem[#1]{}{\hintstyle{#2}: {#3}}%
+%     }%
+% }
+
+% underlying command to implement \cvitem, \subsection and \section
+\newcommand*{\@cvitem}[3][.5ex]{%
+  \arrayrulecolor{color1}%
+  \setlength\arrayrulewidth{\separatorrulewidth}%
+  \if@aftersection\else%
+    \vspace*{-\separatorrulewidth}\fi% HACK; I don't understand where the space is coming from, nor what it's exact value is :(
+  \noindent%
+%  \setlength{\fboxsep}{0pt}\framebox{% start of debuging
+  \begin{tabular}[t]{@{}p{\hintscolumnwidth}@{\hspace{\separatorcolumnwidth}}|@{\hspace{\separatorcolumnwidth}}p{\maincolumnwidth}@{}}%
+    \@moderncvstrut{4pt}{16pt}#2 &#3\\[#1]% the spacing needs to be inside the cell for the vertical rule to extend correctly
+  \end{tabular}%
+%  }% end of debuging
+  \par\@aftersectionfalse\ignorespaces}
+
+\renewcommand*{\cvdoubleitem}[5][.5ex]{%
+  \@cvitem[#1]{}{%
+    \begin{minipage}[t]{\doubleitemcolumnwidth}\hintstyle{#2}: #3\end{minipage}%
+    \hfill% fill of \separatorcolumnwidth
+    \begin{minipage}[t]{\doubleitemcolumnwidth}\ifthenelse{\equal{#4}{}}{}{\hintstyle{#4}: }#5\end{minipage}}}
+
+\renewcommand*{\cvlistitem}[2][.5ex]{%
+  \@cvitem[#1]{}{\listitemsymbol\begin{minipage}[t]{\listitemcolumnwidth}#2\end{minipage}}}
+
+\renewcommand*{\cvlistdoubleitem}[3][.5ex]{%
+  \@cvitem[#1]{}{\listitemsymbol\begin{minipage}[t]{\listdoubleitemcolumnwidth}#2\end{minipage}%
+  \hfill% fill of \separatorcolumnwidth
+  \ifthenelse{\equal{#3}{}}%
+    {}%
+    {\listitemsymbol\begin{minipage}[t]{\listdoubleitemcolumnwidth}#3\end{minipage}}}}
+
+\@initializebox{\cventryyearbox}
+\@initializelength{\cventrytitleboxwidth}
+\renewcommand*{\cventry}[7][.5ex]{%
+  \savebox{\cventryyearbox}{%
+    \hspace*{2\separatorcolumnwidth}%
+    \hintstyle{#2}}%
+  \setlength{\cventrytitleboxwidth}{\widthof{\usebox{\cventryyearbox}}}%
+  \setlength{\cventrytitleboxwidth}{\maincolumnwidth-\cventrytitleboxwidth}%
+  \cvitem[#1]{}{%
+    \parbox[t]{\cventrytitleboxwidth}{%
+      \strut%
+      {\bfseries#3}%
+      \ifthenelse{\equal{#4}{}}{}{, {\slshape#4}}%
+      \ifthenelse{\equal{#5}{}}{}{, #5}%
+      \ifthenelse{\equal{#6}{}}{}{, #6}%
+      .\strut}%
+    \usebox{\cventryyearbox}}%
+  \ifx&#7&%
+  \else%
+    \vspace*{-4pt}%
+    \cvitem[#1]{}{\small#7}\fi}
+
+\@initializebox{\cvitemwithcommentmainbox}
+\@initializelength{\cvitemwithcommentmainlength}
+\@initializelength{\cvitemwithcommentcommentlength}
+\renewcommand*{\cvitemwithcomment}[4][.5ex]{%
+  \savebox{\cvitemwithcommentmainbox}{\ifthenelse{\equal{#2}{}}{}{\hintstyle{#2}: }#3}%
+  \setlength{\cvitemwithcommentmainlength}{\widthof{\usebox{\cvitemwithcommentmainbox}}}%
+  \setlength{\cvitemwithcommentcommentlength}{\maincolumnwidth-\separatorcolumnwidth-\cvitemwithcommentmainlength}%
+  \@cvitem[#1]{}{%
+    \begin{minipage}[t]{\cvitemwithcommentmainlength}\usebox{\cvitemwithcommentmainbox}\end{minipage}%
+    \hfill% fill of \separatorcolumnwidth
+    \begin{minipage}[t]{\cvitemwithcommentcommentlength}\raggedleft\small\itshape#4\end{minipage}}}
+
+\renewenvironment{thebibliography}[1]% BUG/TODO: remove extra space between heading and first bibliography entry, as well as after last one
+  {%
+    \bibliographyhead{\refname}%
+%    \small%
+    \arrayrulecolor{color1}%
+    \setlength\arrayrulewidth{\separatorrulewidth}%
+    \noindent%
+    \begin{tabular}[t]{@{}p{\hintscolumnwidth}@{\hspace{\separatorcolumnwidth}}|@{\hspace{\separatorcolumnwidth}}p{\maincolumnwidth}@{}}%
+      \@moderncvstrut{4pt}{16pt} &%
+        \begin{list}{\bibliographyitemlabel}{%
+          \setlength{\topsep}{0pt}%
+          \setlength{\partopsep}{0pt}%
+          \setlength{\labelwidth}{0pt}%
+          \setlength{\itemsep}{0pt}%
+          \setlength{\parskip}{0pt}%
+          \ifthenelse{\equal{\bibliographyitemlabel}{}}%
+            {\setlength{\labelsep}{0pt}}%
+            {\setlength{\labelsep}{\separatorcolumnwidth}}%
+          \leftmargin\labelwidth%
+          \advance\leftmargin\labelsep%
+          \@openbib@code%
+          \usecounter{enumiv}%
+          \let\p@enumiv\@empty%
+          \renewcommand\theenumiv{\@arabic\c@enumiv}}%
+        \sloppy%
+        \clubpenalty4000%\@clubpenalty \clubpenalty%
+        \widowpenalty4000%
+        \sfcode`\.\@m%
+        \sfcode `\=1000\relax}%
+  {%
+        \def\@noitemerr{\@latex@warning{Empty `thebibliography' environment}}%
+        \end{list}%
+        \\[.5ex]%
+    \end{tabular}%
+    \par\@aftersectionfalse\ignorespaces}
+
+
+%-------------------------------------------------------------------------------
+%                letter style definition
+%-------------------------------------------------------------------------------
+% commands
+\renewcommand*{\recomputeletterbodylengths}{%
+  \recomputecvbodylengths%
+  \setlength{\parskip}{6\p@}}
+
+\renewcommand*{\makeletterclosing}{%
+  \@closing\ifthenelse{\isundefined{\@signature}}{\\[3em]}{\\[1em]}% shrink space when signature is set
+  \ifthenelse{\isundefined{\@signature}}{}{{\@signature\\}}
+  {\bfseries \@firstname~\@lastname}%
+  \ifthenelse{\isundefined{\@enclosure}}{}{%
+    \\%
+    \vfill%
+    {\color{color2}\itshape\enclname: \@enclosure}}}
+
+
+\endinput
+
+
+%% end of file `moderncvbodyv.sty'.
diff --git a/moderncvcolorblack.sty b/moderncvcolorblack.sty
new file mode 100644 (file)
index 0000000..49d0102
--- /dev/null
@@ -0,0 +1,29 @@
+%% start of file `moderncvcolorblack.sty'.
+%% Copyright 2006-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv).
+%
+% 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{moderncvcolorblack}[2022-02-21 v2.3.1 modern curriculum vitae and letter color scheme: black]
+
+
+%-------------------------------------------------------------------------------
+%                color scheme definition
+%-------------------------------------------------------------------------------
+\input{commons/colors}
+
+\colorlet{color0}{black}% black
+\colorlet{color1}{black}% black
+\colorlet{color2}{black}% black
+
+
+\endinput
+
+
+%% end of file `moderncvcolorblack.sty'.
diff --git a/moderncvcolorblue.sty b/moderncvcolorblue.sty
new file mode 100644 (file)
index 0000000..af633ab
--- /dev/null
@@ -0,0 +1,29 @@
+%% start of file `moderncvcolorblue.sty'.
+%% Copyright 2006-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv).
+%
+% 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{moderncvcolorblue}[2022-02-21 v2.3.1 modern curriculum vitae and letter color scheme: blue]
+
+
+%-------------------------------------------------------------------------------
+%                color scheme definition
+%-------------------------------------------------------------------------------
+\input{commons/colors}
+
+\colorlet{color0}{black}% black
+\colorlet{color1}{lightblue}% light blue
+\colorlet{color2}{darkgrey}% dark grey
+
+
+\endinput
+
+
+%% end of file `moderncvcolorblue.sty'.
diff --git a/moderncvcolorburgundy.sty b/moderncvcolorburgundy.sty
new file mode 100644 (file)
index 0000000..fc763f3
--- /dev/null
@@ -0,0 +1,29 @@
+%% start of file `moderncvcolorburgundy.sty'.
+%% Copyright 2006-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv).
+%
+% 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{moderncvcolorburgundy}[2022-02-21 v2.3.1 modern curriculum vitae and letter color scheme: burgundy]
+
+
+%-------------------------------------------------------------------------------
+%                color scheme definition
+%-------------------------------------------------------------------------------
+\input{commons/colors}
+
+\colorlet{color0}{black}% black
+\colorlet{color1}{burgundy}% burgundy
+\colorlet{color2}{darkgrey}% dark grey
+
+
+\endinput
+
+
+%% end of file `moderncvcolorburgundy.sty'.
diff --git a/moderncvcolorgreen.sty b/moderncvcolorgreen.sty
new file mode 100644 (file)
index 0000000..c2caeb4
--- /dev/null
@@ -0,0 +1,29 @@
+%% start of file `moderncvcolorgreen.sty'.
+%% Copyright 2006-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv).
+%
+% 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{moderncvcolorgreen}[2022-02-21 v2.3.1 modern curriculum vitae and letter color scheme: green]
+
+
+%-------------------------------------------------------------------------------
+%                color scheme definition
+%-------------------------------------------------------------------------------
+\input{commons/colors}
+
+\colorlet{color0}{black}% black
+\colorlet{color1}{green}% green
+\colorlet{color2}{darkgrey}% dark grey
+
+
+\endinput
+
+
+%% end of file `moderncvcolorgreen.sty'.
diff --git a/moderncvcolorgrey.sty b/moderncvcolorgrey.sty
new file mode 100644 (file)
index 0000000..ab0a1c9
--- /dev/null
@@ -0,0 +1,29 @@
+%% start of file `moderncvcolorgrey.sty'.
+%% Copyright 2006-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv).
+%
+% 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{moderncvcolorgrey}[2022-02-21 v2.3.1 modern curriculum vitae and letter color scheme: grey]
+
+
+%-------------------------------------------------------------------------------
+%                color scheme definition
+%-------------------------------------------------------------------------------
+\input{commons/colors}
+
+\colorlet{color0}{black}% black
+\colorlet{color1}{darkgrey}% dark grey
+\colorlet{color2}{darkgrey}% dark grey
+
+
+\endinput
+
+
+%% end of file `moderncvcolorgrey.sty'.
diff --git a/moderncvcolororange.sty b/moderncvcolororange.sty
new file mode 100644 (file)
index 0000000..bfebee8
--- /dev/null
@@ -0,0 +1,29 @@
+%% start of file `moderncvcolororange.sty'.
+%% Copyright 2006-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv).
+%
+% 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{moderncvcolororange}[2022-02-21 v2.3.1 modern curriculum vitae and letter color scheme: orange]
+
+
+%-------------------------------------------------------------------------------
+%                color scheme definition
+%-------------------------------------------------------------------------------
+\input{commons/colors}
+
+\colorlet{color0}{black}% black
+\colorlet{color1}{orange}% orange
+\colorlet{color2}{darkgrey}% dark grey
+
+
+\endinput
+
+
+%% end of file `moderncvcolororange.sty'.
diff --git a/moderncvcolorpurple.sty b/moderncvcolorpurple.sty
new file mode 100644 (file)
index 0000000..de4915c
--- /dev/null
@@ -0,0 +1,29 @@
+%% start of file `moderncvcolorpurple.sty'.
+%% Copyright 2006-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv).
+%
+% 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{moderncvcolorpurple}[2022-02-21 v2.3.1 modern curriculum vitae and letter color scheme: purple]
+
+
+%-------------------------------------------------------------------------------
+%                color scheme definition
+%-------------------------------------------------------------------------------
+\input{commons/colors}
+
+\colorlet{color0}{black}% black
+\colorlet{color1}{purple}% purple
+\colorlet{color2}{darkgrey}% dark grey
+
+
+\endinput
+
+
+%% end of file `moderncvcolorpurple.sty'.
diff --git a/moderncvcolorred.sty b/moderncvcolorred.sty
new file mode 100644 (file)
index 0000000..bbd9f94
--- /dev/null
@@ -0,0 +1,29 @@
+%% start of file `moderncvcolorred.sty'.
+%% Copyright 2006-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv).
+%
+% 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{moderncvcolorred}[2022-02-21 v2.3.1 modern curriculum vitae and letter color scheme: red]
+
+
+%-------------------------------------------------------------------------------
+%                color scheme definition
+%-------------------------------------------------------------------------------
+\input{commons/colors}
+
+\colorlet{color0}{black}% black
+\colorlet{color1}{red}% red
+\colorlet{color2}{darkgrey}% dark grey
+
+
+\endinput
+
+
+%% end of file `moderncvcolorred.sty'.
diff --git a/moderncvfooti.sty b/moderncvfooti.sty
new file mode 100644 (file)
index 0000000..03d84c1
--- /dev/null
@@ -0,0 +1,138 @@
+%% start of file `moderncvfooti.sty'.
+%% Copyright 2006-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv).
+%
+% 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{moderncvfooti}[2022-02-21 v2.3.1 modern curriculum vitae and letter footer variant: 1]
+
+
+%-------------------------------------------------------------------------------
+%                required packages
+%-------------------------------------------------------------------------------
+
+
+%-------------------------------------------------------------------------------
+%                overall foot definition
+%-------------------------------------------------------------------------------
+% fonts
+\renewcommand*{\addressfont}{\normalsize\mdseries\slshape}
+
+% symbols
+%   footer symbol used to separate footer elements
+\newcommand*{\footsymbol}{%
+    {\hspace{1em}{\rmfamily\textbullet}\hspace{1em}}}% the \rmfamily is required to force Latin Modern fonts when using sans serif, as OMS/lmss/m/n is not defined and gets substituted by OMS/cmsy/m/n
+
+% lengths
+\@initializelength{\footwidth}%
+\renewcommand*{\recomputefootlengths}{%
+  \setlength{\footwidth}{0.8\textwidth}}
+
+% commands
+%   internal command to add an element to the footer
+%   it collects the elements in a temporary box, and checks when to flush the box
+\@initializebox{\footbox}%
+\@initializebox{\foottempbox}%
+\@initializelength{\footboxwidth}%
+\@initializeif{\if@firstfootelement}\@firstfootelementtrue%
+%   adds an element to the footer, separated by footsymbol
+%   usage: \addtofoot[footsymbol]{element}
+\newcommand*{\addtofoot}[2][\footsymbol]{%
+  \if@firstfootelement%
+    \savebox{\foottempbox}{\usebox{\footbox}#2}%
+  \else%
+    \savebox{\foottempbox}{\usebox{\footbox}#1#2}\fi%
+  \settowidth{\footboxwidth}{\usebox{\foottempbox}}%
+  \ifnum\footboxwidth<\footwidth%
+    \savebox{\footbox}{\usebox{\foottempbox}}%
+    \@firstfootelementfalse%
+  \else%
+    \flushfoot\\%
+    \savebox{\footbox}{#2}%
+    \savebox{\foottempbox}{#2}%
+    \settowidth{\footboxwidth}{\usebox{\footbox}}%
+    \@firstfootelementfalse\fi}
+%   internal command to flush the foot
+\newcommand*{\flushfoot}{%
+  \strut\usebox{\footbox}%
+  \savebox{\footbox}{}%
+  \savebox{\foottempbox}{}%
+  \setlength{\footboxwidth}{0pt}}
+
+
+%-------------------------------------------------------------------------------
+%                resume foot definition
+%-------------------------------------------------------------------------------
+% lenghts
+\renewcommand*{\recomputecvfootlengths}{\recomputefootlengths}
+
+% commands
+\renewcommand*{\makecvfoot}{%
+  \recomputecvfootlengths{}%
+  \fancypagestyle{plain}{%
+    \fancyfoot[c]{%
+      \parbox[b]{\footwidth}{%
+        \centering%
+        \color{color2}\addressfont%
+        \vspace{\baselineskip}% forces a white line to ensure space between main text and footer (as footer height can't be known in advance)
+        \ifthenelse{\isundefined{\@addressstreet}}{}{\addtofoot[]{\addresssymbol\@addressstreet}%
+          \ifthenelse{\equal{\@addresscity}{}}{}{\addtofoot[~--~]{\@addresscity}}% if \addresstreet is defined, \addresscity and \addresscountry will always be defined but could be empty
+          \ifthenelse{\equal{\@addresscountry}{}}{}{\addtofoot[~--~]{\@addresscountry}}%
+          \flushfoot\@firstfootelementtrue\\}%
+        \ifthenelse{\isundefined{\@born}}{}{\addtofoot{\bornsymbol\@born}\flushfoot\@firstfootelementtrue\\}%
+        \collectionloop{phones}{% the key holds the phone type (=symbol command prefix), the item holds the number
+          \addtofoot{\csname\collectionloopkey phonesymbol\endcsname\collectionloopitem}}%
+        \ifthenelse{\isundefined{\@email}}{}{\addtofoot{\emailsymbol\emaillink{\@email}}}%
+        \ifthenelse{\isundefined{\@homepage}}{}{\addtofoot{\homepagesymbol%
+          \ifthenelse{\equal{\@homepageprotocol}{http}}{\httplink{\@homepage}}{\httpslink{\@homepage}}}}%
+        \collectionloop{socials}{% the key holds the social type (=symbol command prefix), the item holds the link
+          \addtofoot{\csname\collectionloopkey socialsymbol\endcsname\collectionloopitem}}%
+        \ifthenelse{\isundefined{\@extrainfo}}{}{\addtofoot{\@extrainfo}}%
+        \ifthenelse{\lengthtest{\footboxwidth=0pt}}{}{\flushfoot}% the lengthtest is required to avoid flushing an empty footer, which could cause a blank line due to the \\ after the address, if no other personal info is used
+        }}}%
+  \pagestyle{plain}}
+
+
+%-------------------------------------------------------------------------------
+%                letter foot definition
+%-------------------------------------------------------------------------------
+% commands
+\renewcommand*{\recomputeletterfootlengths}{\recomputefootlengths}
+\renewcommand*{\makeletterfoot}{%
+  \recomputeletterfootlengths{}%
+  \fancypagestyle{plain}{%
+    \fancyfoot[c]{%
+      \parbox[b]{\footwidth}{%
+        \centering%
+        \addressfont\color{color2}%
+        \vspace{\baselineskip}% forces a white line to ensure space between main text and footer (as footer height can't be known in advance)
+        \vspace{-\baselineskip}% to cancel out the extra vertical space taken by the name (below) and ensure perfect alignment of letter and cv footers
+        \strut{\bfseries\upshape\@firstname~\@lastname}\\% the \strut is required to ensure the line is exactly \baselineskip tall
+        \ifthenelse{\isundefined{\@addressstreet}}{}{\addtofoot[]{\addresssymbol\@addressstreet}%
+          \ifthenelse{\equal{\@addresscity}{}}{}{\addtofoot[~--~]{\@addresscity}}% if \addresstreet is defined, \addresscity and addresscountry will always be defined but could be empty
+          \ifthenelse{\equal{\@addresscountry}{}}{}{\addtofoot[~--~]{\@addresscountry}}%
+          \flushfoot\@firstfootelementtrue\\}%
+        \ifthenelse{\isundefined{\@born}}{}{\addtofoot{\bornsymbol\@born}\flushfoot\@firstfootelementtrue\\}%
+        \collectionloop{phones}{% the key holds the phone type (=symbol command prefix), the item holds the number
+          \addtofoot{\csname\collectionloopkey phonesymbol\endcsname\collectionloopitem}}%
+        \ifthenelse{\isundefined{\@email}}{}{\addtofoot{\emailsymbol\emaillink{\@email}}}%
+        \ifthenelse{\isundefined{\@homepage}}{}{\addtofoot{\homepagesymbol%
+          \ifthenelse{\equal{\@homepageprotocol}{http}}{\httplink{\@homepage}}{\httpslink{\@homepage}}}}%
+        \collectionloop{socials}{% the key holds the social type (=symbol command prefix), the item holds the link
+          \addtofoot{\csname\collectionloopkey socialsymbol\endcsname\collectionloopitem}}%
+        \ifthenelse{\isundefined{\@extrainfo}}{}{\addtofoot{\@extrainfo}}%
+        \ifthenelse{\lengthtest{\footboxwidth=0pt}}{}{\flushfoot}% the lengthtest is required to avoid flushing an empty footer, which could cause a blank line due to the \\ after the address, if no other personal info is used
+        }}}%
+  \pagestyle{plain}}
+
+
+\endinput
+
+
+%% end of file `moderncvfooti.sty'.
diff --git a/moderncvheadi.sty b/moderncvheadi.sty
new file mode 100644 (file)
index 0000000..346bf12
--- /dev/null
@@ -0,0 +1,207 @@
+%% start of file `moderncvheadi.sty'.
+%% Copyright 2006-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv).
+%
+% 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{moderncvheadi}[2022-02-21 v2.3.1 modern curriculum vitae and letter header variant: 1]
+
+% details options: "details" (default) or "nodetails"
+\@initializeif{\if@details}\@detailsfalse
+\DeclareOption{details}   {\@detailstrue}
+\DeclareOption{nodetails} {\@detailsfalse}
+
+% left/right options: "left" (default) or "right"
+\@initializeif{\if@left} \@leftfalse
+\DeclareOption{left}    {\@lefttrue\@rightfalse}
+\@initializeif{\if@right}\@rightfalse
+\DeclareOption{right}   {\@leftfalse\@righttrue}
+
+% top options: align header elements by their top instead of their bottom
+%   default: bottom
+\@initializeif{\if@top}\@topfalse
+\DeclareOption{top}{\@toptrue}
+
+\DeclareOption*{}% avoid choking on unknown options
+\ExecuteOptions{details,left}
+\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
+%-------------------------------------------------------------------------------
+
+
+%-------------------------------------------------------------------------------
+%                overall head definition
+%-------------------------------------------------------------------------------
+% fonts
+\renewcommand*{\namefont}{\fontsize{34}{36}\mdseries\upshape}
+\renewcommand*{\titlefont}{\LARGE\mdseries\slshape}
+\renewcommand*{\addressfont}{\small\mdseries\slshape}
+\renewcommand*{\quotefont}{\large\slshape}
+
+% styles
+\renewcommand*{\namestyle}[1]{{\namefont\textcolor{color0}{#1}}}
+\renewcommand*{\titlestyle}[1]{{\titlefont\textcolor{color2}{#1}}}
+\renewcommand*{\addressstyle}[1]{{\addressfont\textcolor{color2}{#1}}}
+\renewcommand*{\quotestyle}[1]{{\quotefont\textcolor{color1}{#1}}}
+
+
+%-------------------------------------------------------------------------------
+%                resume head definition
+%-------------------------------------------------------------------------------
+% lengths
+\@initializelength{\quotewidth}
+\@initializelength{\makecvheadnamewidth}% optional makecvheadname width to force a certain width (if set/remains to 0pt, the width is calculated automatically)
+\renewcommand*{\recomputecvheadlengths}{%
+  \setlength{\quotewidth}{0.65\textwidth}}
+
+% commands
+\renewcommand*{\makecvhead}{%
+  % recompute lengths (in case we are switching from letter to resume, or vice versa)
+  \recomputecvlengths%
+  % optional detailed information (pre-rendering)
+  \@initializebox{\makecvheaddetailsbox}%
+  \if@details%
+    \def\phonesdetails{}%
+    \collectionloop{phones}{% the key holds the phone type (=symbol command prefix), the item holds the number
+      \protected@edef\phonesdetails{\phonesdetails\protect\makenewline\csname\collectionloopkey phonesymbol\endcsname\collectionloopitem}}%
+    \def\socialsdetails{}%
+    \collectionloop{socials}{% the key holds the social type (=symbol command prefix), the item holds the link
+      \protected@edef\socialsdetails{\socialsdetails\protect\makenewline\csname\collectionloopkey socialsymbol\endcsname\collectionloopitem}}%
+    \savebox{\makecvheaddetailsbox}{%
+      \addressfont\color{color2}%
+      \if@left\begin{tabular}[b]{@{}r@{}}\fi%
+      \if@right\begin{tabular}[b]{@{}l@{}}\fi%
+        \ifthenelse{\isundefined{\@addressstreet}}{}{\makenewline\addresssymbol\@addressstreet%
+          \ifthenelse{\equal{\@addresscity}{}}{}{\makenewline\@addresscity}% if \addresstreet is defined, \addresscity and addresscountry will always be defined but could be empty
+          \ifthenelse{\equal{\@addresscountry}{}}{}{\makenewline\@addresscountry}}%
+        \ifthenelse{\isundefined{\@born}}{}{\makenewline\bornsymbol\@born}%
+        \phonesdetails% needs to be pre-rendered as loops and tabulars seem to conflict
+        \ifthenelse{\isundefined{\@email}}{}{\makenewline\emailsymbol\emaillink{\@email}}%
+        \ifthenelse{\isundefined{\@homepage}}{}{\makenewline\homepagesymbol%
+          \ifthenelse{\equal{\@homepageprotocol}{http}}{\httplink{\@homepage}}{\httpslink{\@homepage}}}%
+        \socialsdetails% needs to be pre-rendered as loops and tabulars seem to conflict
+        \ifthenelse{\isundefined{\@extrainfo}}{}{\makenewline\@extrainfo}%
+      \end{tabular}
+    }\fi%
+  % optional photo (pre-rendering)
+  \@initializebox{\makecvheadpicturebox}%
+  \savebox{\makecvheadpicturebox}{%
+    \ifthenelse{\isundefined{\@photo}}%
+      {}%
+      {%
+        \if@left%
+          \hspace*{\separatorcolumnwidth}\fi%
+        \color{color1}%
+        \setlength{\fboxrule}{\@photoframewidth}%
+        \ifdim\@photoframewidth=0pt%
+          \setlength{\fboxsep}{0pt}\fi%
+        \framebox{\includegraphics[width=\@photowidth]{\@photo}}}%
+        \if@right%
+          \hspace*{\separatorcolumnwidth}\fi}%
+  % name and title (pre-rendering)
+  \@initializelength{\makecvheaddetailswidth}\settowidth{\makecvheaddetailswidth}{\usebox{\makecvheaddetailsbox}}%
+  \@initializelength{\makecvheadpicturewidth}\settowidth{\makecvheadpicturewidth}{\usebox{\makecvheadpicturebox}}%
+  \ifthenelse{\lengthtest{\makecvheadnamewidth=0pt}}% check for dummy value (equivalent to \ifdim\makecvheadnamewidth=0pt)
+    {\setlength{\makecvheadnamewidth}{\textwidth-\makecvheaddetailswidth-\makecvheadpicturewidth}}%
+    {}%
+  \@initializebox{\makecvheadnamebox}%
+  \savebox{\makecvheadnamebox}{%
+    \begin{minipage}[b]{\makecvheadnamewidth}%
+      \if@left\raggedright\fi%
+      \if@right\raggedleft\fi%
+      \namestyle{\@firstname\ \@lastname}%
+      \ifthenelse{\equal{\@title}{}}{}{\\[1.25em]\titlestyle{\@title}}%
+    \end{minipage}}%
+  % raise boxes if top option is set
+  \if@top%
+    \savebox{\makecvheadnamebox}{\raisebox{-\height+\baselineskip}{\usebox{\makecvheadnamebox}}}%
+    \savebox{\makecvheaddetailsbox}{\raisebox{-\height+\baselineskip}{\usebox{\makecvheaddetailsbox}}}%
+    \savebox{\makecvheadpicturebox}{\raisebox{-\height+\baselineskip}{\usebox{\makecvheadpicturebox}}}\fi%
+  % rendering
+  \if@left%
+    \usebox{\makecvheadnamebox}%
+    \hfill%
+    \llap{\usebox{\makecvheaddetailsbox}}% \llap is used to suppress the width of the box, allowing overlap if the value of makecvheadnamewidth is forced
+    \usebox{\makecvheadpicturebox}\fi%
+  \if@right%
+    \usebox{\makecvheadpicturebox}%
+    \rlap{\usebox{\makecvheaddetailsbox}}% \llap is used to suppress the width of the box, allowing overlap if the value of makecvheadnamewidth is forced
+    \hfill%
+    \usebox{\makecvheadnamebox}\fi%
+  % optional quote
+  \ifthenelse{\isundefined{\@quote}}%
+    {\vspace{2.5em}}%
+    {%
+      \\[2.5em]%
+      {%
+        \centering%
+        \begin{minipage}{\quotewidth}%
+          \centering%
+          \quotestyle{\@quote}%
+        \end{minipage}\\[2.5em]}}%
+  \par}% to avoid weird spacing bug at the first section if no blank line is left after \makecvhead
+
+
+%-------------------------------------------------------------------------------
+%                letter head definition
+%-------------------------------------------------------------------------------
+% lengths
+%\renewcommand*{\recomputeletterheadlengths}{}
+
+% commands
+\renewcommand*{\makeletterhead}{%
+  % recompute lengths (in case we are switching from letter to resume, or vice versa)
+  \recomputeletterlengths%
+  % sender contact info
+  \hfill%
+  \begin{minipage}{.5\textwidth}%
+    % optional detailed information
+    \if@details%
+      \raggedleft%
+      \addressfont\textcolor{color2}{%
+        {\bfseries\upshape\@firstname~\@lastname}\@firstdetailselementfalse%
+        % optional detailed information
+        \ifthenelse{\isundefined{\@addressstreet}}{}{\makenewline\addresssymbol\@addressstreet%
+          \ifthenelse{\equal{\@addresscity}{}}{}{\makenewline\@addresscity}% if \addresstreet is defined, \addresscity and addresscountry will always be defined but could be empty
+          \ifthenelse{\equal{\@addresscountry}{}}{}{\makenewline\@addresscountry}}%
+        \collectionloop{phones}{% the key holds the phone type (=symbol command prefix), the item holds the number
+          \makenewline\csname\collectionloopkey phonesymbol\endcsname\collectionloopitem}%
+        \ifthenelse{\isundefined{\@email}}{}{\makenewline\emailsymbol\emaillink{\@email}}%
+        \ifthenelse{\isundefined{\@homepage}}{}{\makenewline\homepagesymbol%
+          \ifthenelse{\equal{\@homepageprotocol}{http}}{\httplink{\@homepage}}{\httpslink{\@homepage}}}%
+        \ifthenelse{\isundefined{\@extrainfo}}{}{\makenewline\@extrainfo}}\fi%
+    \end{minipage}\\[2em]
+  % recipient block
+  \begin{minipage}[t]{.5\textwidth}
+    \raggedright%
+    \addressfont%
+    {\bfseries\upshape\@recipientname}\\%
+    \@recipientaddress%
+  \end{minipage}
+  % date
+  \hfill% US style
+%  \\[1em]% UK style
+  \@date\\[2em]% US informal style: "January 1, 1900"; UK formal style: "01/01/1900"
+  % optional subject
+  \ifthenelse{\isundefined{\@subject}}{}{{\bfseries\@subject\\[2em]}}
+  % opening
+  \raggedright%
+  \@opening\\[1.5em]%
+  % ensure no extra spacing after \makelettertitle due to a possible blank line
+%  \ignorespacesafterend% not working
+  \hspace{0pt}\par\vspace{-\baselineskip}\vspace{-\parskip}}
+
+
+\endinput
+
+
+%% end of file `moderncvheadi.sty'.
diff --git a/moderncvheadii.sty b/moderncvheadii.sty
new file mode 100644 (file)
index 0000000..bf0a6d6
--- /dev/null
@@ -0,0 +1,210 @@
+%% start of file `moderncvheadii.sty'.
+%% Copyright 2006-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv).
+%
+% 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{moderncvheadii}[2022-02-21 v2.3.1 modern curriculum vitae and letter header variant: 2]
+
+% details options: "details" or "nodetails" (default)
+\@initializeif{\if@details}\@detailsfalse
+\DeclareOption{details}{\@detailstrue}
+\DeclareOption{nodetails}{\@detailsfalse}
+
+% name design options: "alternate" (lowercase names & title, no spacing)
+\@initializeif{\if@alternate}\@alternatefalse
+\DeclareOption{alternate}{\@alternatetrue}
+
+% left/right options: "left" or "right" (default)
+\@initializeif{\if@left} \@leftfalse
+\DeclareOption{left}    {\@lefttrue\@rightfalse}
+\@initializeif{\if@right}\@rightfalse
+\DeclareOption{right}   {\@leftfalse\@righttrue}
+
+\DeclareOption*{}% avoid choking on unknown options
+\ExecuteOptions{nodetails,right}
+\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
+%-------------------------------------------------------------------------------
+
+
+%-------------------------------------------------------------------------------
+%                overall head definition
+%-------------------------------------------------------------------------------
+% fonts
+\renewcommand*{\namefont}{\fontsize{38}{40}\mdseries\upshape}
+\renewcommand*{\titlefont}{\LARGE\mdseries\slshape}
+\renewcommand*{\addressfont}{\normalsize\mdseries\slshape}
+\renewcommand*{\quotefont}{\large\slshape}
+
+% styles
+\renewcommand*{\namestyle}[1]{{\namefont\textcolor{color0}{#1}}}
+\renewcommand*{\titlestyle}[1]{{\titlefont\textcolor{color2}{#1}}}
+\renewcommand*{\addressstyle}[1]{{\addressfont\textcolor{color2}{#1}}}
+\renewcommand*{\quotestyle}[1]{{\quotefont\textcolor{color1}{#1}}}
+
+% commands
+\@initializecommand{\makeheaddetailssymbol}{%
+    {\hspace{1em}{\rmfamily\textbullet}\hspace{1em}}}% the \rmfamily is required to force Latin Modern fonts when using sans serif, as OMS/lmss/m/n is not defined and gets substituted by OMS/cmsy/m/n
+%   internal command to add an element to the footer
+%   it collects the elements in a temporary box, and checks when to flush the box
+\@initializebox{\makeheaddetailsbox}%
+\@initializebox{\makeheaddetailstempbox}%
+\@initializelength{\makeheaddetailswidth}%
+\@initializelength{\makeheaddetailsboxwidth}%
+\@initializeif{\if@firstmakeheaddetailselement}\@firstmakeheaddetailselementtrue%
+%   adds an element to the makehead, separated by makeheadsymbol
+%   usage: \addtomakehead[makeheadsymbol]{element}
+\newcommand*{\addtomakeheaddetails}[2][\makeheaddetailssymbol]{% TODO: use \@initializecommand, which requires modifying its definition to handle mandatory and optional arguments
+  \if@firstmakeheaddetailselement%
+    \savebox{\makeheaddetailstempbox}{\usebox{\makeheaddetailsbox}#2}%
+  \else%
+    \savebox{\makeheaddetailstempbox}{\usebox{\makeheaddetailsbox}#1#2}\fi%
+  \settowidth{\makeheaddetailsboxwidth}{\usebox{\makeheaddetailstempbox}}%
+  \ifnum\makeheaddetailsboxwidth<\makeheaddetailswidth%
+    \savebox{\makeheaddetailsbox}{\usebox{\makeheaddetailstempbox}}%
+    \@firstmakeheaddetailselementfalse%
+  \else%
+    \flushmakeheaddetails\\\null% \null is required as there is no box on the line after \\, so glue such as \hfill (and leaders) disappear; this is in contrast to after \par, where the next line starts with an indent box (even after \noindent)
+    \savebox{\makeheaddetailsbox}{#2}%
+    \savebox{\makeheaddetailstempbox}{#2}%
+    \settowidth{\makeheaddetailsboxwidth}{\usebox{\makeheaddetailsbox}}%
+    \@firstmakeheaddetailselementfalse\fi}
+%   internal command to flush the makehead
+\@initializecommand{\flushmakeheaddetails}{%
+  \if@right\hfill\fi%
+  \strut\usebox{\makeheaddetailsbox}%
+  \savebox{\makeheaddetailsbox}{}%
+  \savebox{\makeheaddetailstempbox}{}%
+  \setlength{\makeheaddetailsboxwidth}{0pt}}
+
+
+%-------------------------------------------------------------------------------
+%                resume head definition
+%-------------------------------------------------------------------------------
+% lengths
+\@initializelength{\quotewidth}
+\renewcommand*{\recomputecvheadlengths}{%
+  \setlength{\makeheaddetailswidth}{\textwidth}%
+  \setlength{\quotewidth}{0.65\textwidth}}
+
+% commands
+\renewcommand*{\makecvhead}{% TODO: use \@initializecommand, which requires modifying its definition to handle \par
+  % recompute lengths (in case we are switching from letter to resume, or vice versa)
+  \recomputecvlengths%
+  % optional picture (pre-rendering)
+  \@initializebox{\makecvheadpicturebox}%
+  \savebox{\makecvheadpicturebox}{%
+    \ifthenelse{\isundefined{\@photo}}%
+      {}%
+      {%
+       \setlength\fboxrule{\@photoframewidth}%
+       \ifdim\@photoframewidth=0pt%
+         \setlength{\fboxsep}{0pt}\fi%
+       {\color{color1}\framebox{\includegraphics[width=\@photowidth]{\@photo}}}}}%
+  % name (pre-rendering)
+  \@initializelength{\makecvheadpicturewidth}%
+  \settowidth{\makecvheadpicturewidth}{\usebox{\makecvheadpicturebox}}%
+  \@initializebox{\makecvheadnamebox}%
+  \savebox{\makecvheadnamebox}{%
+    \parbox[b]{\textwidth-\makecvheadpicturewidth}{%
+      \if@left\raggedright\fi%
+      \if@right\raggedleft\fi%
+      \namefont%
+      \if@alternate% alternate design: first- and lastname in lowercase with no space in between (distinction is made by color difference)
+        {\color{color2!50}\MakeLowercase\@firstname}{\color{color2}\MakeLowercase\@lastname}%
+      \else% default design: first- and lastname as given with a space in between
+        {\color{color2!50}\@firstname} {\color{color2}\@lastname}\fi}}%
+  % rendering
+  \if@left%
+    \usebox{\makecvheadnamebox}%
+    \usebox{\makecvheadpicturebox}\fi
+  \if@right%
+    \usebox{\makecvheadpicturebox}%
+    \usebox{\makecvheadnamebox}\fi\\[-.35em]%
+  {\color{color2!50}\rule{\textwidth}{.25ex}}%
+  % optional detailed information
+  \if@details{%
+    \\\null%
+    \addressfont\color{color2}%
+    \ifthenelse{\isundefined{\@addressstreet}}{}{\addtomakeheaddetails{\addresssymbol\@addressstreet}%
+      \ifthenelse{\equal{\@addresscity}{}}{}{\addtomakeheaddetails[~--~]{\@addresscity}}% if \addresstreet is defined, \addresscity and \addresscountry will always be defined but could be empty
+      \ifthenelse{\equal{\@addresscountry}{}}{}{\addtomakeheaddetails[~--~]{\@addresscountry}}%
+        \flushmakeheaddetails\@firstmakeheaddetailselementtrue\\\null}%
+    \ifthenelse{\isundefined{\@born}}{}{\addtomakeheaddetails{\bornsymbol\@born}}%
+    \collectionloop{phones}{% the key holds the phone type (=symbol command prefix), the item holds the number
+      \addtomakeheaddetails{\csname\collectionloopkey phonesymbol\endcsname\collectionloopitem}}%
+    \ifthenelse{\isundefined{\@email}}{}{\addtomakeheaddetails{\emailsymbol\emaillink{\@email}}}%
+    \ifthenelse{\isundefined{\@homepage}}{}{\addtomakeheaddetails{\homepagesymbol%
+      \ifthenelse{\equal{\@homepageprotocol}{http}}{\httplink{\@homepage}}{\httpslink{\@homepage}}}}%
+    \collectionloop{socials}{% the key holds the social type (=symbol command prefix), the item holds the link
+      \addtomakeheaddetails{\csname\collectionloopkey socialsymbol\endcsname\collectionloopitem}}%
+    \ifthenelse{\isundefined{\@extrainfo}}{}{\addtomakeheaddetails{\@extrainfo}}%
+    \flushmakeheaddetails}\fi% need to force a \par after this to avoid weird spacing bug at the first section if no blank line is left after \makehead
+  % optional title
+  \ifthenelse{\equal{\@title}{}}{}{%
+    \\[1.25em]\null% \null is required as there is no box on the line after \\, so glue such as \hfill (and leaders) disappear; this is in contrast to after \par, where the next line starts with an indent box (even after \noindent)
+    \if@right\hfill\fi%
+    \if@alternate%
+      \titlestyle{\MakeLowercase\@title}%
+    \else%
+      \titlestyle{\@title}\fi%
+    }
+  % optional quote
+  \ifthenelse{\isundefined{\@quote}}%
+    {\vspace{2.5em}}%
+    {%
+      \\[2.5em]%
+      {%
+      \centering%
+      \begin{minipage}{\quotewidth}%
+        \centering%
+        \quotestyle{\@quote}%
+      \end{minipage}\\[2.5em]}}%
+  \par}% to avoid weird spacing bug at the first section if no blank line is left after \maketitle
+
+
+%-------------------------------------------------------------------------------
+%                letter head definition
+%-------------------------------------------------------------------------------
+% lengths
+%\renewcommand*{\recomputeletterheadlengths}{}
+
+% commands
+\renewcommand*{\makeletterhead}{%
+  % recompute lengths (in case we are switching from letter to resume, or vice versa)
+  \recomputeletterlengths%
+  % recipient block
+  \begin{minipage}[t]{.5\textwidth}
+    \raggedright%
+    \addressfont%
+    {\bfseries\upshape\@recipientname}\\%
+    \@recipientaddress%
+  \end{minipage}
+  % date
+  \hfill% US style
+%  \\[1em]% UK style
+  \@date\\[3em]% US informal style: "January 1, 1900"; UK formal style: "01/01/1900"
+  % optional subject
+  \ifthenelse{\isundefined{\@subject}}{}{{\bfseries\@subject\\[3em]}}
+  % opening
+  \raggedright%
+  \@opening\\[1.5em]%
+  % ensure no extra spacing after \makelettertitle due to a possible blank line
+%  \ignorespacesafterend% not working
+  \hspace{0pt}\par\vspace{-\baselineskip}\vspace{-\parskip}}
+
+
+\endinput
+
+
+%% end of file `moderncvheadii.sty'.
diff --git a/moderncvheadiii.sty b/moderncvheadiii.sty
new file mode 100644 (file)
index 0000000..c3fafce
--- /dev/null
@@ -0,0 +1,186 @@
+%% start of file `moderncvheadiii.sty'.
+%% Copyright 2006-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv).
+%
+% 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{moderncvheadiii}[2022-02-21 v2.3.1 modern curriculum vitae and letter header variant: 3]
+
+% details options: "details" (default) or "nodetails"
+\@initializeif{\if@details}\@detailsfalse
+\DeclareOption{details}{\@detailstrue}
+\DeclareOption{nodetails}{\@detailsfalse}
+
+\DeclareOption*{}% avoid choking on unknown options
+\ExecuteOptions{details}
+\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
+%-------------------------------------------------------------------------------
+
+
+%-------------------------------------------------------------------------------
+%                overall head definition
+%-------------------------------------------------------------------------------
+% fonts
+\renewcommand*{\namefont}{\Huge\bfseries\upshape}
+\renewcommand*{\titlefont}{\Huge\mdseries\upshape}
+\renewcommand*{\addressfont}{\normalsize\mdseries\upshape}
+\renewcommand*{\quotefont}{\large\slshape}
+
+% styles
+\renewcommand*{\namestyle}[1]{{\namefont\textcolor{color1}{#1}}}
+\renewcommand*{\titlestyle}[1]{{\titlefont\textcolor{color2!85}{#1}}}
+\renewcommand*{\addressstyle}[1]{{\addressfont\textcolor{color2}{#1}}}
+\renewcommand*{\quotestyle}[1]{{\quotefont\textcolor{color1}{#1}}}
+
+% commands
+\@initializecommand{\makeheaddetailssymbol}{%
+    {\hspace{1em}{\rmfamily\textbullet}\hspace{1em}}}% the \rmfamily is required to force Latin Modern fonts when using sans serif, as OMS/lmss/m/n is not defined and gets substituted by OMS/cmsy/m/n
+%   internal command to add an element to the footer
+%   it collects the elements in a temporary box, and checks when to flush the box
+\@initializebox{\makeheaddetailsbox}%
+\@initializebox{\makeheaddetailstempbox}%
+\@initializelength{\makeheaddetailswidth}%
+\@initializelength{\makeheaddetailsboxwidth}%
+\@initializeif{\if@firstmakeheaddetailselement}\@firstmakeheaddetailselementtrue%
+%   adds an element to the makehead, separated by makeheadsymbol
+%   usage: \addtomakehead[makeheadsymbol]{element}
+\newcommand*{\addtomakeheaddetails}[2][\makeheaddetailssymbol]{% TODO: use \@initializecommand, which requires modifying its definition to handle mandatory and optional arguments
+  \if@firstmakeheaddetailselement%
+    \savebox{\makeheaddetailstempbox}{\usebox{\makeheaddetailsbox}#2}%
+  \else%
+    \savebox{\makeheaddetailstempbox}{\usebox{\makeheaddetailsbox}#1#2}\fi%
+  \settowidth{\makeheaddetailsboxwidth}{\usebox{\makeheaddetailstempbox}}%
+  \ifnum\makeheaddetailsboxwidth<\makeheaddetailswidth%
+    \savebox{\makeheaddetailsbox}{\usebox{\makeheaddetailstempbox}}%
+    \@firstmakeheaddetailselementfalse%
+  \else%
+    \flushmakeheaddetails\\%
+    \savebox{\makeheaddetailsbox}{#2}%
+    \savebox{\makeheaddetailstempbox}{#2}%
+    \settowidth{\makeheaddetailsboxwidth}{\usebox{\makeheaddetailsbox}}%
+    \@firstmakeheaddetailselementfalse\fi}
+%   internal command to flush the makehead
+\@initializecommand{\flushmakeheaddetails}{%
+  \ifnum\makeheaddetailsboxwidth>0%
+    \strut\usebox{\makeheaddetailsbox}%
+    \savebox{\makeheaddetailsbox}{}%
+    \savebox{\makeheaddetailstempbox}{}%
+    \setlength{\makeheaddetailsboxwidth}{0pt}\fi}
+\@initializecommand{\makehead}{%
+  \setlength{\makeheaddetailswidth}{0.8\textwidth}%
+  \hfil%
+  \parbox{\makeheaddetailswidth}{%
+    \centering%
+    % name and title
+    \namestyle{\@firstname~\@lastname}%
+    \ifthenelse{\equal{\@title}{}}{}{\titlestyle{~|~\@title}}% \isundefined doesn't work on \@title, as LaTeX itself defines \@title (before it possibly gets redefined by \title)
+    % optional detailed information
+    \if@details{%
+      \\%
+      \addressfont\color{color2}%
+      \ifthenelse{\isundefined{\@addressstreet}}{}{\addtomakeheaddetails{\addresssymbol\@addressstreet}%
+        \ifthenelse{\equal{\@addresscity}{}}{}{\addtomakeheaddetails[~--~]{\@addresscity}}% if \addresstreet is defined, \addresscity and \addresscountry will always be defined but could be empty
+        \ifthenelse{\equal{\@addresscountry}{}}{}{\addtomakeheaddetails[~--~]{\@addresscountry}}%
+        \flushmakeheaddetails\@firstmakeheaddetailselementtrue\\}%
+      \ifthenelse{\isundefined{\@born}}{}{\addtomakeheaddetails{\bornsymbol\@born}}%
+      \collectionloop{phones}{% the key holds the phone type (=symbol command prefix), the item holds the number
+        \addtomakeheaddetails{\csname\collectionloopkey phonesymbol\endcsname\collectionloopitem}}%
+      \ifthenelse{\isundefined{\@email}}{}{\addtomakeheaddetails{\emailsymbol\emaillink{\@email}}}%
+      \ifthenelse{\isundefined{\@homepage}}{}{\addtomakeheaddetails{\homepagesymbol%
+        \ifthenelse{\equal{\@homepageprotocol}{http}}{\httplink{\@homepage}}{\httpslink{\@homepage}}}}%
+      \collectionloop{socials}{% the key holds the social type (=symbol command prefix), the item holds the link
+        \addtomakeheaddetails{\csname\collectionloopkey socialsymbol\endcsname\collectionloopitem}}%
+      \ifthenelse{\isundefined{\@extrainfo}}{}{\addtomakeheaddetails{\@extrainfo}}%
+      \flushmakeheaddetails}\fi}}% need to force a \par after this to avoid weird spacing bug at the first section if no blank line is left after \makehead
+
+
+%-------------------------------------------------------------------------------
+%                resume head definition
+%-------------------------------------------------------------------------------
+% lengths
+\@initializelength{\quotewidth}
+\renewcommand*{\recomputecvheadlengths}{%
+  \setlength{\quotewidth}{0.65\textwidth}}
+
+% commands
+\renewcommand*{\makecvhead}{% TODO: use \@initializecommand, which requires modifying its definition to handle \par
+  % recompute lengths (in case we are switching from letter to resume, or vice versa)
+  \recomputecvlengths%
+  \makehead%
+  % optional quote
+  \ifthenelse{\isundefined{\@quote}}%
+    {\vspace{2.5em}}%
+    {%
+      \\[2.5em]%
+      {%
+      \centering%
+      \begin{minipage}{\quotewidth}%
+        \centering%
+        \quotestyle{\@quote}%
+      \end{minipage}\\[2.5em]}}%
+  \par}% to avoid weird spacing bug at the first section if no blank line is left after \maketitle}
+
+
+%-------------------------------------------------------------------------------
+%                letter head definition
+%-------------------------------------------------------------------------------
+% lengths
+%\renewcommand*{\recomputeletterheadlengths}{}
+
+% commands
+\renewcommand*{\makeletterhead}{%
+  % recompute lengths (in case we are switching from letter to resume, or vice versa)
+  \recomputeletterlengths%
+  % sender contact info
+  \hfill%
+  \begin{minipage}{.5\textwidth}%
+    % optional detailed information
+    \if@details%
+      \raggedleft%
+      \addressfont\textcolor{color2}{%
+        {\bfseries\upshape\@firstname~\@lastname}\@firstdetailselementfalse%
+        % optional detailed information
+        \ifthenelse{\isundefined{\@addressstreet}}{}{\makenewline\addresssymbol\@addressstreet%
+          \ifthenelse{\equal{\@addresscity}{}}{}{\makenewline\@addresscity}% if \addresstreet is defined, \addresscity and addresscountry will always be defined but could be empty
+          \ifthenelse{\equal{\@addresscountry}{}}{}{\makenewline\@addresscountry}}%
+        \collectionloop{phones}{% the key holds the phone type (=symbol command prefix), the item holds the number
+          \makenewline\csname\collectionloopkey phonesymbol\endcsname\collectionloopitem}%
+        \ifthenelse{\isundefined{\@email}}{}{\makenewline\emailsymbol\emaillink{\@email}}%
+        \ifthenelse{\isundefined{\@homepage}}{}{\makenewline\homepagesymbol%
+          \ifthenelse{\equal{\@homepageprotocol}{http}}{\httplink{\@homepage}}{\httpslink{\@homepage}}}%
+        \ifthenelse{\isundefined{\@extrainfo}}{}{\makenewline\@extrainfo}}\fi%
+    \end{minipage}\\[2em]
+   % recipient block
+  \begin{minipage}[t]{.5\textwidth}
+    \raggedright%
+    \addressfont%
+    {\bfseries\upshape\@recipientname}\\%
+    \@recipientaddress%
+  \end{minipage}
+  % date
+  \hfill% US style
+%  \\[1em]% UK style
+  \@date\\[3em]% US informal style: "January 1, 1900"; UK formal style: "01/01/1900"
+  % optional subject
+  \ifthenelse{\isundefined{\@subject}}{}{{\bfseries\@subject\\[3em]}}
+  % opening
+  \raggedright%
+  \@opening\\[1.5em]%
+  % ensure no extra spacing after \makelettertitle due to a possible blank line
+%  \ignorespacesafterend% not working
+  \hspace{0pt}\par\vspace{-\baselineskip}\vspace{-\parskip}}
+
+
+\endinput
+
+
+%% end of file `moderncvheadiii.sty'.
diff --git a/moderncvheadiv.sty b/moderncvheadiv.sty
new file mode 100644 (file)
index 0000000..1d24c96
--- /dev/null
@@ -0,0 +1,176 @@
+%% start of file `moderncvheadiv.sty'.
+%% Copyright 2006-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv).
+%
+% 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{moderncvheadiv}[2022-02-21 v2.3.1 modern curriculum vitae and letter header variant: 4]
+
+% details options: "details" (default) or "nodetails"
+\@initializeif{\if@details}\@detailsfalse
+\DeclareOption{details}{\@detailstrue}
+\DeclareOption{nodetails}{\@detailsfalse}
+
+\DeclareOption*{}% avoid choking on unknown options
+\ExecuteOptions{details}
+\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
+%-------------------------------------------------------------------------------
+% change the layout of the page on the fly, for resume or letter layout
+\RequirePackage{changepage}
+
+
+%-------------------------------------------------------------------------------
+%                overall head definition
+%-------------------------------------------------------------------------------
+% fonts
+\renewcommand*{\namefont}{\fontsize{34}{36}\mdseries\upshape}
+\renewcommand*{\titlefont}{\LARGE\mdseries\slshape}
+\renewcommand*{\addressfont}{\small\mdseries}
+\renewcommand*{\quotefont}{\large\itshape}
+
+% styles
+\renewcommand*{\namestyle}[1]{{\namefont\textcolor{color0}{#1}}}
+\renewcommand*{\titlestyle}[1]{{\titlefont\textcolor{color2}{#1}}}
+\renewcommand*{\addressstyle}[1]{{\addressfont\textcolor{color2}{#1}}}
+\renewcommand*{\quotestyle}[1]{{\quotefont\textcolor{color1}{#1}}}
+
+
+%-------------------------------------------------------------------------------
+%                resume head definition
+%-------------------------------------------------------------------------------
+% lengths
+\@initializelength{\quotewidth}
+\@initializelength{\makecvheadnamewidth}% optional makecvheadname width to force a certain width (if set/remains to 0pt, the width is calculated automatically)
+\setlength{\marginparwidth}{0\p@}
+\setlength{\marginparsep}{0\p@}
+\renewcommand*{\recomputecvheadlengths}{%
+  \changepage{}{+\marginparwidth+\marginparsep}{}{}{}{}{}{}{}% if a letter was typeset before the resume, \marginparwidth and \marginparsep will be non-zero; otherwise, this has no effect
+  \setlength{\marginparwidth}{0\p@}%
+  \setlength{\marginparsep}{0\p@}%
+  \setlength{\quotewidth}{0.85\textwidth}}
+
+% commands
+\newcommand*{\makecvheadinfo}[1]{% TODO: use \@initializecommand, which requires modifying its definition to handle mandatory and optional arguments
+  \newbox{\makecvheadinfobox}%
+  \savebox{\makecvheadinfobox}{\parbox[t]{\hintscolumnwidth}{#1}}%
+  \newlength{\makecvheadinfoheight}%
+  \setlength{\makecvheadinfoheight}{\totalheightof{\usebox{\makecvheadinfobox}}}% the total height of the parbox is the sum of its height (\the\ht\makeinfobox) and its depth (\the\dp\makeinfobox); the \totalheightof command is provided by the "calc" package
+  \usebox{\makecvheadinfobox}\vspace{-\makecvheadinfoheight}%
+%  \newlength{\leftcolumnwidth}%
+%  \setlength{\leftcolumnwidth}{\hintscolumnwidth+\separatorcolumnwidth}%
+%  \par\vspace{-\baselineskip}\vspace{-\parskip}\leftskip=\leftcolumnwidth%
+  \par\vspace{-\baselineskip}\vspace{-\parskip}%
+  \leftskip=\dimexpr\hintscolumnwidth+\separatorcolumnwidth\relax% \dimexpr require e-TeX engine extensions
+  \recomputecvlengths} % need to recompute the layout lenghts as we just changed \leftskip
+\renewcommand*{\makecvhead}{
+  % recompute lengths (in case we are switching from letter to resume, or vice versa)
+  \recomputecvlengths%
+  % optional picture box
+  \newbox{\makecvheadpicturebox}%
+  \savebox{\makecvheadpicturebox}{%
+    \ifthenelse{\isundefined{\@photo}}%
+    {}%
+    {%
+      \color{color1}%
+      \setlength\fboxrule{\@photoframewidth}%
+      \ifdim\@photoframewidth=0pt%
+        \setlength{\fboxsep}{0pt}\fi%
+      \framebox{\includegraphics[width=\@photowidth]{\@photo}}}}%
+  % name and optional title
+  \newlength{\makecvheadpicturewidth}\settowidth{\makecvheadpicturewidth}{\usebox{\makecvheadpicturebox}}%
+  \ifthenelse{\lengthtest{\makecvheadnamewidth=0pt}}% check for dummy value (equivalent to \ifdim\makecvheadnamewidth=0pt)
+    {\setlength{\makecvheadnamewidth}{\textwidth-\makecvheadpicturewidth}}%
+    {}%
+  \begin{minipage}[b]{\makecvheadnamewidth}%
+    \namestyle{\@firstname\ \@lastname}%
+    \ifthenelse{\equal{\@title}{}}{}{\\[1.25em]\titlestyle{\@title}}%
+  \end{minipage}%
+  % optional photo
+  \usebox{\makecvheadpicturebox}\\[2.5em]%
+  % optional quote
+  \ifthenelse{\isundefined{\@quote}}%
+    {}%
+    {{\centering\begin{minipage}{\quotewidth}\centering\quotestyle{\@quote}\end{minipage}\\[2.5em]}}%
+  % optional details
+  \if@details%
+    \makecvheadinfo{%
+      \addressfont\color{color2}%
+      \ifthenelse{\isundefined{\@addressstreet}}{}{\makenewline\addresssymbol\@addressstreet%
+        \ifthenelse{\equal{\@addresscity}{}}{}{\makenewline\@addresscity}% if \addresstreet is defined, \addresscity and \addresscountry will always be defined but could be empty
+        \ifthenelse{\equal{\@addresscountry}{}}{}{\makenewline\@addresscountry}}%
+      \ifthenelse{\isundefined{\@born}}{}{\makenewline\hbox to 1.0em{\bornsymbol}~\@born}%
+      \collectionloop{phones}{% the key holds the phone type (=symbol command prefix), the item holds the number
+        \makenewline\hbox to 1.0em{\csname\collectionloopkey phonesymbol\endcsname}~\collectionloopitem}%
+      \ifthenelse{\isundefined{\@email}}{}{\makenewline\hbox to 1.0em{\emailsymbol}~\emaillink{\@email}}%
+      \ifthenelse{\isundefined{\@homepage}}{}{\makenewline\hbox to 1.0em{\homepagesymbol}~%
+        \ifthenelse{\equal{\@homepageprotocol}{http}}{\httplink{\@homepage}}{\httpslink{\@homepage}}}%
+      \collectionloop{socials}{% the key holds the social type (=symbol command prefix), the item holds the link
+        \makenewline\hbox to 1.0em{\csname\collectionloopkey socialsymbol\endcsname}~\collectionloopitem}%
+      \ifthenelse{\isundefined{\@extrainfo}}{}{\makenewline\@extrainfo}}\fi}
+
+
+%-------------------------------------------------------------------------------
+%                letter head definition
+%-------------------------------------------------------------------------------
+% lengths
+%\newlength{\textwidthdelta}%
+\renewcommand*{\recomputeletterheadlengths}{%
+  \recomputecvlengths%
+%  \setlength{\textwidthdelta}{+\marginparwidth+\marginparsep}%
+%  \addtolength{\textwidthdelta}{-\marginparwidth-\marginparsep}%
+%  \changepage{}{\textwidthdelta}{-\textwidthdelta}{}{}{}{}{}{}%\changepage{<textheight>}{<textwidth>}{<evensidemargin>}{<oddsidemargin>}{<columnsep>}{<topmargin>}{<headheight>}{<headsep>}{<footskip>}
+  \setlength{\marginparwidth}{\hintscolumnwidth}%
+  \setlength{\marginparsep}{2\separatorcolumnwidth}%
+  \changepage{}{-\marginparwidth-\marginparsep}{}{}{}{}{}{}{}%\changepage{<textheight>}{<textwidth>}{<evensidemargin>}{<oddsidemargin>}{<columnsep>}{<topmargin>}{<headheight>}{<headsep>}{<footskip>}
+  }
+
+% commands
+\renewcommand*{\makeletterhead}{%
+  % recompute lengths (in case we are switching from letter to resume, or vice versa)
+  \leftskip=0pt% needs to be set before \recomputeletterlengths
+  \recomputeletterlengths%
+  % recipient block
+  {\addressfont%
+    {\bfseries\upshape\@recipientname}\\%
+    \@recipientaddress}\\[1em]%
+  % date
+  \@date\\[2em]%
+  % optional subject
+  \ifthenelse{\isundefined{\@subject}}{}{{\bfseries\@subject\\[2em]}}
+  % opening
+  \@opening\\[1.5em]%
+  % sender contact info
+  \if@details%
+    \hspace{0pt}%
+    \marginpar{%
+      \addressfont\textcolor{color2}{%
+        {\bfseries\@firstname~\@lastname}\@firstdetailselementfalse%
+        \ifthenelse{\isundefined{\@addressstreet}}{}{\makenewline\addresssymbol\@addressstreet%
+          \ifthenelse{\equal{\@addresscity}{}}{}{\makenewline\@addresscity}% if \addresstreet is defined, \addresscity and \addresscountry will always be defined but could be empty
+          \ifthenelse{\equal{\@addresscountry}{}}{}{\makenewline\@addresscountry}}%
+        \collectionloop{phones}{% the key holds the phone type (=symbol command prefix), the item holds the number
+          \makenewline\hbox to 1.0em{\csname\collectionloopkey phonesymbol\endcsname}~\collectionloopitem}%
+        \ifthenelse{\isundefined{\@email}}{}{\makenewline\hbox to 1.0em{\emailsymbol}~\emaillink{\@email}}%
+        \ifthenelse{\isundefined{\@homepage}}{}{\makenewline\hbox to 1.0em{\homepagesymbol}~%
+          \ifthenelse{\equal{\@homepageprotocol}{http}}{\httplink{\@homepage}}{\httpslink{\@homepage}}}%
+        \collectionloop{socials}{% the key holds the social type (=symbol command prefix), the item holds the link
+          \makenewline\hbox to 1.0em{\csname\collectionloopkey socialsymbol\endcsname}~\collectionloopitem}%
+        \ifthenelse{\isundefined{\@extrainfo}}{}{\makenewline\@extrainfo}}}%
+    % ensure no extra spacing after \makelettertitle due to a possible blank line
+    %\ignorespacesafterend% not working
+    \par\vspace{-\baselineskip}\vspace{-\parskip}\fi}
+
+
+\endinput
+
+
+%% end of file `moderncvheadiv.sty'.
diff --git a/moderncvheadv.sty b/moderncvheadv.sty
new file mode 100644 (file)
index 0000000..eaabd4a
--- /dev/null
@@ -0,0 +1,187 @@
+%% start of file `moderncvheadv.sty'.
+%% Copyright 2015-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv).
+%
+% 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{moderncvheadv}[2022-02-21 v2.3.1 modern curriculum vitae and letter header variant: 5]
+
+% details options: "details" (default) or "nodetails"
+\@initializeif{\if@details}\@detailsfalse
+\DeclareOption{details}   {\@detailstrue}
+\DeclareOption{nodetails} {\@detailsfalse}
+
+\DeclareOption*{}% avoid choking on unknown options
+\ExecuteOptions{details}
+\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
+%-------------------------------------------------------------------------------
+
+
+%-------------------------------------------------------------------------------
+%                overall head definition
+%-------------------------------------------------------------------------------
+% fonts
+\renewcommand*{\namefont}{\fontsize{34}{36}\mdseries\upshape}
+\renewcommand*{\titlefont}{\LARGE\mdseries\slshape}
+\renewcommand*{\addressfont}{\small\mdseries\slshape}
+\renewcommand*{\quotefont}{\large\slshape}
+
+% styles
+\renewcommand*{\namestyle}[1]{{\namefont\textcolor{color0}{#1}}}
+\renewcommand*{\titlestyle}[1]{{\titlefont\textcolor{color2}{#1}}}
+\renewcommand*{\addressstyle}[1]{{\addressfont\textcolor{color2}{#1}}}
+\renewcommand*{\quotestyle}[1]{{\quotefont\textcolor{color1}{#1}}}
+
+
+%-------------------------------------------------------------------------------
+%                resume head definition
+%-------------------------------------------------------------------------------
+% lengths
+\@initializelength{\quotewidth}
+\renewcommand*{\recomputecvheadlengths}{%
+  \setlength{\quotewidth}{0.65\textwidth}}
+
+% commands
+\renewcommand*{\makecvhead}{%
+  % recompute lengths (in case we are switching from letter to resume, or vice versa)
+  \recomputecvlengths%
+  % optional photo (pre-rendering)
+  \@initializebox{\makecvheadpicturebox}%
+  \savebox{\makecvheadpicturebox}{%
+    \ifthenelse{\isundefined{\@photo}}%
+    {}%
+    {%
+      \color{color1}%
+      \setlength{\fboxrule}{\@photoframewidth}%
+      \ifdim\@photoframewidth=0pt%
+        \setlength{\fboxsep}{0pt}\fi%
+      \framebox{\includegraphics[width=\@photowidth]{\@photo}}}}%
+  % rendering
+  \@makecvtitle%
+    {%
+      \raggedleft%
+      % optional photo
+      \usebox{\makecvheadpicturebox}%
+      % optional details
+      \if@details%
+        \ifthenelse{\isundefined{\@photo}}{}{\\[0.5em]}%
+        \addressfont\color{color2}%
+        \ifthenelse{\isundefined{\@addressstreet}}{}{\makenewline\addresssymbol\@addressstreet%
+          \ifthenelse{\equal{\@addresscity}{}}{}{\makenewline\@addresscity}% if \addresstreet is defined, \addresscity and \addresscountry will always be defined but could be empty
+          \ifthenelse{\equal{\@addresscountry}{}}{}{\makenewline\@addresscountry}}%
+        \ifthenelse{\isundefined{\@born}}{}{\makenewline\bornsymbol~\@born}%
+        \collectionloop{phones}{% the key holds the phone type (=symbol command prefix), the item holds the number
+          \makenewline\csname\collectionloopkey phonesymbol\endcsname~\collectionloopitem}%
+        \ifthenelse{\isundefined{\@email}}{}{\makenewline\emailsymbol~\emaillink{\@email}}%
+        \ifthenelse{\isundefined{\@homepage}}{}{\makenewline\homepagesymbol~%
+          \ifthenelse{\equal{\@homepageprotocol}{http}}{\httplink{\@homepage}}{\httpslink{\@homepage}}}%
+        \collectionloop{socials}{% the key holds the social type (=symbol command prefix), the item holds the link
+          \makenewline\csname\collectionloopkey socialsymbol\endcsname~\collectionloopitem}%
+        \ifthenelse{\isundefined{\@extrainfo}}{}{\makenewline\@extrainfo}\fi}%
+    {%
+      % name and optional title
+      \newlength{\makecvheadpictureboxskip}%
+      \setlength{\makecvheadpictureboxskip}{\totalheightof{\usebox{\makecvheadpicturebox}}}%
+      \namestyle{\@firstname\ \@lastname}%
+         \ifthenelse{\equal{\@title}{}}{
+           \ifthenelse{\isundefined{\@quote}}%
+        {}%
+        {%
+          \\[1.25em]%
+          \begin{minipage}{\quotewidth}%
+            \quotestyle{\@quote}%
+          \end{minipage}}%
+           }{%
+             \\[1.25em]%
+        \titlestyle{\@title}
+        % optional quote
+        \ifthenelse{\isundefined{\@quote}}%
+          {\vspace{2.5em}}%
+          {%
+            \\[2.5em]%
+            \begin{minipage}{\quotewidth}%
+              \quotestyle{\@quote}
+            \end{minipage}}}}%
+  \par}% to avoid weird spacing bug at the first section if no blank line is left after \makecvhead
+
+% underlying command to implement \makecvtitle, identical to \@cvitem from moderncvbodyv
+\let\standarddoublebackslash\\%
+\newcommand*{\@makecvtitle}[3][.5ex]{%
+  \arrayrulecolor{color1}%
+  \setlength\arrayrulewidth{1.2\p@}%
+  \if@aftersection\else%
+    \vspace*{-\arrayrulewidth}\fi% HACK; I don't understand where the space is coming from, nor what it's exact value is :(
+  \noindent%
+  \begin{tabular}[t]{@{}p{\hintscolumnwidth}@{\hspace{\separatorcolumnwidth}}|@{\hspace{\separatorcolumnwidth}}p{\maincolumnwidth}@{}}%
+    \@moderncvstrut{4pt}{16pt}%
+    \begin{minipage}[t]{\hintscolumnwidth}#2\end{minipage}
+      &\begin{minipage}[t]{\maincolumnwidth}#3\end{minipage}%
+      \\[#1]% the spacing needs to be inside the cell for the vertical rule to extend correctly
+  \end{tabular}%
+  \par\@aftersectionfalse\ignorespaces}
+
+
+%-------------------------------------------------------------------------------
+%                letter head definition
+%-------------------------------------------------------------------------------
+% lengths
+%\renewcommand*{\recomputeletterheadlengths}{}
+
+% commands
+\renewcommand*{\makeletterhead}{%
+  % recompute lengths (in case we are switching from letter to resume, or vice versa)
+  \recomputeletterlengths%
+  % sender contact info
+  \hfill%
+  \begin{minipage}{.5\textwidth}%
+    % optional detailed information
+    \if@details%
+      \raggedleft%
+      \addressfont\textcolor{color2}{%
+        {\bfseries\upshape\@firstname~\@lastname}\@firstdetailselementfalse%
+        % optional detailed information
+        \ifthenelse{\isundefined{\@addressstreet}}{}{\makenewline\addresssymbol\@addressstreet%
+          \ifthenelse{\equal{\@addresscity}{}}{}{\makenewline\@addresscity}% if \addresstreet is defined, \addresscity and addresscountry will always be defined but could be empty
+          \ifthenelse{\equal{\@addresscountry}{}}{}{\makenewline\@addresscountry}}%
+        \collectionloop{phones}{% the key holds the phone type (=symbol command prefix), the item holds the number
+          \makenewline\csname\collectionloopkey phonesymbol\endcsname\collectionloopitem}%
+        \ifthenelse{\isundefined{\@email}}{}{\makenewline\emailsymbol\emaillink{\@email}}%
+        \ifthenelse{\isundefined{\@homepage}}{}{\makenewline\homepagesymbol%
+          \ifthenelse{\equal{\@homepageprotocol}{http}}{\httplink{\@homepage}}{\httpslink{\@homepage}}}%
+        \ifthenelse{\isundefined{\@extrainfo}}{}{\makenewline\@extrainfo}}\fi%
+    \end{minipage}\\[2em]
+  % recipient block
+  \begin{minipage}[t]{.5\textwidth}
+    \raggedright%
+    \addressfont%
+    {\bfseries\upshape\@recipientname}\\%
+    \@recipientaddress%
+  \end{minipage}
+  % date
+  \hfill% US style
+%  \\[1em]% UK style
+  \@date\\[3em]% US informal style: "January 1, 1900"; UK formal style: "01/01/1900"
+  % optional subject
+  \ifthenelse{\isundefined{\@subject}}{}{{\bfseries\@subject\\[2em]}}
+  % opening
+  \raggedright%
+  \@opening\\[1.5em]%
+  % ensure no extra spacing after \makelettertitle due to a possible blank line
+%  \ignorespacesafterend% not working
+  \hspace{0pt}\par\vspace{-\baselineskip}\vspace{-\parskip}}
+
+
+\endinput
+
+
+%% end of file `moderncvheadv.sty'.
diff --git a/moderncvheadvi.sty b/moderncvheadvi.sty
new file mode 100644 (file)
index 0000000..e532f9a
--- /dev/null
@@ -0,0 +1,172 @@
+%% start of file `moderncvheadvi.sty'.
+%% Copyright 2015-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv).
+%
+% 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{moderncvheadvi}[2022-02-21 v2.3.1 modern curriculum vitae and letter header: 6]
+
+% details options: "details" (default) or "nodetails"
+\@initializeif{\if@details}\@detailsfalse
+\DeclareOption{details}{\@detailstrue}
+\DeclareOption{nodetails}{\@detailsfalse}
+
+% left/right options: "left" (default) or "right"
+\@initializeif{\if@left} \@leftfalse
+\DeclareOption{left}    {\@lefttrue\@rightfalse}
+\@initializeif{\if@right}\@rightfalse
+\DeclareOption{right}   {\@leftfalse\@righttrue}
+
+\DeclareOption*{}% avoid choking on unknown options
+\ExecuteOptions{details, left}
+\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
+%-------------------------------------------------------------------------------
+
+
+%-------------------------------------------------------------------------------
+%                overall head definition
+%-------------------------------------------------------------------------------
+% fonts
+\renewcommand*{\namefont}{\Huge\bfseries\upshape}
+\renewcommand*{\titlefont}{\Huge\mdseries\upshape}
+\renewcommand*{\addressfont}{\normalsize\mdseries\upshape}
+\renewcommand*{\quotefont}{\large\slshape}
+
+% styles
+\renewcommand*{\namestyle}[1]{{\namefont\textcolor{color1}{#1}}}
+\renewcommand*{\titlestyle}[1]{{\titlefont\textcolor{color2!85}{#1}}}
+\renewcommand*{\addressstyle}[1]{{\addressfont\textcolor{color2}{#1}}}
+\renewcommand*{\quotestyle}[1]{{\quotefont\textcolor{color1}{#1}}}
+
+% commands
+\@initializecommand{\makehead}{%
+  \setlength{\makeheaddetailswidth}{\textwidth}%
+  % name and title
+  \if@left\hfill\fi%
+  \namestyle{\@firstname~\@lastname}%
+  \ifthenelse{\equal{\@title}{}}{}{\titlestyle{~|~\@title}}\\[-.35em]% \isundefined doesn't work on \@title, as LaTeX itself defines \@title (before it possibly gets redefined by \title)
+  % rule
+  {\color{color1}\rule{\textwidth}{.25ex}}}
+
+%-------------------------------------------------------------------------------
+%                resume head definition
+%-------------------------------------------------------------------------------
+% lengths
+\@initializelength{\quotewidth}
+\renewcommand*{\recomputecvheadlengths}{%
+  \setlength{\quotewidth}{0.65\textwidth}}
+
+% commands
+\@initializecommand{\makeheaddetailssymbol}{%
+    {\hspace{1em}{\rmfamily\textbullet}\hspace{1em}}}% the \rmfamily is required to force Latin Modern fonts when using sans serif, as OMS/lmss/m/n is not defined and gets substituted by OMS/cmsy/m/n
+%   internal command to add an element to the footer
+%   it collects the elements in a temporary box, and checks when to flush the box
+\@initializebox{\makeheaddetailsbox}%
+\@initializebox{\makeheaddetailstempbox}%
+\@initializelength{\makeheaddetailswidth}%
+\@initializelength{\makeheaddetailsboxwidth}%
+\@initializeif{\if@firstmakeheaddetailselement}\@firstmakeheaddetailselementtrue%
+%   adds an element to the makehead, separated by makeheadsymbol
+%   usage: \addtomakehead[makeheadsymbol]{element}
+\newcommand*{\addtomakeheaddetails}[2][\makeheaddetailssymbol]{% TODO: use \@initializecommand, which requires modifying its definition to handle mandatory and optional arguments
+  \if@firstmakeheaddetailselement%
+    \savebox{\makeheaddetailstempbox}{\usebox{\makeheaddetailsbox}#2}%
+  \else%
+    \savebox{\makeheaddetailstempbox}{\usebox{\makeheaddetailsbox}#1#2}\fi%
+  \settowidth{\makeheaddetailsboxwidth}{\usebox{\makeheaddetailstempbox}}%
+  \ifnum\makeheaddetailsboxwidth<\makeheaddetailswidth%
+    \savebox{\makeheaddetailsbox}{\usebox{\makeheaddetailstempbox}}%
+    \@firstmakeheaddetailselementfalse%
+  \else%
+    \flushmakeheaddetails\\\null% \null is required as there is no box on the line after \\, so glue such as \hfill (and leaders) disappear; this is in contrast to after \par, where the next line starts with an indent box (even after \noindent)
+    \savebox{\makeheaddetailsbox}{#2}%
+    \savebox{\makeheaddetailstempbox}{#2}%
+    \settowidth{\makeheaddetailsboxwidth}{\usebox{\makeheaddetailsbox}}%
+    \@firstmakeheaddetailselementfalse\fi}
+%   internal command to flush the makehead
+\@initializecommand{\flushmakeheaddetails}{%
+  \if@right\hfill\fi%
+  \strut\usebox{\makeheaddetailsbox}%
+  \savebox{\makeheaddetailsbox}{}%
+  \savebox{\makeheaddetailstempbox}{}%
+  \setlength{\makeheaddetailsboxwidth}{0pt}}
+\renewcommand*{\makecvhead}{% TODO: use \@initializecommand, which requires modifying its definition to handle \par
+  % recompute lengths (in case we are switching from letter to resume, or vice versa)
+  \recomputecvlengths%
+  \makehead%
+  % optional detailed information
+  \if@details{%
+    \\\null%
+    \addressfont\color{color2}%
+    \ifthenelse{\isundefined{\@addressstreet}}{}{\addtomakeheaddetails{\addresssymbol\@addressstreet}%
+      \ifthenelse{\equal{\@addresscity}{}}{}{\addtomakeheaddetails[~--~]{\@addresscity}}% if \addresstreet is defined, \addresscity and \addresscountry will always be defined but could be empty
+      \ifthenelse{\equal{\@addresscountry}{}}{}{\addtomakeheaddetails[~--~]{\@addresscountry}}%
+        \flushmakeheaddetails\@firstmakeheaddetailselementtrue\\\null}%
+    \ifthenelse{\isundefined{\@born}}{}{\addtomakeheaddetails{\bornsymbol\@born}}%
+    \collectionloop{phones}{% the key holds the phone type (=symbol command prefix), the item holds the number
+      \addtomakeheaddetails{\csname\collectionloopkey phonesymbol\endcsname\collectionloopitem}}%
+    \ifthenelse{\isundefined{\@email}}{}{\addtomakeheaddetails{\emailsymbol\emaillink{\@email}}}%
+    \ifthenelse{\isundefined{\@homepage}}{}{\addtomakeheaddetails{\homepagesymbol%
+      \ifthenelse{\equal{\@homepageprotocol}{http}}{\httplink{\@homepage}}{\httpslink{\@homepage}}}}%
+    \collectionloop{socials}{% the key holds the social type (=symbol command prefix), the item holds the link
+      \addtomakeheaddetails{\csname\collectionloopkey socialsymbol\endcsname\collectionloopitem}}%
+    \ifthenelse{\isundefined{\@extrainfo}}{}{\addtomakeheaddetails{\@extrainfo}}%
+    \flushmakeheaddetails}\fi% need to force a \par after this to avoid weird spacing bug at the first section if no blank line is left after \makehead; not forcing it here because of the possible quote
+  % optional quote
+  \ifthenelse{\isundefined{\@quote}}%
+    {}%
+    {{\\[1.25em]\null\hfill%
+      \begin{minipage}{\quotewidth}%
+        \centering\quotestyle{\@quote}%
+      \end{minipage}\hfill\null}}\\[2.5em]%
+  \par}% to avoid weird spacing bug at the first section if no blank line is left after \maketitle}
+
+
+%-------------------------------------------------------------------------------
+%                letter head definition
+%-------------------------------------------------------------------------------
+% lengths
+%\renewcommand*{\recomputeletterheadlengths}{}
+
+% commands
+\renewcommand*{\makeletterhead}{%
+  % recompute lengths (in case we are switching from letter to resume, or vice versa)
+  \recomputeletterlengths%
+  % sender block
+  \makehead\\[2.5em]%
+  \par% to avoid weird spacing bug at the first section if no blank line is left after \maketitle}
+   % recipient block
+  \begin{minipage}[t]{.5\textwidth}
+    \raggedright%
+    \addressfont%
+    {\bfseries\upshape\@recipientname}\\%
+    \@recipientaddress%
+  \end{minipage}
+  % date
+  \hfill% US style
+%  \\[1em]% UK style
+  \@date\\[3em]% US informal style: "January 1, 1900"; UK formal style: "01/01/1900"
+  % optional subject
+  \ifthenelse{\isundefined{\@subject}}{}{{\bfseries\@subject\\[3em]}}
+  % opening
+  \raggedright%
+  \@opening\\[1.5em]%
+  % ensure no extra spacing after \makelettertitle due to a possible blank line
+%  \ignorespacesafterend% not working
+  \hspace{0pt}\par\vspace{-\baselineskip}\vspace{-\parskip}}
+
+
+\endinput
+
+
+%% end of file `moderncvheadvi.sty'.
diff --git a/moderncvheadvii.sty b/moderncvheadvii.sty
new file mode 100644 (file)
index 0000000..1d19b3f
--- /dev/null
@@ -0,0 +1,173 @@
+%% start of file `moderncvheadiii.sty'.
+%% Copyright 2006-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv).
+%
+% 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{moderncvheadvii}[2022-02-21 v2.3.1 modern curriculum vitae and letter header variant: 7]
+
+% details options: "details" (default) or "nodetails"
+\@initializeif{\if@details}\@detailsfalse
+\DeclareOption{details}{\@detailstrue}
+\DeclareOption{nodetails}{\@detailsfalse}
+
+\DeclareOption*{}% avoid choking on unknown options
+\ExecuteOptions{details}
+\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
+%-------------------------------------------------------------------------------
+
+
+%-------------------------------------------------------------------------------
+%                overall head definition
+%-------------------------------------------------------------------------------
+% fonts
+\renewcommand*{\namefont}{\Huge\bfseries\upshape}
+\renewcommand*{\titlefont}{\Huge\mdseries\upshape}
+\renewcommand*{\addressfont}{\normalsize\mdseries\upshape}
+\renewcommand*{\quotefont}{\large\slshape}
+
+% styles
+\renewcommand*{\namestyle}[1]{{\namefont\textcolor{color1}{#1}}}
+\renewcommand*{\titlestyle}[1]{{\titlefont\textcolor{color2!85}{#1}}}
+\renewcommand*{\addressstyle}[1]{{\addressfont\textcolor{color2}{#1}}}
+\renewcommand*{\quotestyle}[1]{{\quotefont\textcolor{color1}{#1}}}
+
+% commands
+\@initializecommand{\makeheaddetailssymbol}{%
+    {\hspace{1em}{\rmfamily\textbullet}\hspace{1em}}}% the \rmfamily is required to force Latin Modern fonts when using sans serif, as OMS/lmss/m/n is not defined and gets substituted by OMS/cmsy/m/n
+%   internal command to add an element to the footer
+%   it collects the elements in a temporary box, and checks when to flush the box
+\@initializebox{\makeheaddetailsbox}%
+\@initializebox{\makeheaddetailstempbox}%
+\@initializelength{\makeheaddetailswidth}%
+\@initializelength{\makeheaddetailsboxwidth}%
+\@initializeif{\if@firstmakeheaddetailselement}\@firstmakeheaddetailselementtrue%
+%   adds an element to the makehead, separated by makeheadsymbol
+%   usage: \addtomakehead[makeheadsymbol]{element}
+\newcommand*{\addtomakeheaddetails}[2][\makeheaddetailssymbol]{% TODO: use \@initializecommand, which requires modifying its definition to handle mandatory and optional arguments
+  \if@firstmakeheaddetailselement%
+    \savebox{\makeheaddetailstempbox}{\usebox{\makeheaddetailsbox}#2}%
+  \else%
+    \savebox{\makeheaddetailstempbox}{\usebox{\makeheaddetailsbox}#1#2}\fi%
+  \settowidth{\makeheaddetailsboxwidth}{\usebox{\makeheaddetailstempbox}}%
+  \ifnum\makeheaddetailsboxwidth<\makeheaddetailswidth%
+    \savebox{\makeheaddetailsbox}{\usebox{\makeheaddetailstempbox}}%
+    \@firstmakeheaddetailselementfalse%
+  \else%
+    \flushmakeheaddetails\\%
+    \savebox{\makeheaddetailsbox}{#2}%
+    \savebox{\makeheaddetailstempbox}{#2}%
+    \settowidth{\makeheaddetailsboxwidth}{\usebox{\makeheaddetailsbox}}%
+    \@firstmakeheaddetailselementfalse\fi}
+%   internal command to flush the makehead
+\@initializecommand{\flushmakeheaddetails}{%
+  \ifnum\makeheaddetailsboxwidth>0%
+    \strut\usebox{\makeheaddetailsbox}%
+    \savebox{\makeheaddetailsbox}{}%
+    \savebox{\makeheaddetailstempbox}{}%
+    \setlength{\makeheaddetailsboxwidth}{0pt}\fi}
+\@initializecommand{\makehead}{%
+  \setlength{\makeheaddetailswidth}{0.8\textwidth}%
+  \hfil%
+  \parbox{\makeheaddetailswidth}{%
+    \centering%
+    % name and title
+    \namestyle{\@firstname~\@lastname}%
+    %\ifthenelse{\equal{\@title}{}}{}{\titlestyle{~|~\@title}}% \isundefined doesn't work on \@title, as LaTeX itself defines \@title (before it possibly gets redefined by \title)
+    % optional detailed information
+    \if@details{%
+      \\%
+      \addressfont\color{color2}%
+      \ifthenelse{\isundefined{\@addressstreet}}{}{\addtomakeheaddetails{\addresssymbol\@addressstreet}%
+        \ifthenelse{\equal{\@addresscity}{}}{}{\addtomakeheaddetails[~--~]{\@addresscity}}% if \addresstreet is defined, \addresscity and \addresscountry will always be defined but could be empty
+        \ifthenelse{\equal{\@addresscountry}{}}{}{\addtomakeheaddetails[~--~]{\@addresscountry}}%
+        \flushmakeheaddetails\@firstmakeheaddetailselementtrue\\}%
+      \ifthenelse{\isundefined{\@born}}{}{\addtomakeheaddetails{\bornsymbol\@born}}%
+      \collectionloop{phones}{% the key holds the phone type (=symbol command prefix), the item holds the number
+        \addtomakeheaddetails{\csname\collectionloopkey phonesymbol\endcsname\collectionloopitem}}%
+      \ifthenelse{\isundefined{\@email}}{}{\addtomakeheaddetails{\emailsymbol\emaillink{\@email}}}%
+      \ifthenelse{\isundefined{\@homepage}}{}{\addtomakeheaddetails{\homepagesymbol%
+        \ifthenelse{\equal{\@homepageprotocol}{http}}{\httplink{\@homepage}}{\httpslink{\@homepage}}}}%
+      \collectionloop{socials}{% the key holds the social type (=symbol command prefix), the item holds the link
+        \addtomakeheaddetails{\csname\collectionloopkey socialsymbol\endcsname\collectionloopitem}}%
+      \ifthenelse{\isundefined{\@extrainfo}}{}{\addtomakeheaddetails{\@extrainfo}}%
+      \flushmakeheaddetails}\fi}}% need to force a \par after this to avoid weird spacing bug at the first section if no blank line is left after \makehead
+
+
+%-------------------------------------------------------------------------------
+%                resume head definition
+%-------------------------------------------------------------------------------
+% lengths
+\@initializelength{\titlewidth}
+\renewcommand*{\recomputecvheadlengths}{%
+  \setlength{\titlewidth}{0.65\textwidth}}
+% commands
+\renewcommand*{\makecvhead}{% TODO: use \@initializecommand, which requires modifying its definition to handle \par
+  % recompute lengths (in case we are switching from letter to resume, or vice versa)
+  \recomputecvlengths%
+  \makehead%
+  % optional title
+  \ifthenelse{\isundefined{\titlestyle{\@title}}}%
+    {\vspace{2.5em}}%
+    {%
+      \\[2.5em]%
+      {%
+      \centering%
+      \begin{minipage}{\titlewidth}%
+        \centering%
+        \titlestyle{\@title}%
+      \end{minipage}\\[2.5em]}}%
+  \par}% to avoid weird spacing bug at the first section if no blank line is left after \maketitle}
+
+
+%-------------------------------------------------------------------------------
+%                letter head definition
+%-------------------------------------------------------------------------------
+% lengths
+%\renewcommand*{\recomputeletterheadlengths}{}
+
+
+% commands
+\renewcommand*{\makeletterhead}{%
+  % recompute lengths (in case we are switching from letter to resume, or vice versa)
+  \recomputeletterlengths%
+  % sender contact info  
+
+  \begin{minipage}{\textwidth}%
+%    \hfill%
+    \makehead%
+  \end{minipage}\\[1em]
+  
+   % recipient block
+  \begin{minipage}[t]{.5\textwidth}
+    \raggedright%
+    \addressfont%
+    {\bfseries\upshape\@recipientname}\\%
+    \@recipientaddress%
+  \end{minipage}
+  % date
+  \hfill% US style
+%  \\[1em]% UK style
+  \@date\\[2em]% US informal style: "January 1, 1900"; UK formal style: "01/01/1900"
+  % optional subject
+  \ifthenelse{\isundefined{\@subject}}{}{{\bfseries\@subject\\[1em]}}
+  % opening
+  \raggedright%
+  \@opening\\[1.2em]%
+  % ensure no extra spacing after \makelettertitle due to a possible blank line
+%  \ignorespacesafterend% not working
+  \hspace{0pt}\par\vspace{-\baselineskip}\vspace{-\parskip}}
+
+\endinput
+
+
+%% end of file `moderncvheadiii.sty'.
diff --git a/moderncvheadvii.sty~ b/moderncvheadvii.sty~
new file mode 100644 (file)
index 0000000..5e7f246
--- /dev/null
@@ -0,0 +1,173 @@
+%% start of file `moderncvheadiii.sty'.
+%% Copyright 2006-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv).
+%
+% 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{moderncvheadvii}[2022-02-21 v2.3.1 modern curriculum vitae and letter header variant: 7]
+
+% details options: "details" (default) or "nodetails"
+\@initializeif{\if@details}\@detailsfalse
+\DeclareOption{details}{\@detailstrue}
+\DeclareOption{nodetails}{\@detailsfalse}
+
+\DeclareOption*{}% avoid choking on unknown options
+\ExecuteOptions{details}
+\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
+%-------------------------------------------------------------------------------
+
+
+%-------------------------------------------------------------------------------
+%                overall head definition
+%-------------------------------------------------------------------------------
+% fonts
+\renewcommand*{\namefont}{\Huge\bfseries\upshape}
+\renewcommand*{\titlefont}{\Huge\mdseries\upshape}
+\renewcommand*{\addressfont}{\normalsize\mdseries\upshape}
+\renewcommand*{\quotefont}{\large\slshape}
+
+% styles
+\renewcommand*{\namestyle}[1]{{\namefont\textcolor{color1}{#1}}}
+\renewcommand*{\titlestyle}[1]{{\titlefont\textcolor{color2!85}{#1}}}
+\renewcommand*{\addressstyle}[1]{{\addressfont\textcolor{color2}{#1}}}
+\renewcommand*{\quotestyle}[1]{{\quotefont\textcolor{color1}{#1}}}
+
+% commands
+\@initializecommand{\makeheaddetailssymbol}{%
+    {\hspace{1em}{\rmfamily\textbullet}\hspace{1em}}}% the \rmfamily is required to force Latin Modern fonts when using sans serif, as OMS/lmss/m/n is not defined and gets substituted by OMS/cmsy/m/n
+%   internal command to add an element to the footer
+%   it collects the elements in a temporary box, and checks when to flush the box
+\@initializebox{\makeheaddetailsbox}%
+\@initializebox{\makeheaddetailstempbox}%
+\@initializelength{\makeheaddetailswidth}%
+\@initializelength{\makeheaddetailsboxwidth}%
+\@initializeif{\if@firstmakeheaddetailselement}\@firstmakeheaddetailselementtrue%
+%   adds an element to the makehead, separated by makeheadsymbol
+%   usage: \addtomakehead[makeheadsymbol]{element}
+\newcommand*{\addtomakeheaddetails}[2][\makeheaddetailssymbol]{% TODO: use \@initializecommand, which requires modifying its definition to handle mandatory and optional arguments
+  \if@firstmakeheaddetailselement%
+    \savebox{\makeheaddetailstempbox}{\usebox{\makeheaddetailsbox}#2}%
+  \else%
+    \savebox{\makeheaddetailstempbox}{\usebox{\makeheaddetailsbox}#1#2}\fi%
+  \settowidth{\makeheaddetailsboxwidth}{\usebox{\makeheaddetailstempbox}}%
+  \ifnum\makeheaddetailsboxwidth<\makeheaddetailswidth%
+    \savebox{\makeheaddetailsbox}{\usebox{\makeheaddetailstempbox}}%
+    \@firstmakeheaddetailselementfalse%
+  \else%
+    \flushmakeheaddetails\\%
+    \savebox{\makeheaddetailsbox}{#2}%
+    \savebox{\makeheaddetailstempbox}{#2}%
+    \settowidth{\makeheaddetailsboxwidth}{\usebox{\makeheaddetailsbox}}%
+    \@firstmakeheaddetailselementfalse\fi}
+%   internal command to flush the makehead
+\@initializecommand{\flushmakeheaddetails}{%
+  \ifnum\makeheaddetailsboxwidth>0%
+    \strut\usebox{\makeheaddetailsbox}%
+    \savebox{\makeheaddetailsbox}{}%
+    \savebox{\makeheaddetailstempbox}{}%
+    \setlength{\makeheaddetailsboxwidth}{0pt}\fi}
+\@initializecommand{\makehead}{%
+  \setlength{\makeheaddetailswidth}{0.8\textwidth}%
+  \hfil%
+  \parbox{\makeheaddetailswidth}{%
+    \centering%
+    % name and title
+    \namestyle{\@firstname~\@lastname}%
+    %\ifthenelse{\equal{\@title}{}}{}{\titlestyle{~|~\@title}}% \isundefined doesn't work on \@title, as LaTeX itself defines \@title (before it possibly gets redefined by \title)
+    % optional detailed information
+    \if@details{%
+      \\%
+      \addressfont\color{color2}%
+      \ifthenelse{\isundefined{\@addressstreet}}{}{\addtomakeheaddetails{\addresssymbol\@addressstreet}%
+        \ifthenelse{\equal{\@addresscity}{}}{}{\addtomakeheaddetails[~--~]{\@addresscity}}% if \addresstreet is defined, \addresscity and \addresscountry will always be defined but could be empty
+        \ifthenelse{\equal{\@addresscountry}{}}{}{\addtomakeheaddetails[~--~]{\@addresscountry}}%
+        \flushmakeheaddetails\@firstmakeheaddetailselementtrue\\}%
+      \ifthenelse{\isundefined{\@born}}{}{\addtomakeheaddetails{\bornsymbol\@born}}%
+      \collectionloop{phones}{% the key holds the phone type (=symbol command prefix), the item holds the number
+        \addtomakeheaddetails{\csname\collectionloopkey phonesymbol\endcsname\collectionloopitem}}%
+      \ifthenelse{\isundefined{\@email}}{}{\addtomakeheaddetails{\emailsymbol\emaillink{\@email}}}%
+      \ifthenelse{\isundefined{\@homepage}}{}{\addtomakeheaddetails{\homepagesymbol%
+        \ifthenelse{\equal{\@homepageprotocol}{http}}{\httplink{\@homepage}}{\httpslink{\@homepage}}}}%
+      \collectionloop{socials}{% the key holds the social type (=symbol command prefix), the item holds the link
+        \addtomakeheaddetails{\csname\collectionloopkey socialsymbol\endcsname\collectionloopitem}}%
+      \ifthenelse{\isundefined{\@extrainfo}}{}{\addtomakeheaddetails{\@extrainfo}}%
+      \flushmakeheaddetails}\fi}}% need to force a \par after this to avoid weird spacing bug at the first section if no blank line is left after \makehead
+
+
+%-------------------------------------------------------------------------------
+%                resume head definition
+%-------------------------------------------------------------------------------
+% lengths
+\@initializelength{\titlewidth}
+\renewcommand*{\recomputecvheadlengths}{%
+  \setlength{\titlewidth}{0.65\textwidth}}
+% commands
+\renewcommand*{\makecvhead}{% TODO: use \@initializecommand, which requires modifying its definition to handle \par
+  % recompute lengths (in case we are switching from letter to resume, or vice versa)
+  \recomputecvlengths%
+  \makehead%
+  % optional title
+  \ifthenelse{\isundefined{\titlestyle{\@title}}}%
+    {\vspace{2.5em}}%
+    {%
+      \\[2.5em]%
+      {%
+      \centering%
+      \begin{minipage}{\titlewidth}%
+        \centering%
+        \titlestyle{\@title}%
+      \end{minipage}\\[2.5em]}}%
+  \par}% to avoid weird spacing bug at the first section if no blank line is left after \maketitle}
+
+
+%-------------------------------------------------------------------------------
+%                letter head definition
+%-------------------------------------------------------------------------------
+% lengths
+%\renewcommand*{\recomputeletterheadlengths}{}
+
+
+% commands
+\renewcommand*{\makeletterhead}{%
+  % recompute lengths (in case we are switching from letter to resume, or vice versa)
+  \recomputeletterlengths%
+  % sender contact info  
+
+  \begin{minipage}{\textwidth}%
+%    \hfill%
+    \makehead%
+  \end{minipage}\\[1em]
+  
+   % recipient block
+  \begin{minipage}[t]{.5\textwidth}
+    \raggedright%
+    \addressfont%
+    {\bfseries\upshape\@recipientname}\\%
+    \@recipientaddress%
+  \end{minipage}
+  % date
+  \hfill% US style
+%  \\[1em]% UK style
+  \@date\\[2em]% US informal style: "January 1, 1900"; UK formal style: "01/01/1900"
+  % optional subject
+  \ifthenelse{\isundefined{\@subject}}{}{{\bfseries\@subject\\[1em]}}
+  % opening
+  \raggedright%
+  \@opening\\[1.5em]%
+  % ensure no extra spacing after \makelettertitle due to a possible blank line
+%  \ignorespacesafterend% not working
+  \hspace{0pt}\par\vspace{-\baselineskip}\vspace{-\parskip}}
+
+\endinput
+
+
+%% end of file `moderncvheadiii.sty'.
diff --git a/moderncviconsacademic.sty b/moderncviconsacademic.sty
new file mode 100644 (file)
index 0000000..79f8ec9
--- /dev/null
@@ -0,0 +1,64 @@
+%% start of file `moderncviconsacademic.sty'.
+%% Copyright 2013-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv).
+%
+% 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{moderncviconsacademic}[2022-02-21 v2.3.1 modern curriculum vitae icons: academicons]
+
+
+%-------------------------------------------------------------------------------
+%                required packages
+%-------------------------------------------------------------------------------
+% Package for academic icons
+\RequirePackage{academicons}
+\RequirePackage{xcolor}
+
+%-------------------------------------------------------------------------------
+%                set colors
+%-------------------------------------------------------------------------------
+\input{commons/colors}
+
+\providecolor{orcid}{named}{default-socialicon-color}
+\providecolor{researchgate}{named}{default-socialicon-color}
+\providecolor{researcherid}{named}{default-socialicon-color}
+\providecolor{googlescholar}{named}{default-socialicon-color}
+
+%-------------------------------------------------------------------------------
+%                all symbols described in moderncv.cls
+%-------------------------------------------------------------------------------
+%\newcommand*{\listitemsymbol}           {\labelitemi~}
+%\newcommand*{\addresssymbol}            {}
+%\newcommand*{\bornsymbol}               {}
+%\newcommand*{\mobilephonesymbol}        {}
+%\newcommand*{\fixedphonesymbol}         {}
+%\newcommand*{\faxphonesymbol}           {}
+%\newcommand*{\emailsymbol}              {}
+%\newcommand*{\homepagesymbol}           {}
+%\newcommand*{\linkedinsocialsymbol}     {}
+%\newcommand*{\xingsocialsymbol}         {}
+%\newcommand*{\twittersocialsymbol}      {}
+%\newcommand*{\githubsocialsymbol}       {}
+%\newcommand*{\gitlabsocialsymbol}       {}
+%\newcommand*{\stackoverflowsocialsymbol}{}
+%\newcommand*{\bitbucketsocialsymbol}    {}
+%\newcommand*{\skypesocialsymbol}        {}
+\renewcommand*{\orcidsocialsymbol}        {{\color{orcid}\small\aiOrcid}~}
+\renewcommand*{\researchgatesocialsymbol} {{\color{researchgate}\small\aiResearchGateSquare}~} % alternative: \aiResearchGate
+\renewcommand*{\researcheridsocialsymbol} {{\color{researcherid}\small\aiResearcherIDSquare}~}       % alternative: \aiResearcherID
+\renewcommand*{\googlescholarsocialsymbol}{{\color{googlescholar}\raisebox{-1pt}{\large\aiGoogleScholar}}~}
+%\newcommand*{\telegramsocialsymbol}     {}
+%\newcommand*{\whatsappsocialsymbol}     {}
+%\newcommand*{\matrixsocialsymbol}       {}
+%\newcommand*{\signalsocialsymbol}       {}
+
+
+\endinput
+
+%% end of file `moderncviconsacademic.sty'.
diff --git a/moderncviconsawesome.sty b/moderncviconsawesome.sty
new file mode 100644 (file)
index 0000000..597afc4
--- /dev/null
@@ -0,0 +1,106 @@
+%% start of file `moderncviconsawesome.sty'.
+%% Copyright 2013-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv).
+%
+% 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{moderncviconsawesome}[2022-02-21 v2.3.1 modern curriculum vitae icons: awesome]
+
+%-------------------------------------------------------------------------------
+%                required packages
+%-------------------------------------------------------------------------------
+% Font Awesome font
+\RequirePackage{fontawesome5}
+\RequirePackage{xcolor}
+
+%-------------------------------------------------------------------------------
+%                set colors
+%-------------------------------------------------------------------------------
+\input{commons/colors}
+
+\providecolor{address}{named}{default-socialicon-color}
+\providecolor{mobilephone}{named}{default-socialicon-color}
+\providecolor{fixedphone}{named}{default-socialicon-color}
+\providecolor{faxphone}{named}{default-socialicon-color}
+\providecolor{email}{named}{default-socialicon-color}
+\providecolor{homepage}{named}{default-socialicon-color}
+\providecolor{googlescholar}{named}{default-socialicon-color}
+\providecolor{linkedin}{named}{default-socialicon-color}
+\providecolor{xing}{named}{default-socialicon-color}
+\providecolor{twitter}{named}{default-socialicon-color}
+\providecolor{mastodon}{named}{default-socialicon-color}
+\providecolor{github}{named}{default-socialicon-color}
+\providecolor{gitlab}{named}{default-socialicon-color}
+\providecolor{stackoverflow}{named}{default-socialicon-color}
+\providecolor{bitbucket}{named}{default-socialicon-color}
+\providecolor{skype}{named}{default-socialicon-color}
+\providecolor{orcid}{named}{default-socialicon-color}
+\providecolor{researchgate}{named}{default-socialicon-color}
+\providecolor{telegram}{named}{default-socialicon-color}
+\providecolor{whatsapp}{named}{default-socialicon-color}
+\providecolor{discord}{named}{default-socialicon-color}
+\providecolor{twitch}{named}{default-socialicon-color}
+\providecolor{youtube}{named}{default-socialicon-color}
+\providecolor{tiktok}{named}{default-socialicon-color}
+\providecolor{instagram}{named}{default-socialicon-color}
+\providecolor{soundcloud}{named}{default-socialicon-color}
+\providecolor{steam}{named}{default-socialicon-color}
+\providecolor{xbox}{named}{default-socialicon-color}
+\providecolor{playstation}{named}{default-socialicon-color}
+\providecolor{battlenet}{named}{default-socialicon-color}
+\providecolor{born}{named}{default-socialicon-color}
+
+%-------------------------------------------------------------------------------
+%                all symbols described in moderncv.cls
+%-------------------------------------------------------------------------------
+\renewcommand*{\labelitemi}          {\strut\textcolor{color1}{\tiny\faCircle[regular]}} % alternative: \faCircle (solid style)
+%\renewcommand*{\labelitemii}         {\strut\textcolor{color1}{\large\bfseries-}}            % no change from default in moderncv.cls
+%\renewcommand*{\labelitemiii}        {\strut\textcolor{color1}{\rmfamily\textperiodcentered}}% no change from default in moderncv.cls
+%\renewcommand*{\labelitemiv}         {\labelitemiii}                                         % no change from default in moderncv.cls
+
+
+%\renewcommand*{\addresssymbol}            {}
+\renewcommand*{\mobilephonesymbol}        {{\color{mobilephone}\small\faMobile*}~}            % alternative: \faMobile (solid style)
+\renewcommand*{\fixedphonesymbol}         {{\color{fixedphone}\small\faPhone*}~}             % alternative: \faPhone (reversed)
+\renewcommand*{\faxphonesymbol}           {{\color{faxphone}\small\faFax}~}                % alternative: \faPrint
+\renewcommand*{\emailsymbol}              {{\color{email}\small\faEnvelope[regular]}~}  % alternative: \faInbox, \faEnvelope (solid style)
+\renewcommand*{\homepagesymbol}           {{\color{homepage}\small\faGlobeAmericas}~}      % alternative: \faHome, \faGlobe, \faGlobeEurope, \faGlobeAfrica, \faGlobeAsia
+\renewcommand*{\linkedinsocialsymbol}     {{\color{linkedin}\small\faLinkedinIn}~}         % alternative: \faLinkedin
+\renewcommand*{\xingsocialsymbol}         {{\color{xing}\small\faXing}~}               % alternative: \faXingSquare
+\renewcommand*{\twittersocialsymbol}      {{\color{twitter}\small\faTwitter}~}            % alternative: \faTwitterSquare
+\renewcommand*{\mastodonsocialsymbol}     {{\color{mastodon}\small\faMastodon}~}
+\renewcommand*{\githubsocialsymbol}       {{\color{github}\small\faGithub}~}             % alternative: \faGithubSquare, \faGithub*
+\renewcommand*{\gitlabsocialsymbol}       {{\color{gitlab}\small\faGitlab}~}
+\renewcommand*{\stackoverflowsocialsymbol}{{\color{stackoverflow}\small\faStackOverflow}~}
+\renewcommand*{\bitbucketsocialsymbol}    {{\color{bitbucket}\small\faBitbucket}~}
+\renewcommand*{\skypesocialsymbol}        {{\color{skype}\small\faSkype}~}
+\renewcommand*{\orcidsocialsymbol}        {{\color{orcid}\small\faOrcid}~}
+\renewcommand*{\researchgatesocialsymbol} {{\color{researchgate}\small\faResearchgate}~}
+%\renewcommand*{\researcheridsocialsymbol} {}
+%\renewcommand*{\googlescholarsocialsymbol}{}
+\renewcommand*{\telegramsocialsymbol}     {{\color{telegram}\small\faTelegram}~}
+\renewcommand*{\whatsappsocialsymbol}     {{\color{whatsapp}\small\faWhatsapp}~}
+\renewcommand*{\discordsocialsymbol}      {{\color{discord}\small\faDiscord}~}
+\renewcommand*{\twitchsocialsymbol}       {{\color{twitch}\small\faTwitch}~}
+\renewcommand*{\youtubesocialsymbol}      {{\color{youtube}\small\faYoutube}~}
+\renewcommand*{\tiktoksocialsymbol}       {{\color{tiktok}\small\faTiktok}~}
+\renewcommand*{\instagramsocialsymbol}    {{\color{instagram}\small\faInstagram}~}
+\renewcommand*{\soundcloudsocialsymbol}   {{\color{soundcloud}\small\faSoundcloud}~}
+\renewcommand*{\steamsocialsymbol}        {{\color{steam}\small\faSteam}~}
+\renewcommand*{\xboxsocialsymbol}         {{\color{xbox}\small\faXbox}~}
+\renewcommand*{\playstationsocialsymbol}  {{\color{playstation}\small\faPlaystation}~}
+\renewcommand*{\battlenetsocialsymbol}    {{\color{battlenet}\small\faBattleNet}~}
+%\renewcommand*{\signalsocialsymbol}       {}
+%\renewcommand*{\matrixsocialsymbol}       {}
+\renewcommand*{\bornsymbol}               {{\color{born}\small\faAsterisk}~}           % alternative: \faBabyCarriage
+
+\endinput
+
+
+%% end of file `moderncviconsawesome.sty'.
diff --git a/moderncviconsletters.sty b/moderncviconsletters.sty
new file mode 100644 (file)
index 0000000..a25b03f
--- /dev/null
@@ -0,0 +1,66 @@
+%% start of file `moderncviconsletters.sty'.
+%% Copyright 2013-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv).
+%
+% 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{moderncviconsletters}[2022-02-21 v2.3.1 modern curriculum vitae icons: letter]
+
+%-------------------------------------------------------------------------------
+%                symbols definition
+%-------------------------------------------------------------------------------
+\newcommand*{\marvosymbol}[1]{{\fontfamily{mvs}\fontencoding{U}\fontseries{m}\fontshape{n}\selectfont\char#1}}
+
+\renewcommand*{\labelitemi}          {\strut\textcolor{color1}{\marvosymbol{123}}}            % equivalent to \Neutral from marvosym package; alternative: \fontencoding{U}\fontfamily{ding}\selectfont\tiny\symbol{'102}
+%\renewcommand*{\labelitemii}         {\strut\textcolor{color1}{\large\bfseries-}}            % no change from default in moderncv.cls
+%\renewcommand*{\labelitemiii}        {\strut\textcolor{color1}{\rmfamily\textperiodcentered}}% no change from default in moderncv.cls
+%\renewcommand*{\labelitemiv}         {\labelitemiii}                                         % no change from default in moderncv.cls
+
+\renewcommand*{\addresssymbol}            {}
+\renewcommand*{\mobilephonesymbol}        {\textbf{M}~}
+\renewcommand*{\fixedphonesymbol}         {\textbf{T}~}
+\renewcommand*{\faxphonesymbol}           {\textbf{F}~}
+\renewcommand*{\emailsymbol}              {\textbf{E}~}
+\renewcommand*{\homepagesymbol}           {\textbf{W}~}
+\renewcommand*{\linkedinsocialsymbol}     {\textbf{in}~}
+\renewcommand*{\xingsocialsymbol}         {\textbf{xi}~}
+\renewcommand*{\twittersocialsymbol}      {\textbf{tw}~}
+\renewcommand*{\mastodonsocialsymbol}     {\textbf{ms}~}
+\renewcommand*{\githubsocialsymbol}       {\textbf{gh}~}
+\renewcommand*{\gitlabsocialsymbol}       {\textbf{gl}~}
+\renewcommand*{\stackoverflowsocialsymbol}{\textbf{so}~}
+\renewcommand*{\bitbucketsocialsymbol}    {\textbf{bb}~}
+\renewcommand*{\skypesocialsymbol}        {\textbf{sk}~}
+\renewcommand*{\orcidsocialsymbol}        {\textbf{orcid}~}
+\renewcommand*{\researchgatesocialsymbol} {\textbf{rg}~}
+\renewcommand*{\researcheridsocialsymbol} {\textbf{ri}~}
+\renewcommand*{\telegramsocialsymbol}     {\textbf{tg}~}
+\renewcommand*{\whatsappsocialsymbol}     {\textbf{wa}~}
+\renewcommand*{\signalsocialsymbol}       {\textbf{si}~}
+\renewcommand*{\matrixsocialsymbol}       {\textbf{ma}~}
+\renewcommand*{\googlescholarsocialsymbol}{\textbf{gs}~}
+\renewcommand*{\bornsymbol}               {\textbf{B}~}
+\renewcommand*{\codebergsocialsymbol}     {\textbf{cb}~}
+\renewcommand*{\twitchsocialsymbol}       {\textbf{ttv}~}
+\renewcommand*{\youtubesocialsymbol}      {\textbf{yt}~}
+\renewcommand*{\tiktoksocialsymbol}       {\textbf{tok}~}
+\renewcommand*{\instagramsocialsymbol}    {\textbf{insta}~}
+\renewcommand*{\soundcloudsocialsymbol}   {\textbf{sc}~}
+\renewcommand*{\steamsocialsymbol}        {\textbf{st}~}
+\renewcommand*{\xboxsocialsymbol}         {\textbf{xb}~}
+\renewcommand*{\playstationsocialsymbol}  {\textbf{psn}~}
+\renewcommand*{\battlenetsocialsymbol}    {\textbf{bn}~}
+
+\renewcommand*{\listitemsymbol}      {\labelitemi~}
+
+
+\endinput
+
+
+%% end of file `moderncviconsletters.sty'.
diff --git a/moderncviconsmarvosym.sty b/moderncviconsmarvosym.sty
new file mode 100644 (file)
index 0000000..0a1d8f1
--- /dev/null
@@ -0,0 +1,31 @@
+%% start of file `moderncviconsmarvosym.sty'.
+%% Copyright 2013-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv).
+%
+% 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{moderncviconsmarvosym}[2022-02-21 v2.3.1 modern curriculum vitae icons: marvosym]
+
+%-------------------------------------------------------------------------------
+%                all symbols described in moderncv.cls
+%-------------------------------------------------------------------------------
+\newcommand*{\marvosymbol}[1]{{\fontfamily{mvs}\fontencoding{U}\fontseries{m}\fontshape{n}\selectfont\char#1}}
+
+\renewcommand*{\labelitemi}          {\strut\textcolor{color1}{\marvosymbol{123}}}            % equivalent to \Neutral from marvosym package; alternative: \fontencoding{U}\fontfamily{ding}\selectfont\tiny\symbol{'102}
+
+\renewcommand*{\mobilephonesymbol}   {\marvosymbol{72}~}
+\renewcommand*{\fixedphonesymbol}    {\marvosymbol{84}~}
+\renewcommand*{\faxphonesymbol}      {\marvosymbol{117}~}
+\renewcommand*{\emailsymbol}         {\marvosymbol{66}~}
+\renewcommand*{\homepagesymbol}      {{\Large\marvosymbol{205}}~}
+
+\endinput
+
+
+%% end of file `moderncviconsmarvosym.sty'.
diff --git a/moderncviconssymbols.sty b/moderncviconssymbols.sty
new file mode 100644 (file)
index 0000000..2124132
--- /dev/null
@@ -0,0 +1,33 @@
+%% start of file `moderncviconssymbols.sty'.
+%% Copyright 2013-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv).
+%
+% 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{moderncviconssymbols}[2021-12-12 v2.2.0 modern curriculum vitae icons selector]
+
+
+\ifxetexorluatex
+  \RequirePackage{moderncviconsawesome}
+  \RequirePackage{moderncviconsacademic}
+\else
+  \typeout{^^Jmoderncv: academicons requires XeTeX/LuaTeX to work. Using alternatives.^^J}
+  \ifpdftex
+    \RequirePackage{moderncviconsawesome}
+  \else
+    \RequirePackage{moderncviconsmarvosym}
+  \fi
+\fi
+
+% Define symbols that are not defined at this level
+\RequirePackage{moderncviconstikz}
+
+\endinput
+
+%% end of file `moderncviconssymbols.sty'.
diff --git a/moderncviconstikz.sty b/moderncviconstikz.sty
new file mode 100644 (file)
index 0000000..a2101d7
--- /dev/null
@@ -0,0 +1,464 @@
+%% start of file `moderncviconstikz.sty'.
+%% Copyright 2013-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv).
+%
+% 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{moderncviconstikz}[2022-02-21 v2.3.1 modern curriculum vitae and letter icons: tickz]
+
+
+%-------------------------------------------------------------------------------
+%                required packages
+%-------------------------------------------------------------------------------
+\RequirePackage{tikz}
+\RequirePackage{etoolbox}
+
+
+%-------------------------------------------------------------------------------
+%                all symbols described in moderncv.cls
+%                only redefine symbols that are not defined at this level
+%-------------------------------------------------------------------------------
+\ifdefempty{\linkedinsocialsymbol} {
+  \renewcommand*{\linkedinsocialsymbol} {
+    \protect\raisebox{-0.165em}{
+    \protect\begin{tikzpicture}[x=0.08em, y=0.08em, xscale=0.25, yscale=-0.25, inner sep=0pt, outer sep=0pt]
+      \protect\begin{scope}[cm={{0.60,0.0,0.0,0.60,(346.39,123.07)}}]
+        \protect\path[fill=color2]
+          (381,202) -- (434,202) .. controls (439,202) and (442,205) ..
+          (442,210) -- (442,264) .. controls (442,268) and (439,272) ..
+          (434,272) -- (381,272) .. controls (376,272) and (372,268) ..
+          (372,264) -- (372,210) .. controls (372,205) and (376,202) ..
+          (381,202) -- cycle;
+        \protect\begin{scope}[xscale=0.98, yscale=1.02, fill=white]
+          \protect\path[fill=white]
+            (403,253) -- (403,224) -- (394,224) -- (394,253) --
+            cycle(398,211) .. controls (397,211) and (395,212) ..
+            (395,213) .. controls (394,213) and (393,215) ..
+            (393,216) .. controls (393,217) and (394,218) ..
+            (395,219) .. controls (395,220) and (397,220) ..
+            (398,220) .. controls (400,220) and (401,220) ..
+            (402,219) .. controls (402,218) and (403,217) ..
+            (403,216) .. controls (403,215) and (402,213) ..
+            (402,213) .. controls (401,212) and (400,211) ..
+            (398,211) -- cycle;
+          \protect\path[fill=white]
+            (410,253) -- (419,253) --
+            (419,236) .. controls (419,236) and (419,235) ..
+            (419,235) .. controls (419,235) and (419,234) ..
+            (419,234) .. controls (419,233) and (420,232) ..
+            (421,232) .. controls (422,231) and (423,231) ..
+            (424,231) .. controls (425,231) and (427,231) ..
+            (427,232) .. controls (428,234) and (428,235) ..
+            (428,237) -- (428,253) -- (437,253) --
+            (437,236) .. controls (437,232) and (436,228) ..
+            (434,226) .. controls (433,224) and (430,223) ..
+            (427,223) .. controls (425,223) and (423,224) ..
+            (421,225) .. controls (420,226) and (419,227) ..
+            (418,228) -- (418,228) -- (417,224) --
+            (410,224) .. controls (410,225) and (410,227) ..
+            (410,228) .. controls (410,230) and (410,231) ..
+            (410,233) -- cycle;
+        \protect\end{scope}
+      \protect\end{scope}
+    \protect\end{tikzpicture}}
+  ~}
+}{}\par
+
+\ifdefempty{\twittersocialsymbol} {
+  \renewcommand*{\twittersocialsymbol} {
+    \protect\raisebox{0em}{%
+    \protect\begin{tikzpicture}[x=0.08em, y=0.08em, xscale=0.005, yscale=-0.005, inner sep=0pt, outer sep=0pt]
+      \protect\path[fill=color2]
+        (2000, 192) .. controls (1926, 225) and (1847, 247) ..
+        (1764, 257) .. controls (1849, 206) and (1914, 126) ..
+        (1945,  30) .. controls (1865,  77) and (1778, 111) ..
+        (1684, 130) .. controls (1609,  50) and (1503,   0) ..
+        (1385,   0) .. controls (1158,   0) and ( 974, 184) ..
+        ( 974, 410) .. controls ( 974, 442) and ( 978, 474) ..
+        ( 985, 504) .. controls ( 644, 487) and ( 342, 323) ..
+        ( 139,  75) .. controls ( 104, 136) and (  84, 206) ..
+        (  84, 281) .. controls (  84, 424) and ( 156, 549) ..
+        ( 266, 623) .. controls ( 199, 621) and ( 136, 602) ..
+        (  80, 572) .. controls (  80, 573) and (  80, 575) ..
+        (  80, 577) .. controls (  80, 776) and ( 222, 941) ..
+        ( 409, 979) .. controls ( 375, 988) and ( 339, 993) ..
+        ( 301, 993) .. controls ( 275, 993) and ( 249, 991) ..
+        ( 224, 986) .. controls ( 276,1149) and ( 428,1268) ..
+        ( 607,1271) .. controls ( 467,1381) and ( 290,1447) ..
+        (  98,1447) .. controls (  65,1447) and (  32,1445) ..
+        (   0,1441) .. controls ( 182,1557) and ( 397,1625) ..
+        ( 629,1625) .. controls (1384,1625) and (1796,1000) ..
+        (1796, 458) .. controls (1796, 440) and (1796, 422) ..
+        (1795, 405) .. controls (1875, 347) and (1945, 275) ..
+        (2000, 192);
+    \protect\end{tikzpicture}}
+  ~}
+}{}\par
+
+\ifdefempty{\githubsocialsymbol} {
+  \renewcommand*{\githubsocialsymbol} {
+    \protect\raisebox{-0.15em} {
+    \protect\begin{tikzpicture}[x=0.08em, y=0.08em, xscale=0.25, yscale=-0.25, inner sep=0pt, outer sep=0pt]
+      \protect\begin{scope}[shift={(507,387)}]
+        \protect\path[fill=color2]
+          (117, 60) .. controls (117, 71) and (108, 81) ..
+          ( 96, 81) .. controls ( 85, 81) and ( 75, 71) ..
+          ( 75, 60) .. controls ( 75, 48) and ( 85, 39) ..
+          ( 96, 39) .. controls (108, 39) and (117, 48) ..
+          (117, 60) -- cycle;
+        \protect\path[cm={{0.88,0.0,0.0,0.88,(11.10,6.89)}}, fill=white]
+          (117, 60) .. controls (117, 71) and (108, 81) ..
+          ( 96, 81) .. controls ( 85, 81) and ( 75, 71) ..
+          ( 75, 60) .. controls ( 75, 48) and ( 85, 39) ..
+          ( 96, 39) .. controls (108, 39) and (117, 48) ..
+          (117, 60) -- cycle;
+        \protect\path[fill=color2, nonzero rule]
+          (103, 45) .. controls (103, 45) and (101, 46) ..
+          (101, 47) -- (100, 47) --
+          ( 99, 47) .. controls ( 99, 47) and ( 98, 47) ..
+          ( 97, 47) .. controls ( 94, 47) and ( 93, 47) ..
+          ( 92, 47) -- ( 92, 47) --
+          ( 91, 47) .. controls ( 90, 46) and ( 88, 45) ..
+          ( 88, 45) .. controls ( 88, 45) and ( 88, 45) ..
+          ( 87, 45) .. controls ( 87, 45) and ( 87, 45) ..
+          ( 87, 45) .. controls ( 86, 46) and ( 86, 48) ..
+          ( 86, 49) -- ( 87, 50) --
+          ( 86, 51) .. controls ( 85, 51) and ( 85, 52) ..
+          ( 85, 53) .. controls ( 85, 54) and ( 85, 57) ..
+          ( 85, 58) .. controls ( 85, 58) and ( 85, 58) ..
+          ( 82, 59) .. controls ( 79, 59) and ( 77, 59) ..
+          ( 77, 59) .. controls ( 77, 59) and ( 77, 59) ..
+          ( 78, 59) .. controls ( 80, 59) and ( 83, 59) ..
+          ( 85, 59) .. controls ( 85, 59) and ( 85, 59) ..
+          ( 85, 59) .. controls ( 86, 59) and ( 86, 59) ..
+          ( 86, 59) .. controls ( 86, 59) and ( 85, 59) ..
+          ( 84, 59) .. controls ( 82, 60) and ( 80, 60) ..
+          ( 79, 60) .. controls ( 78, 61) and ( 77, 61) ..
+          ( 77, 61) .. controls ( 77, 61) and ( 78, 61) ..
+          ( 79, 61) .. controls ( 81, 60) and ( 83, 60) ..
+          ( 85, 60) .. controls ( 86, 60) and ( 86, 60) ..
+          ( 86, 60) .. controls ( 86, 60) and ( 87, 61) ..
+          ( 88, 62) .. controls ( 89, 63) and ( 90, 63) ..
+          ( 92, 63) .. controls ( 92, 63) and ( 93, 64) ..
+          ( 93, 64) .. controls ( 93, 64) and ( 93, 64) ..
+          ( 93, 64) .. controls ( 92, 64) and ( 92, 65) ..
+          ( 92, 65) .. controls ( 92, 66) and ( 90, 66) ..
+          ( 89, 66) .. controls ( 88, 66) and ( 88, 66) ..
+          ( 87, 65) .. controls ( 87, 64) and ( 86, 63) ..
+          ( 86, 63) .. controls ( 85, 63) and ( 84, 63) ..
+          ( 84, 63) .. controls ( 84, 63) and ( 84, 63) ..
+          ( 84, 63) .. controls ( 85, 64) and ( 86, 65) ..
+          ( 86, 66) .. controls ( 87, 67) and ( 87, 68) ..
+          ( 88, 68) .. controls ( 89, 68) and ( 89, 68) ..
+          ( 90, 68) -- ( 92, 68) -- ( 92, 70) -- ( 92, 72) --
+          ( 91, 72) .. controls ( 91, 72) and ( 91, 73) ..
+          ( 91, 73) .. controls ( 90, 73) and ( 90, 73) ..
+          ( 91, 73) .. controls ( 92, 73) and ( 92, 73) ..
+          ( 92, 73) .. controls ( 93, 73) and ( 93, 73) ..
+          ( 93, 70) .. controls ( 93, 67) and ( 93, 67) ..
+          ( 94, 66) -- ( 94, 66) --
+          ( 94, 69) .. controls ( 94, 71) and ( 94, 73) ..
+          ( 94, 73) .. controls ( 94, 73) and ( 94, 73) ..
+          ( 93, 74) .. controls ( 93, 74) and ( 93, 74) ..
+          ( 93, 74) .. controls ( 93, 74) and ( 93, 74) ..
+          ( 94, 74) .. controls ( 94, 74) and ( 95, 74) ..
+          ( 96, 73) .. controls ( 96, 72) and ( 96, 71) ..
+          ( 96, 68) -- ( 96, 66) -- ( 96, 66) --
+          ( 96, 69) .. controls ( 96, 72) and ( 96, 72) ..
+          ( 97, 73) .. controls ( 97, 74) and ( 99, 74) ..
+          ( 99, 74) .. controls ( 99, 74) and ( 99, 74) ..
+          ( 99, 73) .. controls ( 99, 73) and ( 98, 73) ..
+          ( 98, 72) .. controls ( 98, 72) and ( 98, 66) ..
+          ( 98, 66) .. controls ( 98, 66) and ( 99, 66) ..
+          ( 99, 66) .. controls ( 99, 67) and ( 99, 67) ..
+          ( 99, 69) .. controls ( 99, 71) and ( 99, 72) ..
+          ( 99, 72) .. controls ( 99, 73) and (100, 73) ..
+          (100, 73) .. controls (101, 73) and (101, 73) ..
+          (101, 73) .. controls (102, 73) and (102, 73) ..
+          (102, 73) .. controls (101, 72) and (101, 72) ..
+          (101, 69) .. controls (101, 66) and (101, 65) ..
+          (100, 65) .. controls (100, 64) and (100, 64) ..
+          (100, 64) -- ( 99, 64) --
+          (100, 63) .. controls (101, 63) and (102, 63) ..
+          (103, 63) .. controls (104, 62) and (106, 61) ..
+          (106, 60) -- (106, 60) --
+          (107, 60) .. controls (109, 60) and (113, 60) ..
+          (115, 61) .. controls (115, 61) and (115, 61) ..
+          (115, 61) .. controls (115, 60) and (111, 60) ..
+          (108, 59) .. controls (107, 59) and (107, 59) ..
+          (107, 59) .. controls (107, 59) and (107, 59) ..
+          (107, 59) -- (107, 59) --
+          (108, 59) .. controls (110, 59) and (112, 59) ..
+          (114, 59) .. controls (115, 59) and (115, 59) ..
+          (115, 59) .. controls (115, 59) and (112, 59) ..
+          (109, 59) .. controls (108, 58) and (107, 58) ..
+          (107, 58) .. controls (107, 58) and (107, 58) ..
+          (107, 58) .. controls (107, 57) and (107, 56) ..
+          (107, 55) .. controls (107, 53) and (107, 53) ..
+          (107, 53) .. controls (107, 52) and (106, 51) ..
+          (106, 50) -- (105, 50) --
+          (105, 48) .. controls (105, 47) and (105, 46) ..
+          (105, 46) -- (105, 45) --
+          (104, 45) .. controls (104, 45) and (104, 45) ..
+          (103, 45) -- cycle;
+      \protect\end{scope}
+    \protect\end{tikzpicture}}
+  ~}
+}{}\par
+
+\ifdefempty{\gitlabsocialsymbol} {
+  \renewcommand*{\gitlabsocialsymbol} {
+    \protect\raisebox{-0.12em}{
+      \protect\begin{tikzpicture}[x=0.11em, y=0.11em, xscale=0.015, yscale=-0.015, inner sep=0pt, outer sep=0pt]
+      \protect\begin{scope}[shift={(507,387)}]
+      \protect\path[fill=color2,line width=0.057pt]
+      (105.2000,24.9000) .. controls (102.1000,16.0000) and (89.5000,16.0000) ..
+      (86.3000,24.9000) -- (29.8000,199.7000) -- (161.7000,199.7000) .. controls
+      (161.7000,199.7000) and (105.2000,24.9000) .. (105.2000,24.9000) -- cycle
+      (0.9000,287.7000) .. controls (-1.7000,295.7000) and (1.2000,304.6000) ..
+      (8.0000,309.7000) -- (255.9000,493.7000) -- (29.7000,199.7000) --        cycle
+      (161.7000,199.7000) -- (161.7000,199.7000) -- (256.0000,493.7000) -- (350.3000,199.7000) -- cycle
+      (511.1000,287.7000) -- (482.3000,199.7000) -- (256.0000,493.7000) --
+      (503.9000,309.7000) .. controls (510.8000,304.6000) and (513.6000,295.7000) ..
+      (511.1000,287.7000) -- cycle(425.7000,24.9000) .. controls (422.6000,16.0000)
+      and (410.0000,16.0000) .. (406.8000,24.9000) -- (350.2000,199.7000) -- (482.2000,199.7000) -- cycle;
+      \protect\end{scope}
+      \protect\end{tikzpicture}}
+  ~}
+}{}\par
+
+\ifdefempty{\skypesocialsymbol} {
+  \renewcommand*{\skypesocialsymbol} {
+  \protect\raisebox{-0.15em}{
+    \protect\begin{tikzpicture}[y=0.08em, x=0.08em, xscale=0.020, yscale=-0.020, inner sep=0pt, outer sep=0pt]
+      \protect\begin{scope}[shift={(507,387)}]
+        \protect\path[fill=color2,even odd rule]
+          (487.6550,288.9690) .. controls (489.0610,278.5690) and (489.8700,267.9960) ..
+          (489.8700,257.2330) .. controls (489.8700,128.0770) and (384.5990,23.3610) ..
+          (254.7670,23.3610) .. controls (241.8630,23.3610) and (229.2120,24.4210) ..
+          (216.9010,26.4410) .. controls (194.8280,12.0570) and (168.5590,3.6740) ..
+          (140.2880,3.6740) .. controls (62.7660,3.6740) and (0.0000,66.4820) ..
+          (0.0000,143.9800) .. controls (0.0000,172.1780) and (8.2990,198.3740) ..
+          (22.5900,220.3690) .. controls (20.6650,232.3860) and (19.6810,244.6920) ..
+          (19.6810,257.2290) .. controls (19.6810,386.4050) and (124.8980,491.1100) ..
+          (254.7660,491.1100) .. controls (269.4230,491.1100) and (283.6930,489.6840) ..
+          (297.5620,487.1780) .. controls (319.1120,500.5470) and (344.4960,508.3260) ..
+          (371.7080,508.3260) .. controls (449.2100,508.3260) and (512.0010,445.5020) ..
+          (512.0010,368.0120) .. controls (511.9980,338.7190) and (503.0410,311.4840) ..
+          (487.6550,288.9690) -- cycle(276.7400,429.5960) .. controls (202.0340,433.4870) and (167.0750,416.9590) .. (135.0500,386.9050) .. controls (99.2850,353.3370) and (113.6520,315.0500) ..
+          (142.7900,313.1040) .. controls (171.9120,311.1590) and (189.3980,346.1160) ..
+          (204.9410,355.8400) .. controls (220.4650,365.5280) and (279.5340,387.6000) ..
+          (310.7350,351.9320) .. controls (344.7100,313.1040) and (288.1410,293.0120) ..
+          (246.6760,286.9300) .. controls (187.4730,278.1640) and (112.7260,246.1370) ..
+          (118.5410,183.0230) .. controls (124.3580,119.9490) and (172.1230,87.6090) ..
+          (222.3910,83.0470) .. controls (286.4680,77.2300) and (328.1820,92.7540) ..
+          (361.1760,120.9070) .. controls (399.3270,153.4360) and (378.6840,189.8010) ..
+          (354.3770,192.7270) .. controls (330.1660,195.6360) and (302.9730,139.2230) ..
+          (249.5860,138.3750) .. controls (194.5590,137.5110) and (157.3690,195.6360) ..
+          (225.3000,212.1590) .. controls (293.2660,228.6640) and (366.0500,235.4450) ..
+          (392.2610,297.5760) .. controls (418.4900,359.7130) and (351.5070,425.7010) ..
+          (276.7400,429.5960) -- cycle;
+      \protect\end{scope}
+    \protect\end{tikzpicture}}
+  ~}
+}{}\par
+
+\ifdefempty{\googlescholarsocialsymbol} {
+  \renewcommand*{\googlescholarsocialsymbol} {
+    \protect\raisebox{-0.12em}{
+    \protect\begin{tikzpicture}[y=2.0pt, x=2.0pt, yscale=-0.1, xscale=0.1, inner sep=0pt, outer sep=0pt]
+    \protect\begin{scope}[shift={(507,387)}]
+    \protect\path[fill=color2] (25.0000,2.0000) .. controls (12.3095,2.0000) and (2.0000,12.3095)
+               .. (2.0000,25.0000) .. controls (2.0000,37.6905) and (12.3095,48.0000) ..
+               (25.0000,48.0000) .. controls (37.6905,48.0000) and (48.0000,37.6905) ..
+               (48.0000,25.0000) .. controls (48.0000,12.3095) and (37.6905,2.0000) ..
+               (25.0000,2.0000) -- cycle(25.0000,4.0000) .. controls (36.6095,4.0000) and
+               (46.0000,13.3905) .. (46.0000,25.0000) .. controls (46.0000,36.6095) and
+               (36.6095,46.0000) .. (25.0000,46.0000) .. controls (13.3905,46.0000) and
+               (4.0000,36.6095) .. (4.0000,25.0000) .. controls (4.0000,13.3905) and
+               (13.3905,4.0000) .. (25.0000,4.0000) -- cycle(21.0000,11.0000) --
+               (11.0000,20.0000) -- (17.7812,20.0000) .. controls (17.8012,22.8470) and
+               (19.9675,25.7305) .. (23.7695,25.7305) .. controls (24.1295,25.7305) and
+               (24.5297,25.6904) .. (24.9297,25.6504) .. controls (24.7497,26.1004) and
+               (24.5605,26.4701) .. (24.5605,27.0801) .. controls (24.5605,28.2301) and
+               (25.1404,28.9201) .. (25.6504,29.5801) .. controls (24.0204,29.6901) and
+               (20.9898,29.8795) .. (18.7598,31.2695) .. controls (16.6298,32.5595) and
+               (15.9805,34.4300) .. (15.9805,35.7500) .. controls (15.9805,38.4700) and
+               (18.5005,41.0000) .. (23.7305,41.0000) .. controls (29.9305,41.0000) and
+               (33.2207,37.5105) .. (33.2207,34.0605) .. controls (33.2207,31.5305) and
+               (31.7795,30.2799) .. (30.1895,28.9199) -- (28.9004,27.8906) .. controls
+               (28.5004,27.5706) and (27.9492,27.1203) .. (27.9492,26.3203) .. controls
+               (27.9492,25.5103) and (28.5007,24.9898) .. (28.9707,24.5098) .. controls
+               (30.4807,23.3098) and (32.0000,21.9602) .. (32.0000,19.2402) .. controls
+               (32.0000,18.1972) and (31.7562,17.3484) .. (31.4082,16.6504) --
+               (35.0000,13.5703) -- (35.0000,17.2773) .. controls (34.4050,17.6233) and
+               (34.0000,18.2610) .. (34.0000,19.0000) -- (34.0000,25.0000) .. controls
+               (34.0000,26.1040) and (34.8960,27.0000) .. (36.0000,27.0000) .. controls
+               (37.1040,27.0000) and (38.0000,26.1040) .. (38.0000,25.0000) --
+               (38.0000,19.0000) .. controls (38.0000,18.2620) and (37.5950,17.6243) ..
+               (37.0000,17.2773) -- (37.0000,12.0000) .. controls (37.0000,11.9570) and
+               (36.9806,11.9209) .. (36.9746,11.8789) -- (38.0000,11.0000) --
+               (21.0000,11.0000) -- cycle(24.2695,14.2402) .. controls (27.2695,14.2402) and
+               (28.8203,18.3500) .. (28.8203,21.0000) .. controls (28.8203,21.6500) and
+               (28.7399,22.8199) .. (27.9199,23.6699) .. controls (27.3399,24.2599) and
+               (26.3709,24.6992) .. (25.4609,24.6992) .. controls (22.3709,24.6992) and
+               (20.9492,20.6202) .. (20.9492,18.1602) .. controls (20.9492,17.2102) and
+               (21.1400,16.2209) .. (21.7500,15.4609) .. controls (22.3300,14.7109) and
+               (23.3395,14.2402) .. (24.2695,14.2402) -- cycle(26.0391,30.6094) .. controls
+               (26.4091,30.6094) and (26.5909,30.6104) .. (26.8809,30.6504) .. controls
+               (29.6209,32.6304) and (30.8008,33.6202) .. (30.8008,35.4902) .. controls
+               (30.8008,37.7602) and (28.9700,39.4609) .. (25.5000,39.4609) .. controls
+               (21.6400,39.4609) and (19.1602,37.5905) .. (19.1602,34.9805) .. controls
+               (19.1602,32.3705) and (21.4598,31.4992) .. (22.2598,31.1992) .. controls
+               (23.7698,30.6792) and (25.7191,30.6094) .. (26.0391,30.6094) -- cycle;
+  \protect\end{scope}
+  \protect\end{tikzpicture}}
+~}
+}{}\par
+
+\ifdefempty{\matrixsocialsymbol} {
+  \renewcommand*{\matrixsocialsymbol} {
+    \protect\raisebox{-0.12em}{
+    \protect\begin{tikzpicture}[y=1.8pt, x=1.8pt, yscale=-0.15, xscale=0.15, inner sep=0pt, outer sep=0pt]
+    \protect\begin{scope}[shift={(507,387)}]
+    \protect\path[fill=color2]
+      (0.9360,0.7320) .. controls (0.9360,10.9053) and (0.9360,21.0787) ..
+      (0.9360,31.2520) .. controls (1.6673,31.2520) and (2.3987,31.2520) ..
+      (3.1300,31.2520) .. controls (3.3452,32.0075) and (2.8778,32.0803) ..
+      (2.2413,31.9840) .. controls (1.5258,31.9840) and (0.8104,31.9840) ..
+      (0.0950,31.9840) .. controls (0.0950,21.3240) and (0.0950,10.6640) ..
+      (0.0950,0.0040) .. controls (1.1063,0.0040) and (2.1177,0.0040) ..
+      (3.1290,0.0040) .. controls (3.3442,0.7598) and (2.8768,0.8319) ..
+      (2.2403,0.7344) .. controls (1.8055,0.7336) and (1.3708,0.7328) ..
+      (0.9360,0.7320) -- cycle(9.3860,10.4070) .. controls (9.4181,10.9043) and
+      (9.3236,11.5281) .. (9.4300,11.9510) .. controls (10.7306,9.8293) and
+      (14.1727,9.3918) .. (15.8298,11.2910) .. controls (16.3916,12.8310) and
+      (17.3334,10.0899) .. (18.5637,10.2414) .. controls (20.4575,9.7636) and
+      (23.0149,10.3893) .. (23.6011,12.4937) .. controls (24.0197,14.2344) and
+      (23.7678,16.0478) .. (23.8370,17.8238) .. controls (23.8370,19.1536) and
+      (23.8370,20.4833) .. (23.8370,21.8130) .. controls (22.7947,21.8130) and
+      (21.7523,21.8130) .. (20.7100,21.8130) .. controls (20.6777,19.2218) and
+      (20.7833,16.6250) .. (20.6389,14.0382) .. controls (20.4668,12.0762) and
+      (17.2764,12.0985) .. (16.8890,13.9332) .. controls (16.5424,15.7480) and
+      (16.7622,17.6175) .. (16.7000,19.4583) .. controls (16.7000,20.2432) and
+      (16.7000,21.0281) .. (16.7000,21.8130) .. controls (15.6573,21.8130) and
+      (14.6147,21.8130) .. (13.5720,21.8130) .. controls (13.5377,19.1909) and
+      (13.6502,16.5608) .. (13.4952,13.9452) .. controls (13.2700,12.0546) and
+      (10.3372,12.2098) .. (9.8050,13.8370) .. controls (9.3690,15.2175) and
+      (9.6378,16.6981) .. (9.5630,18.1268) .. controls (9.5630,19.3556) and
+      (9.5630,20.5843) .. (9.5630,21.8130) .. controls (8.5200,21.8130) and
+      (7.4770,21.8130) .. (6.4340,21.8130) .. controls (6.4340,18.0097) and
+      (6.4340,14.2063) .. (6.4340,10.4030) .. controls (7.4180,10.4043) and
+      (8.4020,10.4057) .. (9.3860,10.4070) -- cycle(30.0980,31.2470) .. controls
+      (30.0980,21.0737) and (30.0980,10.9003) .. (30.0980,0.7270) .. controls
+      (29.3667,0.7270) and (28.6353,0.7270) .. (27.9040,0.7270) .. controls
+      (27.6888,-0.0285) and (28.1562,-0.1013) .. (28.7927,-0.0050) .. controls
+      (29.5082,-0.0050) and (30.2236,-0.0050) .. (30.9390,-0.0050) .. controls
+      (30.9390,10.6550) and (30.9390,21.3150) .. (30.9390,31.9750) .. controls
+      (29.9273,31.9750) and (28.9157,31.9750) .. (27.9040,31.9750) .. controls
+      (27.6888,31.2192) and (28.1562,31.1471) .. (28.7927,31.2446) .. controls
+      (29.2278,31.2454) and (29.6629,31.2462) .. (30.0980,31.2470) -- cycle;
+    \protect\end{scope}
+    \protect\end{tikzpicture}}
+  ~}
+}{}\par
+
+\ifdefempty{\signalsocialsymbol} {
+  \renewcommand*{\signalsocialsymbol} {
+    \protect\raisebox{-0.12em}{
+    \protect\begin{tikzpicture}[y=0.1pt, x=0.1pt, yscale=-0.13, xscale=0.13, inner sep=0pt, outer sep=0pt]
+    \protect\begin{scope}[shift={(507,387)}]
+    \protect\path[fill=color2]
+      (430.1000,180.9000) -- (437.8000,211.9000) .. controls (407.6000,219.3000)
+      and (378.7000,231.3000) .. (352.1000,247.3000) -- (335.7000,220.0000) ..
+      controls (365.0000,202.3000) and (396.9000,189.1000) .. (430.1000,180.9000) --
+      cycle(593.9000,180.9000) -- (586.2000,211.9000) .. controls
+      (616.4000,219.3000) and (645.3000,231.3000) .. (671.9000,247.3000) --
+      (688.4000,219.9000) .. controls (659.0000,202.3000) and (627.2000,189.1000) ..
+      (593.9000,180.9000) -- cycle(220.0000,335.7000) .. controls
+      (202.3000,365.0000) and (189.1000,396.9000) .. (180.9000,430.1000) --
+      (211.9000,437.8000) .. controls (219.3000,407.6000) and (231.3000,378.7000) ..
+      (247.3000,352.1000) -- cycle(202.9000,512.0000) .. controls
+      (202.9000,496.5000) and (204.0000,481.0000) .. (206.4000,465.7000) --
+      (174.8000,460.9000) .. controls (169.7000,494.8000) and (169.7000,529.2000) ..
+      (174.8000,563.1000) -- (206.4000,558.3000) .. controls (204.1000,543.0000) and
+      (202.9000,527.5000) .. (202.9000,512.0000) -- cycle(688.3000,804.0000) --
+      (671.9000,776.6000) .. controls (645.3000,792.7000) and (616.5000,804.6000) ..
+      (586.3000,812.0000) -- (594.0000,843.0000) .. controls (627.2000,834.8000) and
+      (659.0000,821.7000) .. (688.3000,804.0000) -- cycle(821.1000,512.0000) ..
+      controls (821.1000,527.5000) and (820.0000,543.0000) .. (817.6000,558.3000) --
+      (849.2000,563.1000) .. controls (854.3000,529.2000) and (854.3000,494.8000) ..
+      (849.2000,460.9000) -- (817.6000,465.7000) .. controls (819.9000,481.0000) and
+      (821.1000,496.5000) .. (821.1000,512.0000) -- cycle(843.1000,593.8000) --
+      (812.1000,586.1000) .. controls (804.7000,616.3000) and (792.7000,645.2000) ..
+      (776.7000,671.8000) -- (804.1000,688.3000) .. controls (821.7000,659.0000) and
+      (834.9000,627.1000) .. (843.1000,593.8000) -- cycle(558.3000,817.6000) ..
+      controls (527.6000,822.2000) and (496.4000,822.2000) .. (465.7000,817.6000) --
+      (460.9000,849.2000) .. controls (494.8000,854.3000) and (529.2000,854.3000) ..
+      (563.1000,849.2000) -- cycle(760.8000,695.3000) .. controls
+      (742.4000,720.3000) and (720.3000,742.3000) .. (695.3000,760.7000) --
+      (714.3000,786.4000) .. controls (741.9000,766.1000) and (766.2000,741.9000) ..
+      (786.6000,714.4000) -- cycle(695.3000,263.2000) .. controls
+      (720.3000,281.6000) and (742.4000,303.7000) .. (760.8000,328.7000) --
+      (786.5000,309.5000) .. controls (766.2000,282.0000) and (741.9000,257.7000) ..
+      (714.5000,237.5000) -- cycle(263.2000,328.7000) .. controls
+      (281.6000,303.7000) and (303.7000,281.6000) .. (328.7000,263.2000) --
+      (309.5000,237.5000) .. controls (282.0000,257.8000) and (257.7000,282.1000) ..
+      (237.5000,309.5000) -- cycle(804.0000,335.7000) -- (776.6000,352.1000) ..
+      controls (792.7000,378.7000) and (804.6000,407.5000) .. (812.0000,437.7000) --
+      (843.0000,430.0000) .. controls (834.9000,396.8000) and (821.7000,365.0000) ..
+      (804.0000,335.7000) -- cycle(465.7000,206.4000) .. controls
+      (496.4000,201.8000) and (527.6000,201.8000) .. (558.3000,206.4000) --
+      (563.1000,174.8000) .. controls (529.2000,169.7000) and (494.8000,169.7000) ..
+      (460.9000,174.8000) -- cycle(279.6000,795.0000) -- (213.6000,810.4000) --
+      (229.0000,744.4000) -- (197.9000,737.1000) -- (182.5000,803.1000) .. controls
+      (180.0000,813.9000) and (183.2000,825.2000) .. (191.0000,833.0000) .. controls
+      (198.8000,840.8000) and (210.1000,844.0000) .. (220.9000,841.5000) --
+      (286.9000,826.4000) -- cycle(204.5000,708.5000) -- (235.6000,715.7000) --
+      (246.3000,669.9000) .. controls (230.8000,643.8000) and (219.2000,615.5000) ..
+      (211.9000,586.0000) -- (180.9000,593.7000) .. controls (187.9000,622.0000) and
+      (198.4000,649.2000) .. (212.3000,674.7000) -- cycle(353.7000,777.8000) --
+      (308.0000,788.5000) -- (315.2000,819.6000) -- (348.9000,811.8000) .. controls
+      (374.5000,825.7000) and (401.7000,836.3000) .. (430.0000,843.2000) --
+      (437.7000,812.2000) .. controls (408.3000,804.9000) and (380.1000,793.2000) ..
+      (354.0000,777.6000) -- cycle(512.0000,234.9000) .. controls
+      (411.2000,235.0000) and (318.3000,289.8000) .. (269.6000,378.0000) .. controls
+      (220.9000,466.2000) and (223.9000,574.0000) .. (277.6000,659.4000) --
+      (251.0000,773.1000) -- (364.7000,746.5000) .. controls (464.4000,809.3000) and
+      (592.9000,802.2000) .. (685.1000,728.8000) .. controls (777.3000,655.4000) and
+      (812.9000,531.7000) .. (774.0000,420.5000) .. controls (734.8000,309.2000) and
+      (629.8000,234.8000) .. (512.0000,234.9000) -- cycle;
+    \protect\end{scope}
+    \protect\end{tikzpicture}}
+  ~}
+}{}\par
+
+\ifdefempty{\codebergsocialsymbol} {
+  \renewcommand*{\codebergsocialsymbol} {
+    \protect\raisebox{-0.12em}{
+    \protect\begin{tikzpicture}[y=0.8pt, x=0.8pt, yscale=-1.0, xscale=1.0, inner sep=0pt, outer sep=0pt]
+    \protect\begin{scope}[shift={(507, 387)}]
+      \protect\path[scale=0.265, opacity=0.500, line cap=butt, line join=miter, line width=0.779pt, miter limit=2.00]
+      (11249.8942,-1872.9296)arc(269.285:169.240:0.201313 and 0.150) --
+      (11258.5852,-1839.4433)arc(66.699:32.084:23.067) --
+      (11250.0698,-1872.8557)arc(329.460:269.346:0.201313 and 0.150) -- cycle;
+
+      \protect\path[scale=0.265, fill=color2, line width=0.426pt]
+      (11249.3743,-1883.6959)arc(269.785:180.000:23.067)arc(180.001:147.920:23.067)
+      -- (11249.1480,-1873.2412)arc(209.929:330.071:0.360097 and 0.269) --
+      (11269.0053,-1848.3766)arc(32.082:-0.002:23.067)arc(360.000:270.000:23.067)arc(270.108:269.892:23.067)
+      -- cycle;
+    \protect\end{scope}
+    \protect\end{tikzpicture}}
+  ~}
+}{}\par
+
+\endinput
+
+%% end of file `moderncviconstikz.sty'.
diff --git a/moderncvskillmatrix.sty b/moderncvskillmatrix.sty
new file mode 100644 (file)
index 0000000..6cf41c0
--- /dev/null
@@ -0,0 +1,1051 @@
+%% 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}[2022-02-21 v2.3.1 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'.
diff --git a/moderncvstylebanking.sty b/moderncvstylebanking.sty
new file mode 100644 (file)
index 0000000..29df385
--- /dev/null
@@ -0,0 +1,75 @@
+%% start of file `moderncvstylebanking.sty'.
+%% Copyright 2006-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv).
+%
+% 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{moderncvstylebanking}[2022-02-21 v2.3.1 modern curriculum vitae and letter style scheme: banking]
+
+% body rules type options: "fullrules", "shortrules", "mixedrules" (default) or "norules"
+\@initializecommand{\moderncvstylebodyoptions}{}
+\DeclareOption{fullrules}    {\edef\moderncvstylebodyoptions{\moderncvstylebodyoptions,fullrules}}
+\DeclareOption{shortrules}   {\edef\moderncvstylebodyoptions{\moderncvstylebodyoptions,shortrules}}
+\DeclareOption{mixedrules}   {\edef\moderncvstylebodyoptions{\moderncvstylebodyoptions,mixedrules}}
+\DeclareOption{norules}      {\edef\moderncvstylebodyoptions{\moderncvstylebodyoptions,norules}}
+
+% body section alignment options: "left" (default), "center" or "right"
+\DeclareOption{left}         {\edef\moderncvstylebodyoptions{\moderncvstylebodyoptions,left}}
+\DeclareOption{center}       {\edef\moderncvstylebodyoptions{\moderncvstylebodyoptions,center}}
+\DeclareOption{right}        {\edef\moderncvstylebodyoptions{\moderncvstylebodyoptions,right}}
+
+% toggle use of symbol fonts.
+\@initializeif{\if@symbols}\@symbolsfalse
+\DeclareOption{symbols}      {\@symbolstrue}
+\DeclareOption{nosymbols}    {\@symbolsfalse}
+
+\DeclareOption*{}% avoid choking on unknown options
+\ExecuteOptions{mixedrules,left,symbols}
+\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
+
+
+%-------------------------------------------------------------------------------
+%                fonts & icons
+%-------------------------------------------------------------------------------
+% TeX Gyre Pagella font
+%\ifxetexorluatex
+%  \setmainfont{Tex-Gyre Pagella}
+%  \setsansfont{Tex-Gyre Pagella}
+%  \setmathfont{Tex-Gyre Pagella}
+%  \setmathfont[range=\mathit,\mathsfit]{Tex-Gyre Pagella Italic}
+%  \setmathfont[range=\mathbfup,\mathbfsfup]{Tex-Gyre Pagella Bold}
+%  \setmathfont[range=\mathbfit,\mathbfsfit]{Tex-Gyre Pagella Bold Italic}
+%\else
+  \IfFileExists{tgpagella.sty}%
+    {%
+      \RequirePackage{tgpagella}%
+      \renewcommand*{\familydefault}{\rmdefault}}%
+    {}
+%\fi
+
+% symbols
+\if@symbols
+    \moderncvicons{symbols}     % use symbols
+\else
+    \moderncvicons{letters}     % do not use symbols, use letters
+\fi
+
+
+
+%-------------------------------------------------------------------------------
+%                header, body & footer
+%-------------------------------------------------------------------------------
+\moderncvhead{3}
+\moderncvbody[\moderncvstylebodyoptions]{3}
+
+
+\endinput
+
+
+%% end of file `moderncvstylebanking.sty'.
diff --git a/moderncvstylecasual.sty b/moderncvstylecasual.sty
new file mode 100644 (file)
index 0000000..dd1c3eb
--- /dev/null
@@ -0,0 +1,62 @@
+%% start of file `moderncvstylecasual.sty'.
+%% Copyright 2006-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv).
+%
+% 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{moderncvstylecasual}[2022-02-21 v2.3.1 modern curriculum vitae and letter style scheme: casual]
+
+% head section alignment options: "left" (default) or "right"
+\@initializecommand{\moderncvstyleheadoptions}{}
+\DeclareOption{left} {\edef\moderncvstyleheadoptions{\moderncvstyleheadoptions,left}}
+\DeclareOption{right}{\edef\moderncvstyleheadoptions{\moderncvstyleheadoptions,right}}
+
+% toggle use of symbol fonts.
+\@initializeif{\if@symbols}\@symbolsfalse
+\DeclareOption{symbols}      {\@symbolstrue}
+\DeclareOption{nosymbols}    {\@symbolsfalse}
+
+\DeclareOption*{}% avoid choking on unknown options
+\ExecuteOptions{right,symbols}
+\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
+
+%-------------------------------------------------------------------------------
+%                fonts & icons
+%-------------------------------------------------------------------------------
+% Latin Modern fonts
+%\ifxetexorluatex
+%  \setmainfont{Latin Modern Roman}
+%  \setsansfont{Latin Modern Sans}
+%  \setmathfont{Latin Modern Math}
+%\else
+%   \IfFileExists{lmodern.sty}%
+%     {\RequirePackage{lmodern}}%
+%     {}
+%\fi
+
+% symbols
+\if@symbols
+    \moderncvicons{symbols}     % use symbols
+\else
+    \moderncvicons{letters}     % do not use symbols, use letters
+\fi
+
+
+%-------------------------------------------------------------------------------
+%                header, body & footer
+%-------------------------------------------------------------------------------
+\moderncvhead[\moderncvstyleheadoptions]{2}
+\moderncvbody{1}
+\moderncvfoot{1}
+
+
+\endinput
+
+
+%% end of file `moderncvstylecasual.sty'.
diff --git a/moderncvstyleclassic.sty b/moderncvstyleclassic.sty
new file mode 100644 (file)
index 0000000..7008b03
--- /dev/null
@@ -0,0 +1,62 @@
+%% start of file `moderncvstyleclassic.sty'.
+%% Copyright 2006-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv).
+%
+% 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{moderncvstyleclassic}[2022-02-21 v2.3.1 modern curriculum vitae and letter style scheme: classic]
+
+% head section alignment options: "left" (default) or "right"
+\@initializecommand{\moderncvstyleheadoptions}{}
+\DeclareOption{left} {\edef\moderncvstyleheadoptions{\moderncvstyleheadoptions,left}}
+\DeclareOption{right}{\edef\moderncvstyleheadoptions{\moderncvstyleheadoptions,right}}
+\DeclareOption{top}{\edef\moderncvstyleheadoptions{\moderncvstyleheadoptions,top}}
+
+% toggle use of symbol fonts.
+\@initializeif{\if@symbols}\@symbolsfalse
+\DeclareOption{symbols}      {\@symbolstrue}
+\DeclareOption{nosymbols}    {\@symbolsfalse}
+
+\DeclareOption*{}% avoid choking on unknown options
+\ExecuteOptions{left,symbols}
+\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
+
+%-------------------------------------------------------------------------------
+%                fonts & icons
+%-------------------------------------------------------------------------------
+% Latin Modern fonts
+%\ifxetexorluatex
+%  \setmainfont{Latin Modern Roman}
+%  \setsansfont{Latin Modern Sans}
+%  \setmathfont{Latin Modern Math}
+%\else
+%   \IfFileExists{lmodern.sty}%
+%     {\RequirePackage{lmodern}}%
+%     {}
+%\fi
+
+% symbols
+\if@symbols
+    \moderncvicons{symbols}     % use symbols
+\else
+    \moderncvicons{letters}     % do not use symbols, use letters
+\fi
+
+
+%-------------------------------------------------------------------------------
+%                header, body & footer
+%-------------------------------------------------------------------------------
+\moderncvhead[\moderncvstyleheadoptions]{1}
+\moderncvbody{1}
+
+
+\endinput
+
+
+%% end of file `moderncvstyleclassic.sty'.
diff --git a/moderncvstyleempty.sty b/moderncvstyleempty.sty
new file mode 100644 (file)
index 0000000..056a37f
--- /dev/null
@@ -0,0 +1,50 @@
+%% start of file `moderncvstyleempty.sty'.
+%% Copyright 2006-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv).
+%
+% 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{moderncvstyleempty}[2022-02-21 v2.3.1 modern curriculum vitae scheme: empty]
+
+%-------------------------------------------------------------------------------
+%                required packages
+%-------------------------------------------------------------------------------
+
+%-------------------------------------------------------------------------------
+%                package options
+%-------------------------------------------------------------------------------
+% toggle use of symbol fonts.
+\@initializeif{\if@symbols}\@symbolsfalse
+\DeclareOption{symbols}      {\@symbolstrue}
+\DeclareOption{nosymbols}    {\@symbolsfalse}
+
+\DeclareOption*{}% avoid choking on unknown options
+\ExecuteOptions{symbols}
+\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
+
+%-------------------------------------------------------------------------------
+%                style definition
+%-------------------------------------------------------------------------------
+
+%-------------------------------------------------------------------------------
+%                fonts & icons
+%-------------------------------------------------------------------------------
+% symbols
+\if@symbols
+    \moderncvicons{symbols}     % use symbols
+\else
+    \moderncvicons{letters}     % do not use symbols, use letters
+\fi
+
+% see moderncv.cls for command declarations that needs to be implemented, e.g. \maketitle, \section, \subsections, \cvline, etc
+
+\endinput
+
+
+%% end of file `moderncvstyleempty.sty'.
diff --git a/moderncvstylefancy.sty b/moderncvstylefancy.sty
new file mode 100644 (file)
index 0000000..ea56bba
--- /dev/null
@@ -0,0 +1,57 @@
+%% start of file `moderncvstylefancy.sty'.
+%% Copyright 2015-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv).
+%
+% 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{moderncvstylefancy}[2022-02-21 v2.3.1 modern curriculum vitae and letter style scheme: fancy]
+
+% toggle use of symbol fonts.
+\@initializeif{\if@symbols}\@symbolsfalse
+\DeclareOption{symbols}      {\@symbolstrue}
+\DeclareOption{nosymbols}    {\@symbolsfalse}
+
+\DeclareOption*{}% avoid choking on unknown options
+\ExecuteOptions{symbols}
+\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
+
+%-------------------------------------------------------------------------------
+%                fonts & icons
+%-------------------------------------------------------------------------------
+% EB Garamond font
+%\ifxetexorluatex
+%  \setmainfont{EB Garamond}
+%  \setsansfont{EB Garamond}
+%  \setmathfont{EB Garamond}
+%\else
+  \IfFileExists{ebgaramond.sty}%
+    {\RequirePackage{ebgaramond}}%
+    {}
+%\fi
+
+
+% symbols
+\if@symbols
+    \moderncvicons{symbols}     % use symbols
+\else
+    \moderncvicons{letters}     % do not use symbols, use letters
+\fi
+
+
+%-------------------------------------------------------------------------------
+%                header, body & footer
+%-------------------------------------------------------------------------------
+\moderncvhead{5}
+\moderncvbody{5}
+
+
+\endinput
+
+
+%% end of file `moderncvstylefancy.sty'.
diff --git a/moderncvstyleoldstyle.sty b/moderncvstyleoldstyle.sty
new file mode 100644 (file)
index 0000000..78225e0
--- /dev/null
@@ -0,0 +1,63 @@
+%% start of file `moderncvstyleoldstyle.sty'.
+%% Copyright 2006-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv).
+%
+% 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{moderncvstyleoldstyle}[2022-02-21 v2.3.1 modern curriculum vitae and letter style scheme: oldstyle]
+
+% toggle use of symbol fonts.
+\@initializeif{\if@symbols}\@symbolsfalse
+\DeclareOption{symbols}      {\@symbolstrue}
+\DeclareOption{nosymbols}    {\@symbolsfalse}
+
+\DeclareOption*{}% avoid choking on unknown options
+\ExecuteOptions{symbols}
+\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
+
+%-------------------------------------------------------------------------------
+%                fonts & icons
+%-------------------------------------------------------------------------------
+% Kurier font
+%\ifxetexorluatex
+%  \setmainfont[Numbers={OldStyle,Proportional}, BoldFont={Kurier Bold}, ItalicFont={Kurier Light Italic}, BoldItalicFont={Kurier Bold Italic}]{Kurier Light}
+%  \setsansfont[Numbers={OldStyle,Proportional}, BoldFont={Kurier Bold}, ItalicFont={Kurier Light Italic}, BoldItalicFont={Kurier Bold Italic}]{Kurier Light}
+%  \setmathfont{Kurier Light}
+%  \setmathfont[range=\mathit,\mathsfit]{Kurier Light Italic}
+%  \setmathfont[range=\mathbfup,\mathbfsfup]{Kurier Bold}
+%  \setmathfont[range=\mathbfit,\mathbfsfit]{Kurier Bold Italic}
+%\else
+  \IfFileExists{kurier.sty}%
+    {\RequirePackage[light,math]{kurier}}%
+    {}
+%\fi
+
+% symbols
+\if@symbols
+    \ifxetexorluatex
+    \moderncvicons{awesome}     % use font-awesome symbols if lualatex or xelatex is used
+    \else
+    \moderncvicons{marvosym}    % use marvosym symbols pdflatex is used
+    \fi
+\else
+    \moderncvicons{letters}    % do not use symbols, use letters
+\fi
+
+
+%-------------------------------------------------------------------------------
+%                header, body & footer
+%-------------------------------------------------------------------------------
+\moderncvhead{4}
+\moderncvbody{4}
+
+
+\endinput
+
+
+%% end of file `moderncvstyleoldstyle.sty'.
diff --git a/moderncvstyleratten.sty b/moderncvstyleratten.sty
new file mode 100644 (file)
index 0000000..0eb5bd4
--- /dev/null
@@ -0,0 +1,62 @@
+%% start of file `moderncvstyleclassic.sty'.
+%% Copyright 2006-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv).
+%
+% 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{moderncvstyleratten}[2022-02-21 v2.3.1 modern curriculum vitae and letter style scheme: ratten]
+
+% head section alignment options: "left" (default) or "right"
+\@initializecommand{\moderncvstyleheadoptions}{}
+\DeclareOption{left} {\edef\moderncvstyleheadoptions{\moderncvstyleheadoptions,left}}
+\DeclareOption{right}{\edef\moderncvstyleheadoptions{\moderncvstyleheadoptions,right}}
+\DeclareOption{top}{\edef\moderncvstyleheadoptions{\moderncvstyleheadoptions,top}}
+
+% toggle use of symbol fonts.
+\@initializeif{\if@symbols}\@symbolsfalse
+\DeclareOption{symbols}      {\@symbolstrue}
+\DeclareOption{nosymbols}    {\@symbolsfalse}
+
+\DeclareOption*{}% avoid choking on unknown options
+\ExecuteOptions{left,symbols}
+\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
+
+%-------------------------------------------------------------------------------
+%                fonts & icons
+%-------------------------------------------------------------------------------
+% Latin Modern fonts
+%\ifxetexorluatex
+%  \setmainfont{Latin Modern Roman}
+%  \setsansfont{Latin Modern Sans}
+%  \setmathfont{Latin Modern Math}
+%\else
+%   \IfFileExists{lmodern.sty}%
+%     {\RequirePackage{lmodern}}%
+%     {}
+%\fi
+
+% symbols
+\if@symbols
+    \moderncvicons{symbols}     % use symbols
+\else
+    \moderncvicons{letters}     % do not use symbols, use letters
+\fi
+
+
+%-------------------------------------------------------------------------------
+%                header, body & footer
+%-------------------------------------------------------------------------------
+\moderncvhead[\moderncvstyleheadoptions]{7}
+\moderncvbody{1}
+%\moderncvfoot{1}
+
+\endinput
+
+
+%% end of file `moderncvstyleclassic.sty'.
diff --git a/moderncvstyleratten.sty~ b/moderncvstyleratten.sty~
new file mode 100644 (file)
index 0000000..4b0c2b9
--- /dev/null
@@ -0,0 +1,62 @@
+%% start of file `moderncvstyleclassic.sty'.
+%% Copyright 2006-2015 Xavier Danaux (xdanaux@gmail.com), 2020-2022 moderncv maintainers (github.com/moderncv).
+%
+% 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{moderncvstyleratten}[2022-02-21 v2.3.1 modern curriculum vitae and letter style scheme: ratten]
+
+% head section alignment options: "left" (default) or "right"
+\@initializecommand{\moderncvstyleheadoptions}{}
+\DeclareOption{left} {\edef\moderncvstyleheadoptions{\moderncvstyleheadoptions,left}}
+\DeclareOption{right}{\edef\moderncvstyleheadoptions{\moderncvstyleheadoptions,right}}
+\DeclareOption{top}{\edef\moderncvstyleheadoptions{\moderncvstyleheadoptions,top}}
+
+% toggle use of symbol fonts.
+\@initializeif{\if@symbols}\@symbolsfalse
+\DeclareOption{symbols}      {\@symbolstrue}
+\DeclareOption{nosymbols}    {\@symbolsfalse}
+
+\DeclareOption*{}% avoid choking on unknown options
+\ExecuteOptions{left,symbols}
+\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
+
+%-------------------------------------------------------------------------------
+%                fonts & icons
+%-------------------------------------------------------------------------------
+% Latin Modern fonts
+%\ifxetexorluatex
+%  \setmainfont{Latin Modern Roman}
+%  \setsansfont{Latin Modern Sans}
+%  \setmathfont{Latin Modern Math}
+%\else
+%   \IfFileExists{lmodern.sty}%
+%     {\RequirePackage{lmodern}}%
+%     {}
+%\fi
+
+% symbols
+\if@symbols
+    \moderncvicons{symbols}     % use symbols
+\else
+    \moderncvicons{letters}     % do not use symbols, use letters
+\fi
+
+
+%-------------------------------------------------------------------------------
+%                header, body & footer
+%-------------------------------------------------------------------------------
+\moderncvhead[\moderncvstyleheadoptions]{7}
+\moderncvbody{1}
+\moderncvfoot{1}
+
+\endinput
+
+
+%% end of file `moderncvstyleclassic.sty'.