finalize sb2nov theme

This commit is contained in:
Sina Atalay 2024-02-15 19:30:21 +01:00
parent 0a4583dce0
commit 945a33a176
11 changed files with 149 additions and 62 deletions

View File

@ -0,0 +1,12 @@
\resumeSubheading
{<<entry.institution>>}{<<entry.location>>}
{((* if entry.degree *))<<entry.degree>> in ((* endif *))<<entry.area>>}{<<entry.date_string>>}
((* for item in entry.highlights *))
((* if loop.first *))
\resumeItemListStart
((* endif *))
\resumeItem{}{<<item>>}
((* if loop.last *))
\resumeItemListEnd
((* endif *))
((* endfor *))

View File

@ -0,0 +1,12 @@
\resumeSubheading
{<<entry.company>>}{<<entry.location>>}
{<<entry.position>>}{<<entry.date_string>>}
((* for item in entry.highlights *))
((* if loop.first *))
\resumeItemListStart
((* endif *))
\resumeItem{}{<<item>>}
((* if loop.last *))
\resumeItemListEnd
((* endif *))
((* endfor *))

View File

@ -0,0 +1,42 @@
\begin{center}
\textbf{\Huge \scshape <<cv.name>>} \\ \vspace{3pt}
\small
((* if cv.phone *))
\mbox{\href{<<cv.phone|replace("-","")>>}{{\footnotesize\faPhone*}\hspace{4pt}<<cv.phone|replace("tel:", "")|replace("-"," ")>>}}
\hspace{<<design.space_between_connection_objects>>}
((* endif *))
((* if cv.email *))
\mbox{\href{mailto:<<cv.email>>}{{\small\faEnvelope[regular]}\hspace{4pt}<<cv.email>>}}
\hspace{<<design.space_between_connection_objects>>}
((* endif *))
((* if cv.location *))
\mbox{{\small\faMapMarker*}\hspace{4pt}<<cv.location>>}
\hspace{<<design.space_between_connection_objects>>}
((* endif *))
((* if cv.website *))
\mbox{\href{<<cv.website>>}{{\small\faLink}\hspace{4pt}<<cv.website|replace("https://","")|reverse|replace("/", "", 1)|reverse>>}}
\hspace{<<design.space_between_connection_objects>>}
((* endif *))
((*
set icon_dictionary = {
"LinkedIn": "\\faLinkedinIn",
"GitHub": "\\faGithub",
"Instagram": "\\faInstagram",
"Mastodon": "\\faMastodon",
}
*))
((* if cv.social_networks *))
((* for network in cv.social_networks *))
((* if network.network in icon_dictionary *))
\mbox{\href{<<network.url>>}{{\small<<icon_dictionary[network.network]>>}\hspace{4pt}<<network.username>>}}
\hspace{<<design.space_between_connection_objects>>}
((* endif *))
((* endfor *))
((* endif *))
\end{center}
% save the original href command in a new command:
\let\hrefWithoutArrow\href
% new command for external links:
\renewcommand{\href}[2]{\hrefWithoutArrow{#1}{\mbox{#2 \raisebox{.15ex}{\footnotesize \faExternalLink*}}}}

View File

@ -0,0 +1,11 @@
\resumeNormalSubheading
{<<entry.name>>}{((* if entry.date_string == "" *))<<entry.location>>((* else *))<<entry.date_string>>((* endif *))}
((* for item in entry.highlights *))
((* if loop.first *))
\resumeItemListStart
((* endif *))
\resumeItem{}{<<item>>}
((* if loop.last *))
\resumeItemListEnd
((* endif *))
((* endfor *))

View File

@ -0,0 +1,2 @@
\resumeSubItem{<<entry.name>>}
{<<entry.details>>}

View File

@ -17,6 +17,9 @@
\usepackage{fancyhdr} \usepackage{fancyhdr}
\usepackage[english]{babel} \usepackage[english]{babel}
\usepackage{tabularx} \usepackage{tabularx}
\usepackage{ifthen}
\usepackage{enumitem}
\usepackage{fontawesome5}
\input{glyphtounicode} \input{glyphtounicode}
\pagestyle{fancy} \pagestyle{fancy}
@ -46,34 +49,40 @@
% Ensure that generate pdf is machine readable/ATS parsable % Ensure that generate pdf is machine readable/ATS parsable
\pdfgentounicode=1 \pdfgentounicode=1
\setlist{rightmargin=5pt}
\newcolumntype{R}[1]{
>{\raggedleft\let\newline\\\arraybackslash\hspace{0pt}}p{#1}
} % right-aligned fixed width column type
%------------------------- %-------------------------
% Custom commands % Custom commands
\newcommand{\resumeItem}[2]{ \newcommand{\resumeItem}[2]{
\item\small{ \item\small{
\textbf{#1}{: #2 \vspace{-2pt}} \ifthenelse{\equal{#1}{}}{#2 \vspace{-2pt}}{\textbf{#1}{: #2 \vspace{-2pt}}}
} }
} }
% Just in case someone needs a heading that does not need to be in a list % Just in case someone needs a heading that does not need to be in a list
\newcommand{\resumeHeading}[4]{
\begin{tabular*}{0.99\textwidth}[t]{l@{\extracolsep{\fill}}r}
\textbf{#1} & #2 \\
\textit{\small#3} & \textit{\small #4} \\
\end{tabular*}\vspace{-5pt}
}
\newcommand{\resumeSubheading}[4]{ \newcommand{\resumeSubheading}[4]{
\vspace{-1pt}\item \vspace{-1pt}\item
\begin{tabular*}{0.97\textwidth}[t]{l@{\extracolsep{\fill}}r} \begin{tabularx}{0.97\textwidth}[t]{X R{4.1cm}}
\textbf{#1} & #2 \\ \textbf{#1} & \textit{\small\ifthenelse{\equal{#2}{}}{#4}{#2}} \\
\textit{\small#3} & \textit{\small #4} \\ \textit{\small#3} & \textit{\small\ifthenelse{\equal{#2}{}}{}{#4}} \\
\end{tabular*}\vspace{-5pt} \end{tabularx}\vspace{-5pt}
}
\newcommand{\resumeNormalSubheading}[2]{
\vspace{-1pt}\item
\begin{tabularx}{0.97\textwidth}[t]{l@{\extracolsep{\fill}}r}
\textbf{#1} & \textit{\small #2}
\end{tabularx}\vspace{-5pt}
} }
\newcommand{\resumeSubSubheading}[2]{ \newcommand{\resumeSubSubheading}[2]{
\begin{tabular*}{0.97\textwidth}{l@{\extracolsep{\fill}}r} \begin{tabularx}{0.97\textwidth}{l@{\extracolsep{\fill}}r}
\textit{\small#1} & \textit{\small #2} \\ \textit{\small#1} & \textit{\small #2} \\
\end{tabular*}\vspace{-5pt} \end{tabularx}\vspace{-5pt}
} }
\newcommand{\resumeSubItem}[2]{\resumeItem{#1}{#2}\vspace{-4pt}} \newcommand{\resumeSubItem}[2]{\resumeItem{#1}{#2}\vspace{-4pt}}
@ -83,4 +92,4 @@
\newcommand{\resumeSubHeadingListStart}{\begin{itemize}[leftmargin=*]} \newcommand{\resumeSubHeadingListStart}{\begin{itemize}[leftmargin=*]}
\newcommand{\resumeSubHeadingListEnd}{\end{itemize}} \newcommand{\resumeSubHeadingListEnd}{\end{itemize}}
\newcommand{\resumeItemListStart}{\begin{itemize}} \newcommand{\resumeItemListStart}{\begin{itemize}}
\newcommand{\resumeItemListEnd}{\end{itemize}\vspace{-5pt}} \newcommand{\resumeItemListEnd}{\end{itemize}\vspace{-5pt}}

View File

@ -0,0 +1,6 @@
\resumeSubheading
{<<entry.title>>}{<<entry.date_string>>}
{\href{<<entry.doi_url>>}{<<entry.doi>>}}{}
\resumeItemListStart
\resumeItem{}{<<entry.authors|map("abbreviate_name")|map("make_it_nolinebreak")|join(", ")|make_it_bold(cv.name|abbreviate_name)|make_it_italic(cv.name|abbreviate_name)>>}
\resumeItemListEnd

View File

@ -0,0 +1,2 @@
\section{<<section_title>>}
\resumeSubHeadingListStart

View File

@ -0,0 +1 @@
\resumeSubHeadingListEnd

View File

@ -0,0 +1 @@
\resumeSubItem{}{<<entry>>}

View File

@ -17,70 +17,59 @@ class Sb2novThemeOptions(pydantic.BaseModel):
model_config = pydantic.ConfigDict(extra="forbid") model_config = pydantic.ConfigDict(extra="forbid")
theme: Literal["sb2nov"] theme: Literal["sb2nov"]
font_size: Literal["10pt", "11pt", "12pt"] = pydantic.Field( font_size: Literal["10pt", "11pt", "12pt"] = pydantic.Field(
default="10pt", default="10pt",
title="Font Size", title="Font Size",
description='The font size of the CV. The default value is "10pt".', description="The font size of the CV. It can be 10pt, 11pt, or 12pt.",
examples=["10pt", "11pt", "12pt"],
) )
page_size: Literal["a4paper", "letterpaper"] = pydantic.Field( page_size: Literal["a4paper", "letterpaper"] = pydantic.Field(
default="a4paper", default="a4paper",
title="Page Size", title="Page Size",
description='The page size of the CV. The default value is "a4paper".', description="The page size of the CV. It can be a4paper or letterpaper.",
examples=["a4paper", "letterpaper"],
) )
color: ( disable_page_numbering: bool = pydantic.Field(
Literal["blue"] default=False,
| Literal["black"] title="Disable Page Numbering",
| Literal["burgundy"] description=(
| Literal["green"] "If this option is set to true, then the page numbering will be disabled."
| Literal["grey"] ),
| Literal["orange"]
| Literal["purple"]
| Literal["red"]
) = pydantic.Field(
default="blue",
validate_default=True,
title="Primary Color",
description='The primary color of the CV. The default value is "blue".',
examples=[
"blue",
"black",
"burgundy",
"green",
"grey",
"orange",
"purple",
"red",
],
) )
date_width: LaTeXDimension = pydantic.Field( date_and_location_width: LaTeXDimension = pydantic.Field(
default="3.8 cm", default="4.1 cm",
validate_default=True,
title="Date and Location Column Width", title="Date and Location Column Width",
description='The width of the date column. The default value is "3.8 cm".', description="The width of the date and location column.",
) )
content_scale: float = pydantic.Field( space_between_connection_objects: LaTeXDimension = pydantic.Field(
default=0.75, default="0.5 cm",
title="Content Scale", title="Space Between Connection Objects",
description=( description=(
"The scale of the content with respect to the page size. The default value" "The space between the connection objects (like phone, email, and website)."
' is "0.75".'
), ),
) )
show_only_years: bool = pydantic.Field( text_alignment: Literal["left-aligned", "justified"] = pydantic.Field(
default=False, default="left-aligned",
title="Show Only Years", title="Text Alignment",
description="The alignment of the text.",
)
show_timespan_in: list[str] = pydantic.Field(
default=[],
title="Show Time Span in These Sections",
description=( description=(
'If "True", only the years will be shown in the date column. The default' "The time span will be shown in the date and location column in these"
' value is "False".' " sections. The input should be a list of strings."
), ),
) )
disable_page_numbers: bool = pydantic.Field( show_last_updated_date: bool = pydantic.Field(
default=False, default=True,
title="Disable Page Numbers", title="Show Last Updated Date",
description=( description=(
'If "True", the page numbers will be disabled. The default value is' "If this option is set to true, then the last updated date will be shown"
' "False".' " in the header."
), ),
) )
header_font_size: LaTeXDimension = pydantic.Field(
default="30 pt",
title="Header Font Size",
description="The font size of the header (the name of the person).",
)