LaTeX Template Guide (Docs)
Technical documentation for Vitae LaTeX templates: fork workflow, .tex and .sty roles, placeholders, and safe iteration.
LaTeX template mode is for teams that need strict output control. If you are new to LaTeX, follow the fork-first workflow below instead of starting from blank files.
Plan requirement
Noob-safe workflow: always fork first
- Choose an existing template close to your target style.
- Fork it to create a safe editable copy.
- Edit incrementally and preview after each change.
.tex vs .sty explained simply
- .tex: layout skeleton and placeholder placement.
- .sty: rendering commands/macros and low-level styling behavior.
Variable and placeholder reference
All placeholders
| Field | Type | Required | Default | Constraints | Notes |
|---|---|---|---|---|---|
| %%firstname%% / %%lastname%% | string | No | — | — | Candidate identity fields. |
| %%professionaltitle%% | string | No | — | — | Role title in header. |
| %%email%% | string | No | — | — | Candidate email address. |
| %%phone%% | string | No | — | — | Candidate phone number. |
| %%location%% | string | No | — | — | Constructed as "City, Country" from candidate address fields. |
| %%nationality%% | string | No | — | — | Candidate nationality. |
| %%linkedin%% | string | No | — | — | LinkedIn profile URL (URL-escaped for LaTeX \href safety). |
| %%summary%% | string | No | — | — | Concatenates personal.summary + personal.motivation with a double-newline separator. Omitted entirely when both are empty. |
| %%experience_block%% | block | No | — | — | Rendered experience entries. Derived from projects when available; falls back to cv.experience only when no projects exist. |
| %%education_block%% | block | No | — | — | Rendered education entries. |
| %%skills_block%% | block | No | — | — | Rendered skills groups. When %%languages_block%% is present in the template, spoken/written languages are excluded from skills to avoid duplication. |
| %%certifications_block%% | block | No | — | — | Rendered certifications as a LaTeX itemize list. |
| %%projects_block%% | block | No | — | — | Employer-grouped project entries with sub-projects and optional employer logos. |
| %%languages_block%% | block | No | — | — | Standalone language table with spoken/written proficiency columns. |
| %%companylogo%% | string | No | — | — | Emits \companylogo{filename} when show_logo=True and a logo file exists; otherwise empty string. |
| %%primary_color_hex%% | string | No | — | — | Accent color hex value (without #). Defaults to 2563EB (blue) when not set. |
| %%sections%% | structural | No | — | — | Config-driven assembled sections (Pro-tier only). Requires a StructureConfig attached to the template. Replaces individual block placeholders with a single ordered output. |
Behavioral notes
%%summary%%concatenatespersonal.summaryandpersonal.motivationwith a double-newline separator. If both are empty, the placeholder resolves to an empty string.%%experience_block%%is derived from projects (notcv.experience). It only falls back tocv.experiencewhen no projects exist for the candidate.%%skills_block%%conditionally excludes spoken/written languages when%%languages_block%%is present in the same template, preventing duplication.%%primary_color_hex%%defaults to2563EB(blue) when no color is configured on the template.%%companylogo%%emits\companylogo{filename}only whenshow_logo=Trueand a logo file exists. Otherwise it outputs an empty string.%%sections%%requires aStructureConfigattached to the template and is only available on Pro tier and above. When present, it replaces individual block placeholders with a single config-driven ordered output.
Logo and branding behavior
Logo rendering depends on both template placeholders and runtime configuration. For logo output, ensure %%companylogo%% is present and show_logo is enabled.
First working template pattern
\begin{center}
%%companylogo%%
{\LARGE\bfseries %%firstname%% %%lastname%%}\\
{\large %%professionaltitle%%}
\end{center}
\section*{Experience}
%%experience_block%%Troubleshooting
Preview compile fails
Undo last change and re-apply in smaller edits.
Data not rendering
Check placeholder spelling exactly (no custom variants).
Logo not visible
Confirm logo upload, show_logo enabled, and placeholder present in template.
Pre-publish checklist
- Validate short and long profile outputs
- Verify logo and color rendering
- Confirm no malformed placeholders remain
- Document intended use-case for this template version