LaTeX Escapism

Ryan Lopopolo

Many of my side projects take the shape of over-engineered. They serve as a fun sandbox to go wild, put my mind on a treadmill, try new things, and take maximum control of the outcome. 🏰

This tends to mean every project, no matter how small, has GitHub Actions CI, lint passes, prettier-formatted READMEs, dependabot, a locked trunk branch and PR-oriented merge workflow. There is always some sort of build system; sometimes Vite, sometimes Bazel, sometimes Cargo, sometimes an amalgamation of make and docker. 🏗️

Vaporwave silhouette working at a desk, headphones, noir energy.

My LaTeX Résumé

Nowhere is this energy more apparent than the repository that houses my résumé. 🙋

I built my LaTeX résumé from scratch. I did not use a template; I started with an empty buffer in vim. There are currently 102 lines of prelude before \begin{document}. The résumé uses the scrartcl document class and content entries within each \section*{} are defined using custom environments. Early versions of the source were built with pdfLaTeX, then later with XeLaTeX. The current revision is built with LuaLaTeX. 📇

My résumé’s git respository has a build system. make all invokes make recursively in a Docker container to invoke latexmk (which itself invokes make for some dynamic \inputA includes). The PDFs and PNGs generated by this build process are reproducible. 🪞

The Dockerfile installs a curated and minimal set of packages required to pull in a lightweight TeX install. Line 40 regenerates the font cache as part of the image baking process to speed up the PDF rendering step. 📚

# pregenerate font caches
RUN set -eux; \
    luatools --generate; \
    mtxrun --script fonts --reload; \
    luaotfload-tool --update

The sources run through several layers of linters: check-style runs on every commit; custom scripts reject commits which contain non-ASCII characters (preferring the LaTeX equivalent macros); hadolint ensures the Dockerfile follows all of the best practices (except for DL3008, I don’t have the patience to pin apt package versions). ⏳

@dependabot keeps Docker base images current with automatic dependency upgrade PRs. GitHub Actions CI ensures the TeX source builds without warnings on every commit. 🪜

I use GitHub releases with PDF artifacts to track which things end up getting pushed to the web. Releases are tagged by date. 🏷️

The most recent hurdle I overcame was how to create blue underlined hyperlinks. The sources are easy to work with. 😅

why tho

When I work on a side project, I am choosing to enter a box. Being able to exercise this level of control lets me indulge into some escapism, exploration, and for the sake of it engineering. 📦