Professional resume generation using LaTeX + Jinja2 templating
Generate beautiful, ATS-friendly PDF resumes from structured data using the power of LaTeX typesetting and Python templating.
- Why Texume?
- Features
- Quick Start
- Installation
- Usage
- Customization
- Technical Details
- Examples
- Contributing
- License
Most resume builders use HTML/CSS β PDF conversion, which produces inferior typography and inconsistent formatting. Texume uses LaTeX - the gold standard for professional document typesetting used in academic publishing and technical documentation.
β Superior Typography - LaTeX's Knuth-Plass algorithm optimizes entire paragraphs, not just individual lines β Consistent Formatting - Exact spacing, alignment, and professional appearance β ATS-Friendly - Clean structure that applicant tracking systems can parse β Version Control - Plain text templates = perfect for Git β Automation - Generate multiple resume variants from structured data β Open Source - Free, customizable, no vendor lock-in
- Multiple Templates: Simple, advanced, and Jinja2-powered variants
- LaTeX-Friendly Jinja2: Custom delimiters (
\VAR{},\BLOCK{}) avoid conflicts with LaTeX syntax - Pure Python: No complex dependencies beyond Jinja2
- Structured Data: Define resume content as Python dictionaries or JSON
- PDF Compilation: Automatic LaTeX β PDF via
pdflatex - Clean Output: Professional formatting with hyperlinked email/LinkedIn
- Extensible: Easy to add custom sections, colors, and layouts
- Python 3.7+ (download)
- TeX Distribution:
# Clone the repository
git clone https://github.com/guitargnarr/texume.git
cd texume
# Install Python dependencies
pip install -r scripts/requirements.txt
# Generate example resume
cd scripts
python3 resume_generator.pyOutput: output/resume.pdf (opens automatically)
macOS:
brew install --cask mactexLinux (Ubuntu/Debian):
sudo apt-get update
sudo apt-get install texlive-fullLinux (Fedora):
sudo dnf install texlive-scheme-fullWindows: Download and install MiKTeX or TeX Live
pip install -r scripts/requirements.txtThat's it! Only one dependency: Jinja2
Best for: One-time resume creation, simple customization
cd templates
# Edit resume_simple.tex with your information
pdflatex resume_simple.texBest for: Multiple resume variants, automation
- Edit resume data in
scripts/resume_generator.py:
def get_example_data() -> dict:
return {
'name': 'YOUR NAME',
'email': '[email protected]',
'phone': '(555) 123-4567',
'experience': [
{
'title': 'SOFTWARE ENGINEER',
'company': 'Tech Corp',
'dates': 'Jan 2020 -- Present',
'bullets': [
'Built scalable APIs serving 1M users',
'Reduced latency by 60%',
]
}
],
# ... more sections
}- Generate PDF:
python3 resume_generator.py- Find your resume in
output/resume.pdf
Edit template header to customize color scheme:
\definecolor{headercolor}{RGB}{37, 99, 235} % Blue
\definecolor{sectioncolor}{RGB}{30, 58, 138} % NavyIn Jinja2 template (templates/resume_jinja2.tex):
\BLOCK{if certifications}
\resumesection{CERTIFICATIONS}
\BLOCK{for cert in certifications}
\textbf{\VAR{cert.name}} | \VAR{cert.issuer} | \VAR{cert.date}
\BLOCK{endfor}
\BLOCK{endif}In Python data:
'certifications': [
{'name': 'AWS Solutions Architect', 'issuer': 'Amazon', 'date': '2023'}
]Use XeLaTeX for custom fonts (requires fontspec package):
xelatex resume_simple.texResume Data (Python dict/JSON)
β
Jinja2 Template Engine
β
LaTeX Document (.tex)
β
pdflatex Compiler
β
Professional PDF Resume
Problem: Standard Jinja2 uses {% and {{, but LaTeX uses % for comments and {} for grouping.
Solution: Custom delimiters that don't conflict with LaTeX:
| Standard Jinja2 | Texume (LaTeX-Friendly) |
|---|---|
{{ variable }} |
\VAR{variable} |
{% if condition %} |
\BLOCK{if condition} |
{# comment #} |
\#{comment} |
This allows LaTeX comments (%) to work normally in templates!
texume/
βββ templates/
β βββ resume_simple.tex # Basic template (no Jinja2)
β βββ resume_jinja2.tex # Dynamic template with Jinja2
βββ scripts/
β βββ resume_generator.py # Main generator script
β βββ requirements.txt # Python dependencies
βββ examples/
β βββ jane_doe_resume.pdf # Example output
βββ docs/
β βββ ARCHITECTURE.md # System design details
β βββ CUSTOMIZATION.md # Advanced customization guide
βββ .gitignore # Excludes personal data, aux files
βββ LICENSE # MIT License
βββ README.md # This file
Clean, professional resume using standard LaTeX packages only.
Output: examples/jane_doe_resume.pdf
Enhanced version with custom colors, fonts, and styling.
(Coming soon - requires additional LaTeX packages)
Contributions welcome! Here's how you can help:
- Additional templates (academic CV, creative designs, etc.)
- JSON/YAML data loading (instead of Python dict)
- CLI tool with argparse
- Multiple language support
- Color scheme presets
- Markdown β LaTeX converter
- Web UI for non-technical users
- Docker container for easy deployment
- Fork the repository
- Create a feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
Solution: Install TeX Live (see Installation)
Solution: Check .log file in output directory:
cat output/resume.log | grep -i errorCommon issues:
- Missing packages: Install with
tlmgr install <package-name> - Special characters: Escape
&,%,$,#,_with backslash
Solution: Ensure delimiters match in template and generator:
# In resume_generator.py
block_start_string='\\BLOCK{',
variable_start_string='\\VAR{',This project is licensed under the MIT License - see the LICENSE file for details.
TL;DR: Free to use, modify, and distribute. No warranty provided.
TeX (LaTeX) + Resume = Texume
A memorable portmanteau representing the fusion of professional typesetting and modern automation.
- Donald Knuth - Creator of TeX typesetting system
- Leslie Lamport - Creator of LaTeX
- Jinja2 Team - Excellent templating engine
- Open Source Community - For making tools like this possible
Matthew Scott - @guitargnarr
Project Link: https://github.com/guitargnarr/texume
Built with β€οΈ using LaTeX, Python, and Jinja2
β Star this repo if you found it helpful!