Skip to content

rendercv.themes.engineeringresumes

EntryAreaMarginsForEngineeringresumes

Bases: EntryAreaMargins

This class is a data model for the entry area margins.

Source code in rendercv/themes/engineeringresumes/__init__.py
class EntryAreaMarginsForEngineeringresumes(EntryAreaMargins):
    """This class is a data model for the entry area margins."""

    left_and_right: LaTeXDimension = pydantic.Field(
        default="0 cm",
        title="Left Margin",
        description="The left margin of entry areas. The default value is 0 cm.",
    )

HighlightsAreaMarginsForEngineeringresumes

Bases: HighlightsAreaMargins

This class is a data model for the highlights area margins.

Source code in rendercv/themes/engineeringresumes/__init__.py
class HighlightsAreaMarginsForEngineeringresumes(HighlightsAreaMargins):
    """This class is a data model for the highlights area margins."""

    top: LaTeXDimension = pydantic.Field(
        default="0.10 cm",
        title="Top Margin",
        description="The top margin of highlights areas. The default value is 0.10 cm.",
    )
    left: LaTeXDimension = pydantic.Field(
        default="0 cm",
        title="Left Margin",
        description="The left margin of highlights areas. The default value is 0 cm.",
    )
    vertical_between_bullet_points: LaTeXDimension = pydantic.Field(
        default="0.10 cm",
        title="Vertical Margin Between Bullet Points",
        description=(
            "The vertical margin between bullet points. The default value is 0.10 cm."
        ),
    )

HeaderMarginsForEngineeringresumes

Bases: HeaderMargins

This class is a data model for the header margins.

Source code in rendercv/themes/engineeringresumes/__init__.py
class HeaderMarginsForEngineeringresumes(HeaderMargins):
    """This class is a data model for the header margins."""

    vertical_between_name_and_connections: LaTeXDimension = pydantic.Field(
        default="5 pt",
        title="Vertical Margin Between the Name and Connections",
        description=(
            "The vertical margin between the name of the person and the connections."
            " The default value is 5 pt."
        ),
    )
    bottom: LaTeXDimension = pydantic.Field(
        default="5 pt",
        title="Bottom Margin",
        description=(
            "The bottom margin of the header, i.e., the vertical margin between the"
            " connections and the first section title. The default value is 5 pt."
        ),
    )
    horizontal_between_connections: LaTeXDimension = pydantic.Field(
        default="10 pt",
        title="Space Between Connections",
        description=(
            "The space between the connections (like phone, email, and website). The"
            " default value is 20 pt."
        ),
    )

MarginsForEngineeringresumes

Bases: Margins

This class is a data model for the margins.

Source code in rendercv/themes/engineeringresumes/__init__.py
class MarginsForEngineeringresumes(Margins):
    """This class is a data model for the margins."""

    entry_area: EntryAreaMarginsForEngineeringresumes = pydantic.Field(
        default=EntryAreaMarginsForEngineeringresumes(),
        title="Entry Area Margins",
        description="Entry area margins.",
    )
    highlights_area: HighlightsAreaMarginsForEngineeringresumes = pydantic.Field(
        default=HighlightsAreaMarginsForEngineeringresumes(),
        title="Highlights Area Margins",
        description="Highlights area margins.",
    )
    header: HeaderMarginsForEngineeringresumes = pydantic.Field(
        default=HeaderMarginsForEngineeringresumes(),
        title="Header Margins",
        description="Header margins.",
    )

EngineeringresumesThemeOptions

Bases: ThemeOptions

This class is the data model of the theme options for the engineeringresumes theme.

