Skip to content
/ juicv Public

LaTeX class for compact CVs and cover letters

License

Notifications You must be signed in to change notification settings

igrmk/juicv

Repository files navigation

juicv | LaTeX class for compact CVs and cover letters

The class is loosely inspired by the AltaCV class, though it has diverged so significantly that none of the original code remains. It has been completely reworked to align with my standards for both visual and code aesthetics. Most optional features and customization points have been removed to simplify the code, as they added complexity without fully meeting my needs. The result is a streamlined, non-customizable class. If you require more flexibility, the best approach would be to fork the project and develop your own version. The following CV has been compiled from the examples/igrmk-net.tex file.

CV

Build Your Own CV

  1. Install your favourite TeX distribution, for example, on macOS using Homebrew:

    brew install texlive
  2. To use the Inter font as shown in my examples, copy the fonts directory as well. Note that currently only a specific version of the Inter font works properly due to this issue.

  3. Copy one of the examples to, say, john.doe.tex.

  4. Customize the file to match your experience. Don’t forget to update the identifier.

  5. Run the following command TWICE in a row to compile the CV:

    xelatex -shell-escape -output-driver="xdvipdfmx -z 0" john.doe.tex

Test Your CV

  1. We don't fully understand how Applicant Tracking Systems (ATS) work, but it’s clear that the first step is for them to correctly parse your CV. In PDFs created by *TeX flavors, spaces are not explicitly encoded in the text. As a result, PDF parsers and viewers must use heuristics to determine where spaces should be.

    For instance, a parser like mutool handles this perfectly, while macOS Preview often struggles with accurately defining word, paragraph, and column boundaries. Obviously, ATSs can encounter the same problems.

    To test this, I recommend copying the text from your PDF using multiple PDF viewers and pasting it into a text editor to verify accuracy. You may find that some lines are merged without spaces. If this happens, try rephrasing those lines. Unfortunately, there is no reliable way in LaTeX to completely prevent this issue.

    You can also use tools like mutool to verify proper parsing:

    mutool draw -F text -o john.doe.txt john.doe.pdf
  2. To evaluate your CV, you can use services like Resume Worded. While some of their suggestions may seem extreme — such as recommending numbers in every bullet point or using overly long, AI-generated phrases — the service is generally useful overall.

Cover Letters

This class also allows you to typeset a cover letter. The following example was compiled from the examples/igrmk-cover-letter.tex file.

Cover Letter

Internals

Here are a few notes I wrote mainly for myself to refresh my memory when revisiting this project years later.

Vector Icons vs Fonts

Vector icons were chosen over Font Awesome because the font renders icons as Unicode characters in PDFs, which appear as random symbols of standard fonts when copied. This can cause issues with Applicant Tracking Systems (ATS). Instead, the required SVG icons were downloaded from their website, placed in the graphics directory, and converted to PDF using the following commands. The second command, while not strictly necessary, converts PDF 1.7 to PDF 1.4 to prevent a warning.

cairosvg icon.svg -o icon.pdf
gs -dCompatibilityLevel=1.4 -dPDFSETTINGS=/prepress -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=icon-compat.pdf icon.pdf

Heading Margins

Below is a visual explanation of how LaTeX section margins function in different contexts. In the figure, if A is positioned above B, it reflects their arrangement in the text. The arrow from A to B indicates that A contributes its margin to the distance between A and B. There are some nuances for consecutive section titles. Instead of implementing this myself, I used the LaTeX @startsection macro, which already includes this functionality.

graph TD;
    ContentBefore1(Content Before) --> Section1(Section Title);
    Section1 --> ContentBefore1;

    SectionBefore2(Section Title Before) --> SectionAfter2(Section Title After);

    Section3(Section Title) --> ContentAfter3(Content After);
    ContentAfter3(Content After) --> Section3;
Loading

Since events in the CV can exist without any content, I created a special event without content by copying the paragraph hook code from ltsect.dtx to make LaTeX recognize the event (which is a subsection) as having content.

Justification Issues

The vertical spacing of headings appears to depend heavily on justification settings (e.g., whether the heading is typeset as ragged or justified). I chose to always typeset headings as ragged-right, as this generally makes more sense for headings and results in more compact vertical spacing. If a heading needs to be typeset as justified, various spacing adjustments are required.

Tectonic Issues

Yeah, LaTeX, bitch. This is LaTeX, and that means it has to be painful. PDFs, such as CVs, usually embed all the necessary data, like fonts and images. This ensures they display exactly as created on any PDF viewer and operating system.

Images need a color profile to be reproduced accurately. The pdfx package embeds the sRGB.icc color profile into your PDF for this purpose, sourced from the colorprofiles package. For more details, see the pdfx package documentation.

Unfortunately, Tectonic — which I previously used — doesn’t fully support the pdfx package. This results in an ill-formatted color profile being embedded in your CV. See this issue for more details.

To fix this, I had to switch to vanilla XeTeX. Otherwise, most PDF viewers will open your CV, but Adobe Acrobat Reader, for instance, will not. So, never use Tectonic for your CV.

Keywords Issues

PDF metadata is stored in two different places within PDF files:

  • in XMP packet: mutool show output/igrmk-go.pdf Root/Metadata
  • and in /Info dictionary: mutool show output/igrmk-go.pdf Info

I’ve never been able to specify \Keywords in a way that prevents verapdf from complaining about a mismatch between the two copies of this metadata. So, just don’t specify it. It looks like it simply doesn’t work well.

Maybe the reason is this: According to the pdfx package documentation, metadata specified by the \Keywords attribute is written to the dc:subject key, while \Subject is written to dc:description. What the fuck?! Or could it just be a documentation bug?

Reproducibility Issues

There isn't a proper package manager for LaTeX that can reliably reproduce the build environment. Vendoring doesn't fully solve the problem either, as some packages are OS- and architecture-specific. These still need to be installed during the build process, and they often end up out of sync with vendored ones when using different distributions.

While this can be addressed by carefully choosing which packages to vendor and which to install from the distribution, the fragility of this solution doesn't inspire confidence. The final decision was simply not to care much about it and to install everything from the distribution.

Inter Font Issues

I had to revert to Inter font version 3.19, even though it is 3 years old and the current version is 4.1. The issue with the newer version lies in character mapping: when extracting text from a PDF, some characters are incorrectly mapped. See the issue for details.

About

LaTeX class for compact CVs and cover letters

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published