{"id":18090778,"url":"https://github.com/igrmk/juicv","last_synced_at":"2025-10-12T10:02:42.601Z","repository":{"id":260382785,"uuid":"862571687","full_name":"igrmk/juicv","owner":"igrmk","description":"LaTeX class for compact CVs and cover letters","archived":false,"fork":false,"pushed_at":"2024-12-29T22:04:37.000Z","size":27201,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-08-01T06:37:25.930Z","etag":null,"topics":["cover-letter","curriculum-vitae","cv","latex","latex-class","resume","two-column"],"latest_commit_sha":null,"homepage":"","language":"TeX","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/igrmk.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-09-24T20:29:53.000Z","updated_at":"2024-12-29T22:04:40.000Z","dependencies_parsed_at":null,"dependency_job_id":"c43e3593-1984-4d88-9d2b-f7ffb1656864","html_url":"https://github.com/igrmk/juicv","commit_stats":null,"previous_names":["igrmk/juicv"],"tags_count":32,"template":false,"template_full_name":null,"purl":"pkg:github/igrmk/juicv","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/igrmk%2Fjuicv","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/igrmk%2Fjuicv/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/igrmk%2Fjuicv/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/igrmk%2Fjuicv/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/igrmk","download_url":"https://codeload.github.com/igrmk/juicv/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/igrmk%2Fjuicv/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279011027,"owners_count":26084863,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-12T02:00:06.719Z","response_time":53,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cover-letter","curriculum-vitae","cv","latex","latex-class","resume","two-column"],"created_at":"2024-10-31T18:07:25.035Z","updated_at":"2025-10-12T10:02:42.559Z","avatar_url":"https://github.com/igrmk.png","language":"TeX","funding_links":[],"categories":[],"sub_categories":[],"readme":"# juicv | LaTeX class for compact CVs and cover letters\n\nThe class is loosely inspired by the [AltaCV](https://github.com/liantze/AltaCV) class, though it has\ndiverged so significantly that none of the original code remains.\nIt has been completely reworked to align with my standards for both\nvisual and code aesthetics. Most optional features and customization\npoints have been removed to simplify the code, as they added complexity\nwithout fully meeting my needs. The result is a streamlined,\nnon-customizable class. If you require more flexibility, the best\napproach would be to fork the project and develop your own version.\nThe following CV has been compiled from the [examples/igrmk-net.tex](examples/igrmk-net.tex) file.\n\n![CV](https://github.com/igrmk/juicv/releases/latest/download/example-igrmk-net.png)\n\n## Build Your Own CV\n\n1. Install your favourite TeX distribution, for example, on macOS using Homebrew:\n\n   ~~~bash\n   brew install texlive\n   ~~~\n\n2. To use the Inter font as shown in my examples, copy the `fonts` directory as well.\n   Note that currently only a specific version of the Inter font works properly due to\n   [this issue](https://github.com/rsms/inter/issues/774).\n\n3. Copy one of the examples to, say, `john.doe.tex`.\n\n4. Customize the file to match your experience. Don’t forget to update the identifier.\n\n5. Run the following command TWICE in a row to compile the CV:\n\n   ~~~bash\n   xelatex -shell-escape -output-driver=\"xdvipdfmx -z 0\" john.doe.tex\n   ~~~\n\n## Test Your CV\n\n1. We don't fully understand how Applicant Tracking Systems (ATS) work, but\n   it’s clear that the first step is for them to correctly parse your CV.\n   In PDFs created by \\*TeX flavors, spaces are not explicitly encoded in the\n   text. As a result, PDF parsers and viewers must use heuristics to determine\n   where spaces should be.\n\n   For instance, a parser like `mutool` handles this perfectly, while macOS\n   Preview often struggles with accurately defining word, paragraph, and\n   column boundaries. Obviously, ATSs can encounter the same problems.\n\n   To test this, I recommend copying the text from your PDF using multiple\n   PDF viewers and pasting it into a text editor to verify accuracy. You may\n   find that some lines are merged without spaces. If this happens, try\n   rephrasing those lines. Unfortunately, there is no reliable way in LaTeX\n   to completely prevent this issue.\n\n   You can also use tools like `mutool` to verify proper parsing:\n\n   ~~~bash\n   mutool draw -F text -o john.doe.txt john.doe.pdf\n   ~~~\n\n2. To evaluate your CV, you can use services like [Resume Worded](https://resumeworded.com/).\n   While some of their suggestions may seem extreme — such as recommending numbers\n   in every bullet point or using overly long, AI-generated phrases — the service\n   is generally useful overall.\n\n## Cover Letters\n\nThis class also allows you to typeset a cover letter.\nThe following example was compiled from the\n[examples/igrmk-cover-letter.tex](examples/igrmk-cover-letter.tex) file.\n\n![Cover Letter](https://github.com/igrmk/juicv/releases/latest/download/example-igrmk-cover-letter.png)\n\n## Internals\n\nHere are a few notes I wrote mainly for myself\nto refresh my memory when revisiting this project years later.\n\n### Vector Icons vs Fonts\n\nVector icons were chosen over Font Awesome\nbecause the font renders icons as Unicode characters in PDFs,\nwhich appear as random symbols of standard fonts when copied.\nThis can cause issues with Applicant Tracking Systems (ATS).\nInstead, the required SVG icons were downloaded from their website,\nplaced in the `graphics` directory, and converted to PDF using the following commands.\nThe second command, while not strictly necessary,\nconverts PDF 1.7 to PDF 1.4 to prevent a warning.\n\n~~~bash\ncairosvg icon.svg -o icon.pdf\ngs -dCompatibilityLevel=1.4 -dPDFSETTINGS=/prepress -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=icon-compat.pdf icon.pdf\n~~~\n\n### Heading Margins\n\nBelow is a visual explanation of how LaTeX section margins function in different contexts.\nIn the figure, if A is positioned above B, it reflects their arrangement in the text.\nThe arrow from A to B indicates that A contributes its margin to the distance between A and B.\nThere are some nuances for consecutive section titles.\nInstead of implementing this myself,\nI used the LaTeX `@startsection` macro, which already includes this functionality.\n\n~~~mermaid\ngraph TD;\n    ContentBefore1(Content Before) --\u003e Section1(Section Title);\n    Section1 --\u003e ContentBefore1;\n\n    SectionBefore2(Section Title Before) --\u003e SectionAfter2(Section Title After);\n\n    Section3(Section Title) --\u003e ContentAfter3(Content After);\n    ContentAfter3(Content After) --\u003e Section3;\n~~~\n\nSince events in the CV can exist without any content,\nI created a special event without content by copying the paragraph hook code from `ltsect.dtx`\nto make LaTeX recognize the event (which is a subsection) as having content.\n\n### Justification Issues\n\nThe vertical spacing of headings appears\nto depend heavily on justification settings\n(e.g., whether the heading is typeset as ragged or justified).\nI chose to always typeset headings as ragged-right,\nas this generally makes more sense for headings\nand results in more compact vertical spacing.\nIf a heading needs to be typeset as justified,\nvarious spacing adjustments are required.\n\n### Tectonic Issues\n\nYeah, LaTeX, bitch. This is LaTeX, and that means it has to be painful.\nPDFs, such as CVs, usually embed all the necessary data, like fonts and images.\nThis ensures they display exactly as created on any PDF viewer and operating system.\n\nImages need a color profile to be reproduced accurately.\nThe `pdfx` package embeds the `sRGB.icc` color profile into your PDF for this purpose,\nsourced from the [colorprofiles](https://ctan.org/pkg/colorprofiles) package.\nFor more details, see the [pdfx package documentation](https://mirrors.ctan.org/macros/latex/contrib/pdfx/pdfx.pdf).\n\nUnfortunately, Tectonic — which I previously used — doesn’t fully support the\n`pdfx` package. This results in an ill-formatted color profile being embedded in\nyour CV. See [this issue](https://github.com/tectonic-typesetting/tectonic/issues/838)\nfor more details.\n\nTo fix this, I had to switch to vanilla `XeTeX`. Otherwise, most PDF viewers\nwill open your CV, but Adobe Acrobat Reader, for instance, will not.\nSo, never use Tectonic for your CV.\n\n### Keywords Issues\n\nPDF metadata is stored in two different places within PDF files:\n\n* in XMP packet: `mutool show output/igrmk-go.pdf Root/Metadata`\n* and in `/Info` dictionary: `mutool show output/igrmk-go.pdf Info`\n\nI’ve never been able to specify `\\Keywords` in a way that prevents\n`verapdf` from complaining about a mismatch between the two copies of this metadata.\nSo, just don’t specify it. It looks like it simply doesn’t work well.\n\nMaybe the reason is this:\nAccording to the [pdfx package documentation](https://mirrors.ctan.org/macros/latex/contrib/pdfx/pdfx.pdf),\nmetadata specified by the `\\Keywords` attribute is written to the `dc:subject` key,\nwhile `\\Subject` is written to `dc:description`.\nWhat the fuck?! Or could it just be a documentation bug?\n\n### Reproducibility Issues\n\nThere isn't a proper package manager for LaTeX\nthat can reliably reproduce the build environment.\nVendoring doesn't fully solve the problem either,\nas some packages are OS- and architecture-specific.\nThese still need to be installed during the build process,\nand they often end up out of sync with vendored ones\nwhen using different distributions.\n\nWhile this can be addressed\nby carefully choosing\nwhich packages to vendor and which to install from the distribution,\nthe fragility of this solution doesn't inspire confidence.\nThe final decision was simply not to care much about it\nand to install everything from the distribution.\n\n### Inter Font Issues\n\nI had to revert to Inter font version 3.19,\neven though it is 3 years old and the current version is 4.1.\nThe issue with the newer version lies in character mapping:\nwhen extracting text from a PDF, some characters are incorrectly mapped.\nSee the [issue](https://github.com/rsms/inter/issues/774) for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Figrmk%2Fjuicv","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Figrmk%2Fjuicv","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Figrmk%2Fjuicv/lists"}