Source code in rendercv/themes/engineeringresumes/__init__.py
class EngineeringresumesThemeOptions(ThemeOptions):
    """This class is the data model of the theme options for the `engineeringresumes`
    theme.
    """

    theme: Literal["engineeringresumes"]
    font: Literal[
        "Latin Modern Serif",
        "Latin Modern Sans Serif",
        "Latin Modern Mono",
        "Source Sans 3",
        "Charter",
    ] = pydantic.Field(
        default="Charter",
        title="Font",
        description="The font family of the CV. The default value is Charter.",
    )
    header_font_size: LaTeXDimension = pydantic.Field(
        default="25 pt",
        title="Header Font Size",
        description=(
            "The font size of the header (the name of the person). The default value is"
            " 25 pt."
        ),
    )
    color: pydantic_color.Color = pydantic.Field(
        default="rgb(0,0,0)",
        validate_default=True,
        title="Primary Color",
        description=(
            "The primary color of the theme. \nThe color can be specified either with"
            " their [name](https://www.w3.org/TR/SVG11/types.html#ColorKeywords),"
            " hexadecimal value, RGB value, or HSL value. The default value is"
            " rgb(0,0,0)."
        ),
        examples=["Black", "7fffd4", "rgb(0,79,144)", "hsl(270, 60%, 70%)"],
    )
    disable_external_link_icons: bool = pydantic.Field(
        default=True,
        title="Disable External Link Icons",
        description=(
            "If this option is set to true, then the external link icons will not be"
            " shown next to the links. The default value is true."
        ),
    )
    disable_page_numbering: bool = pydantic.Field(
        default=True,
        title="Disable Page Numbering",
        description=(
            "If this option is set to true, then the page numbering will not be shown."
            " The default value is true."
        ),
    )
    disable_last_updated_date: bool = pydantic.Field(
        default=True,
        title="Disable Last Updated Date",
        description=(
            "If this option is set to true, then the last updated date will not be"
            " shown in the header. The default value is true."
        ),
    )
    text_alignment: Literal[
        "left-aligned", "justified", "justified-with-no-hyphenation"
    ] = pydantic.Field(
        default="left-aligned",
        title="Text Alignment",
        description="The alignment of the text. The default value is left-aligned.",
    )
    seperator_between_connections: str = pydantic.Field(
        default="$|$",
        title="Seperator Between Connections",
        description=(
            "The separator between the connections in the header. The default value is"
            " empty string."
        ),
    )
    use_icons_for_connections: bool = pydantic.Field(
        default=False,
        title="Use Icons for Connections",
        description=(
            "If this option is set to true, then icons will be used for the connections"
            " (like phone, email, and website). The default value is false."
        ),
    )
    margins: MarginsForEngineeringresumes = pydantic.Field(
        default=MarginsForEngineeringresumes(),
        title="Margins",
        description="Page, section title, entry field, and highlights field margins.",
    )

Jinja Templates

Preamble.j2.tex

\documentclass[<<design.font_size>>, <<design.page_size>>]{article}

