307 lines
8.1 KiB
Nix
307 lines
8.1 KiB
Nix
{
|
|
description = "A very basic flake";
|
|
|
|
inputs = {
|
|
nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable";
|
|
};
|
|
|
|
outputs = { self, nixpkgs }:
|
|
let
|
|
resume = import ./resume.nix;
|
|
|
|
vspace = "-8pt";
|
|
|
|
escapeLatex = s: builtins.replaceStrings
|
|
[ "\\" "{" "}" "$" "&" "%" "#" "_" "~" "^" ]
|
|
[ "\\textbackslash{}" "\\{" "\\}" "\\$" "\\&" "\\%" "\\#" "\\_" "\\textasciitilde{}" "\\textasciicircum{}" ]
|
|
s;
|
|
|
|
mkPersonal = personal:
|
|
''
|
|
\begin{tabular*}{\textwidth}{l@{\extracolsep{\fill}}r}
|
|
\textbf{\href{https://${personal.website}}{\Large ${personal.name}}} & \href{https://${personal.website}}{${personal.website}}\\
|
|
\href{mailto:${personal.email}}{${personal.email}} & \href{https://${personal.github}}{${personal.github}}\\
|
|
\end{tabular*}
|
|
'';
|
|
|
|
mkItem = item:
|
|
''
|
|
\item\small{
|
|
{${item}}
|
|
}
|
|
'';
|
|
|
|
mkSectionChild = child:
|
|
''
|
|
\vspace{-2pt}\item
|
|
\begin{tabular*}{0.97\textwidth}[t]{l@{\extracolsep{\fill}}r}
|
|
\textbf{${child.heading}} & ${child.location} \\
|
|
\textit{\small\parbox[t]{0.7\textwidth}{${(builtins.head child.children).subheading}}} & \textit{\small ${(builtins.head child.children).dates}} \\
|
|
\end{tabular*}\vspace{${vspace}}
|
|
|
|
\begin{itemize}
|
|
${builtins.concatStringsSep "\n" (map mkItem (builtins.head child.children).items)}
|
|
\end{itemize}\vspace{${vspace}}
|
|
|
|
${if builtins.length child.children > 1
|
|
then builtins.concatStringsSep "\n" (map (child: ''
|
|
\begin{tabular*}{0.97\textwidth}{l@{\extracolsep{\fill}}r}
|
|
\textit{\small ${child.subheading}} & \textit{\small ${child.dates}} \\
|
|
\end{tabular*}\vspace{${vspace}}
|
|
\begin{itemize}
|
|
${builtins.concatStringsSep "\n" (map mkItem child.items)}
|
|
\end{itemize}\vspace{${vspace}}
|
|
'') (builtins.tail child.children))
|
|
else ""}
|
|
|
|
|
|
'';
|
|
|
|
mkSection = section:
|
|
''
|
|
\section{${section.label}}
|
|
\begin{itemize}[leftmargin=*]
|
|
|
|
${builtins.concatStringsSep "\n" (map mkSectionChild section.children)}
|
|
|
|
\end{itemize}
|
|
'';
|
|
|
|
mkEducation = edu:
|
|
mkSection {
|
|
label = "Education";
|
|
children = map (item: {
|
|
heading = item.school;
|
|
location = item.location;
|
|
children = [
|
|
{
|
|
subheading = item.degree;
|
|
dates = item.dates;
|
|
items = [
|
|
(nixpkgs.lib.strings.concatStrings ["Involvement: " (builtins.concatStringsSep ", " item.organizations)])
|
|
];
|
|
}
|
|
];
|
|
}
|
|
) edu;
|
|
};
|
|
|
|
mkExperience = experience:
|
|
mkSection {
|
|
label = "Experience";
|
|
children = map (item: {
|
|
heading = item.company;
|
|
location = item.location;
|
|
children = map (role: {
|
|
subheading = role.title;
|
|
dates = role.dates;
|
|
items = (nixpkgs.lib.splitString "\n" (nixpkgs.lib.trim (escapeLatex role.work)));
|
|
}) item.roles;
|
|
}
|
|
) experience;
|
|
};
|
|
|
|
mkProjects = projects:
|
|
mkProjectSection {
|
|
label = "Projects";
|
|
children = map (item: {
|
|
heading = item.name;
|
|
location = item.link;
|
|
children = [
|
|
{
|
|
subheading = item.subtext;
|
|
dates = item.dates;
|
|
items = (nixpkgs.lib.splitString "\n" (nixpkgs.lib.trim (escapeLatex item.description)));
|
|
}
|
|
];
|
|
}
|
|
) projects;
|
|
};
|
|
|
|
mkProjectSection = section:
|
|
''
|
|
\section{${section.label}}
|
|
\begin{itemize}[leftmargin=*]
|
|
|
|
${builtins.concatStringsSep "\n" (map mkProjectSectionChild section.children)}
|
|
|
|
\end{itemize}
|
|
'';
|
|
|
|
mkProjectSectionChild = child:
|
|
''
|
|
\vspace{-2pt}\item
|
|
\begin{tabular*}{0.97\textwidth}[t]{l@{\extracolsep{\fill}}r}
|
|
\textbf{${child.heading}} & \textit{${(builtins.head child.children).dates}} \\
|
|
\end{tabular*}\vspace{${vspace}}
|
|
|
|
\begin{itemize}
|
|
${builtins.concatStringsSep "\n" (map mkItem (builtins.head child.children).items)}
|
|
\end{itemize}\vspace{${vspace}}
|
|
|
|
'';
|
|
|
|
mkLeadership = leadership:
|
|
mkSection {
|
|
label = "Leadership Experience";
|
|
children = map (item: {
|
|
heading = item.name;
|
|
location = item.location;
|
|
children = [
|
|
{
|
|
subheading = item.role;
|
|
dates = item.dates;
|
|
items = (nixpkgs.lib.splitString "\n" (nixpkgs.lib.trim (escapeLatex item.description)));
|
|
}
|
|
];
|
|
}
|
|
) leadership;
|
|
};
|
|
|
|
mkAwards = awards:
|
|
mkSection {
|
|
label = "Honors and Awards";
|
|
children = map (item: {
|
|
heading = item.name;
|
|
location = item.location;
|
|
children = [
|
|
{
|
|
subheading = item.award;
|
|
dates = item.dates;
|
|
items = (nixpkgs.lib.splitString "\n" (nixpkgs.lib.trim (escapeLatex item.description)));
|
|
}
|
|
];
|
|
}
|
|
) awards;
|
|
};
|
|
|
|
mkSkills = skills:
|
|
''
|
|
\section{Skills and Interests}
|
|
\begin{itemize}[leftmargin=*]
|
|
${builtins.concatStringsSep "\n" (nixpkgs.lib.mapAttrsToList (key: val: ''
|
|
|
|
\item\small{
|
|
{\textbf{${key}} \vspace{-2pt}}
|
|
}{${val}}\vspace{-4pt}
|
|
'') skills)}
|
|
\end{itemize}
|
|
|
|
'';
|
|
|
|
texContent = ''
|
|
%-------------------------
|
|
% Resume in LateX
|
|
% Author : Max Koon
|
|
% License : MIT
|
|
%------------------------
|
|
|
|
\documentclass[letterpaper,11pt]{article}
|
|
|
|
\usepackage{latexsym}
|
|
\usepackage[empty]{fullpage}
|
|
\usepackage{titlesec}
|
|
\usepackage{marvosym}
|
|
\usepackage[usenames,dvipsnames]{color}
|
|
\usepackage{verbatim}
|
|
\usepackage{enumitem}
|
|
\usepackage[hidelinks]{hyperref}
|
|
\usepackage{fancyhdr}
|
|
\usepackage[english]{babel}
|
|
\usepackage{tabularx}
|
|
\input{glyphtounicode}
|
|
|
|
\usepackage{bookmark}
|
|
|
|
\pagestyle{fancy}
|
|
\fancyhf{} % Clear all header and footer fields
|
|
\fancyfoot{}
|
|
\renewcommand{\headrulewidth}{0pt}
|
|
\renewcommand{\footrulewidth}{0pt}
|
|
|
|
% Adjust margins
|
|
\addtolength{\oddsidemargin}{-0.5in}
|
|
\addtolength{\evensidemargin}{-0.5in}
|
|
\addtolength{\textwidth}{1in}
|
|
\addtolength{\topmargin}{-.5in}
|
|
\addtolength{\textheight}{1.0in}
|
|
|
|
\urlstyle{same}
|
|
|
|
\raggedbottom
|
|
\raggedright
|
|
\setlength{\tabcolsep}{0in}
|
|
|
|
% Sections formatting
|
|
\titleformat{\section}{
|
|
\vspace{-4pt}\scshape\raggedright\large
|
|
}{}{0em}{}[\color{black}\titlerule \vspace{-5pt}]
|
|
|
|
% Ensure that generate PDF is machine readable/ATS parsable
|
|
\pdfgentounicode=1
|
|
|
|
%-------------------------
|
|
|
|
\newcommand{\resumeSubItem}[2]{
|
|
}
|
|
|
|
\renewcommand{\labelitemii}{$\circ$}
|
|
|
|
%-------------------------------------------
|
|
%%%%%% CV STARTS HERE %%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
|
|
\begin{document}
|
|
|
|
${mkPersonal resume.personal}
|
|
${if resume.education.enabled
|
|
then mkEducation resume.education.content
|
|
else ""}
|
|
${if resume.experience.enabled
|
|
then mkExperience resume.experience.content
|
|
else ""}
|
|
${if resume.projects.enabled
|
|
then mkProjects resume.projects.content
|
|
else ""}
|
|
${if resume.leadership.enabled
|
|
then mkLeadership resume.leadership.content
|
|
else ""}
|
|
${if resume.awards.enabled
|
|
then mkAwards resume.awards.content
|
|
else ""}
|
|
${if resume.skills.enabled
|
|
then mkSkills resume.skills.content
|
|
else ""}
|
|
|
|
%-------------------------------------------
|
|
\end{document}
|
|
'';
|
|
in {
|
|
|
|
defaultPackage.aarch64-linux =
|
|
with import nixpkgs { system = "aarch64-linux"; };
|
|
stdenv.mkDerivation {
|
|
name = "resume";
|
|
src = self;
|
|
|
|
nativeBuildInputs = [
|
|
texliveFull
|
|
];
|
|
|
|
buildPhase = ''
|
|
cat > resume.tex << 'EOF'
|
|
${texContent}
|
|
EOF
|
|
|
|
pdflatex resume.tex
|
|
'';
|
|
|
|
installPhase = ''
|
|
mkdir -p $out
|
|
cp resume.pdf $out/
|
|
'';
|
|
};
|
|
|
|
};
|
|
}
|