% Packages:
\usepackage[
    ignoreheadfoot, % set margins without considering header and footer
    top=<<design.margins.page.top>>, % seperation between body and page edge from the top
    bottom=<<design.margins.page.bottom>>, % seperation between body and page edge from the bottom
    left=<<design.margins.page.left>>, % seperation between body and page edge from the left
    right=<<design.margins.page.right>>, % seperation between body and page edge from the right
    footskip=<<design.margins.page.bottom|divide_length_by(2)>>, % seperation between body and footer
    % showframe % for debugging 
]{geometry} % for adjusting page geometry
\usepackage{titlesec} % for customizing section titles
\usepackage{tabularx} % for making tables with fixed width columns
\usepackage{array} % tabularx requires this
\usepackage[dvipsnames]{xcolor} % for coloring text
\definecolor{primaryColor}{RGB}{<<design.color.as_rgb_tuple()|join(", ")>>} % define primary color
\usepackage{enumitem} % for customizing lists
\usepackage{fontawesome5} % for using icons
\usepackage{amsmath} % for math
\usepackage[
    pdftitle={<<cv.name>>'s CV},
    pdfauthor={<<cv.name>>},
    pdfcreator={LaTeX with RenderCV},
    colorlinks=true,
    urlcolor=primaryColor
]{hyperref} % for links, metadata and bookmarks
\usepackage[pscoord]{eso-pic} % for floating text on the page
\usepackage{calc} % for calculating lengths
\usepackage{bookmark} % for bookmarks
\usepackage{lastpage} % for getting the total number of pages
\usepackage{changepage} % for one column entries (adjustwidth environment)
\usepackage{paracol} % for two and three column entries
\usepackage{ifthen} % for conditional statements
\usepackage{needspace} % for avoiding page brake right after the section title
\usepackage{iftex} % check if engine is pdflatex, xetex or luatex

% Ensure that generate pdf is machine readable/ATS parsable:
\ifPDFTeX
    \input{glyphtounicode}
    \pdfgentounicode=1
    \usepackage[T1]{fontenc}
    \usepackage[utf8]{inputenc}
    \usepackage{lmodern}
\fi

((* if design.font == "Latin Modern Serif" *))

((* elif design.font == "Latin Modern Sans Serif" *))
\renewcommand{\familydefault}{\sfdefault}
((* elif design.font == "Latin Modern Mono" *))
\renewcommand{\familydefault}{\ttdefault}
((* elif design.font == "Source Sans 3" *))
\usepackage[default, type1]{sourcesanspro} 
((* elif design.font == "Charter" *))
\usepackage{charter}
((* endif *))

% Some settings:
((* if design.text_alignment == "justified-with-no-hyphenation" *))
\usepackage[none]{hyphenat}
\sloppy
((* elif design.text_alignment == "left-aligned" *))
\raggedright
((* endif *))
\AtBeginEnvironment{adjustwidth}{\partopsep0pt} % remove space before adjustwidth environment
\pagestyle{empty} % no header or footer
\setcounter{secnumdepth}{0} % no section numbering
\setlength{\parindent}{0pt} % no indentation
\setlength{\topskip}{0pt} % no top skip
\setlength{\columnsep}{0.15cm} % set column seperation
((* if design.disable_page_numbering *))
\pagenumbering{gobble} % no page numbering
((* else *))
((* set page_numbering_style_placeholders = {
    "NAME": cv.name,
    "PAGE_NUMBER": "\\thepage{}",
    "TOTAL_PAGES": "\pageref*{LastPage}",
    "TODAY": today
} *))
\makeatletter
\let\ps@customFooterStyle\ps@plain % Copy the plain style to customFooterStyle
\patchcmd{\ps@customFooterStyle}{\thepage}{
    \color{gray}\textit{\small <<design.page_numbering_style|replace_placeholders_with_actual_values(page_numbering_style_placeholders)>>}
}{}{} % replace number by desired string
\makeatother
\pagestyle{customFooterStyle}
((* endif *))

\titleformat{\section}{\needspace{4\baselineskip}\bfseries\large}{}{0pt}{}[\vspace{1pt}\titlerule]

\titlespacing{\section}{
    % left space:
    -1pt
}{
    % top space:
    <<design.margins.section_title.top>>
}{
    % bottom space:
    <<design.margins.section_title.bottom>>
} % section title spacing

\renewcommand\labelitemi{$\vcenter{\hbox{\small$\bullet$}}$} % custom bullet points
\newenvironment{highlights}{
    \begin{itemize}[
        topsep=<<design.margins.highlights_area.top>>,
        parsep=<<design.margins.highlights_area.vertical_between_bullet_points>>,
        partopsep=0pt,
        itemsep=0pt,
        leftmargin=<<design.margins.highlights_area.left>> + 10pt
    ]
}{
    \end{itemize}
} % new environment for highlights


\newenvironment{highlightsforbulletentries}{
    \begin{itemize}[
        topsep=<<design.margins.highlights_area.top>>,
        parsep=<<design.margins.highlights_area.vertical_between_bullet_points>>,
        partopsep=0pt,
        itemsep=0pt,
        leftmargin=10pt
    ]
}{
    \end{itemize}
} % new environment for highlights for bullet entries

\newenvironment{onecolentry}{
    \begin{adjustwidth}{
        <<design.margins.entry_area.left_and_right>> + 0.00001 cm
    }{
        <<design.margins.entry_area.left_and_right>> + 0.00001 cm
    }
}{
    \end{adjustwidth}
} % new environment for one column entries

\newenvironment{twocolentry}[2][]{
    \onecolentry
    \def\secondColumn{#2}
    \setcolumnwidth{\fill, <<design.margins.entry_area.date_and_location_width>>}
    \begin{paracol}{2}
}{
    \switchcolumn \raggedleft \secondColumn
    \end{paracol}
    \endonecolentry
} % new environment for two column entries

\newenvironment{threecolentry}[3][]{
    \onecolentry
    \def\thirdColumn{#3}
    \setcolumnwidth{<<design.margins.entry_area.education_degree_width>>, \fill, <<design.margins.entry_area.date_and_location_width>>}
    \begin{paracol}{3}
    {\raggedright #2} \switchcolumn
}{
    \switchcolumn \raggedleft \thirdColumn
    \end{paracol}
    \endonecolentry
} % new environment for three column entries

\newenvironment{header}{
    \setlength{\topsep}{0pt}\par\kern\topsep\centering\linespread{1.5}
}{
    \par\kern\topsep
} % new environment for the header

((* set last_updated_date_style_placeholders = {
    "TODAY": today,
} *))
\newcommand{\placelastupdatedtext}{% \placetextbox{<horizontal pos>}{<vertical pos>}{<stuff>}
  \AddToShipoutPictureFG*{% Add <stuff> to current page foreground
    \put(
        \LenToUnit{\paperwidth-<<design.margins.page.right>>-<<design.margins.entry_area.left_and_right>>+0.05cm},
        \LenToUnit{\paperheight-<<design.margins.page.top|divide_length_by(2)>>}
    ){\vtop{{\null}\makebox[0pt][c]{
        \small\color{gray}\textit{<<design.last_updated_date_style|replace_placeholders_with_actual_values(last_updated_date_style_placeholders)>>}\hspace{\widthof{<<design.last_updated_date_style|replace_placeholders_with_actual_values(last_updated_date_style_placeholders)>>}}
    }}}%
  }%
}%

% save the original href command in a new command:
\let\hrefWithoutArrow\href

% new command for external links:
((* if not design.disable_external_link_icons *))
\renewcommand{\href}[2]{\hrefWithoutArrow{#1}{\ifthenelse{\equal{#2}{}}{ }{#2 }\raisebox{.15ex}{\footnotesize \faExternalLink*}}}
((* endif *))

Header.j2.tex

\newcommand{\AND}{\unskip
    \cleaders\copy\ANDbox\hskip\wd\ANDbox
    \ignorespaces
}
\newsavebox\ANDbox
\sbox\ANDbox{<<design.seperator_between_connections>>}

((* if not design.disable_last_updated_date *))
\placelastupdatedtext
((* endif *))
((* if cv.name is not none *))
\begin{header}
    \fontsize{<<design.header_font_size>>}{<<design.header_font_size>>}\selectfont <<cv.name>>

    \vspace{<<design.margins.header.vertical_between_name_and_connections>>}

    \normalsize
    ((* for connection in cv.connections *))
        ((* if design.use_icons_for_connections *))
    \mbox{((*- if connection["url"] -*))
        \hrefWithoutArrow{<<connection["url"]>>}{{\footnotesize<<connection["latex_icon"]>>}\hspace*{0.13cm}<<connection["placeholder"]|escape_latex_characters>>}
        ((*- else -*))
        {\footnotesize<<connection["latex_icon"]>>}\hspace*{0.13cm}<<connection["placeholder"]|escape_latex_characters>>
        ((*- endif -*))}%
        ((* else *))
    \mbox{((*- if connection["url"] -*))
        \hrefWithoutArrow{<<connection["url"]>>}{<<connection["clean_url"]|escape_latex_characters>>}
        ((*- else -*))
        <<connection["placeholder"]|escape_latex_characters>>
        ((*- endif -*))}%
        ((* endif *))
        ((* if not loop.last *))
    \kern <<design.margins.header.horizontal_between_connections|divide_length_by(2)>>%
    \AND%
    \kern <<design.margins.header.horizontal_between_connections|divide_length_by(2)>>%
        ((* endif *))
    ((* endfor *))
\end{header}

\vspace{<<design.margins.header.bottom>> - <<design.margins.section_title.top>>}
((* endif *))

SectionBeginning.j2.tex

\section{<<section_title>>}

((* if entry_type == "BulletEntry" *))
\begin{onecolentry}
    \begin{highlightsforbulletentries}
((* endif *))

SectionEnding.j2.tex

((* if entry_type == "BulletEntry" *))
    \end{highlightsforbulletentries}
\end{onecolentry}
((* endif *))

TextEntry.j2.tex

((* if not is_first_entry *))
\vspace{<<design.margins.entry_area.vertical_between>>}
((* endif *))

\begin{onecolentry}
    <<entry>>
\end{onecolentry}

BulletEntry.j2.tex

\item <<entry.bullet>>

OneLineEntry.j2.tex

((* if not is_first_entry *))
\vspace{<<design.margins.entry_area.vertical_between>>}
((* endif *))

\begin{onecolentry}
    \textbf{<<entry.label>>:} <<entry.details>>
\end{onecolentry}

EducationEntry.j2.tex

((* if not is_first_entry *))
\vspace{<<design.margins.entry_area.vertical_between>>}
((* endif *))

((* if entry.date_string *))
\begin{twocolentry}{
    <<entry.date_string>>
}
((* else *))
\begin{onecolentry}
((* endif *))
    \textbf{<<entry.institution>>}, ((* if entry.degree *))<<entry.degree>> in ((* endif *))<<entry.area>>((* if entry.location *)) -- <<entry.location>>((* endif *))
((* if entry.date_string *))
\end{twocolentry}
((* else *))
\end{onecolentry}
((* endif *))

((* for item in entry.highlights *))
    ((* if loop.first *))
\vspace{<<design.margins.highlights_area.top>>}
\begin{onecolentry}
    \begin{highlights}
    ((* endif *))
        \item <<item>>
    ((* if loop.last *))
    \end{highlights}
\end{onecolentry}
    ((* endif *))
((* endfor *))

ExperienceEntry.j2.tex

((* if not is_first_entry *))
\vspace{<<design.margins.entry_area.vertical_between>>}
((* endif *))

((* if entry.date_string *))
\begin{twocolentry}{
    <<entry.date_string>>
}
((* else *))
\begin{onecolentry}
((* endif *))
    \textbf{<<entry.position>>}, <<entry.company>>((* if entry.location *)) -- <<entry.location>>((* endif *))
((* if entry.date_string *))
\end{twocolentry}
((* else *))
\end{onecolentry}
((* endif *))

((* for item in entry.highlights *))
    ((* if loop.first *))
\vspace{<<design.margins.highlights_area.top>>}
\begin{onecolentry}
    \begin{highlights}
    ((* endif *))
        \item <<item>>
    ((* if loop.last *))
    \end{highlights}
\end{onecolentry}
    ((* endif *))
((* endfor *))

NormalEntry.j2.tex

((* if not is_first_entry *))
\vspace{<<design.margins.entry_area.vertical_between>>}
((* endif *))

((* if entry.date_string *))
\begin{twocolentry}{
    <<entry.date_string>>
}
((* else *))
\begin{onecolentry}
((* endif *))
    \textbf{<<entry.name>>}((* if entry.location *)) -- <<entry.location>>((* endif *))
((* if entry.date_string *))
\end{twocolentry}
((* else *))
\end{onecolentry}
((* endif *))

((* for item in entry.highlights *))
    ((* if loop.first *))
\vspace{<<design.margins.highlights_area.top>>}
\begin{onecolentry}
    \begin{highlights}
    ((* endif *))
        \item <<item>>
    ((* if loop.last *))
    \end{highlights}
\end{onecolentry}
    ((* endif *))
((* endfor *))

PublicationEntry.j2.tex

((* if not is_first_entry *))
\vspace{<<design.margins.entry_area.vertical_between>>}
((* endif *))

\begin{samepage}
    ((* if entry.date_string *))
    \begin{twocolentry}{
        <<entry.date_string>>
    }
    ((* else *))
    \begin{onecolentry}
    ((* endif *))
        \textbf{<<entry.title>>}
    ((* if entry.date_string *))
    \end{twocolentry}
    ((* else *))
    \end{onecolentry}
    ((* endif *))

    \vspace{<<design.margins.highlights_area.top>>}

    \begin{onecolentry}
        <<entry.authors|map("make_it_nolinebreak")|join(", ")>>

        ((* if entry.doi or entry.journal or entry.url *))
        \vspace{<<design.margins.highlights_area.vertical_between_bullet_points>>}
        ((* endif *))

        ((* if entry.doi -*))
        \href{<<entry.doi_url>>}{<<entry.doi>>}
        ((* elif entry.url -*))
        \href{<<entry.url>>}{<<entry.clean_url>>}
        ((*- endif -*))
        ((*- if (entry.doi or entry.url) and entry.journal *)) (((* endif -*))
        ((*- if entry.journal -*))
        <<entry.journal>>
        ((*- endif -*))
        ((*- if (entry.doi or entry.url) and entry.journal *)))((* endif -*))
    \end{onecolentry}
\end{samepage}