Open Thoughts

jump to main content

Writing a Resume with Org-Mode

I use org-mode as my document production software. This means that I produce everything in Org. Notes, papers, presentations, and now my resume.

When I began looking at resume production with Org, I noticed the lack of straightforward packages and user guides. I'm sure there's something out there, but I sure couldn't find it.

The simplest raw-org method I found is the use of macros, along with a custom export-template.

I've found a better way. Check out the revision.

This approach is nice because it can be adapted to any standard LaTeX template. In my case, McDowell CV by Daniil Belyakov is perfect.

1. Setup

1.1. Installing the Template

First, get the .cls for your desired template. If it's on texlive, just install it the usual way. Since the template I want is on Github, I'll just put the .cls into /home/user/texmf/tex/latex/.

1.2. Preparing Org-Mode

1.2.1. Custom Class

I add a custom entry to org-latex-classes to make use of McDowellcv:

(add-to-list 'org-latex-classes
             '("mcdowellcv"
               "\\documentclass[]{mcdowellcv}
                \\usepackage{amsmath}
                \\usepackage[]{multicol}
                \\usepackage[hidelinks]{hyperref}
    [NO-DEFAULT-PACKAGES]
    [NO-PACKAGES]"
               ("\\section{%s}" . "\\section*{%s}")
               ("\\subsection{%s}" . "\\subsection*{%s}")
               ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
               ("\\paragraph{%s}" . "\\paragraph*{%s}")
               ("\\subparagraph{%s}" . "\\subparagraph*{%s}")))

Note that I prevent Org-mode from adding any extra packages to this. Then I custom-add the multicol and hyperref packages.

1.2.2. Lualatex as PDF Processor

This template requires lualatex a its pdf producer. While you could set this as a per-document setting, I like it well enough for everything.

(after! ox-latex
  (setq org-latex-pdf-process
  '("lualatex --output-directory=/home/user/Documents -shell-escape -interaction nonstopmode %f")))

1.2.3. ox-extra for ":ignore:" tags

I want to be able to ignore headings on export.

  (use-package! ox-extra
    :after (org)
    :config
    (ox-extras-activate '(latex-header-blocks ignore-headlines)))
(add-to-list 'org-tags-exclude-from-inheritance "ignore")

1.3. Creating the Macros

At the top of my resume file I use a config block to keep my macro definitions tidy:

:CONFIG:
#+LATEX_CLASS: mcdowellcv
#+OPTIONS: toc:nil title:nil
#+MACRO: cvsection \begin{cvsection}{$1}
#+MACRO: end-cvsection \end{cvsection}
#+MACRO: cvsubsection \begin{cvsubsection}{$1}{$2}{$3}
#+MACRO: end-cvsubsection \end{cvsubsection}
:END:

Other options can be set here as well, of course.

If you're using some other resume template, or even some unrelated LaTeX template, you can see how easy it would be to adapt the macro workflow.

2. Writing your Resume

After you've set up your macros, use is simple. You use standard org headlines with the ignore tag to structure your document, and then macros to manage the cv content. image Notice that I separate the ending macros using another header line. I'm not sure why that's necessary, but when I attempt to remove it, export breaks.

I like to keep my resume on a single sheet. This requires some content juggling, but it forces me to filter out everything that is unimportant. Of course, being young I have little content and so I can fit just about everything.

If you're in school, the careers department can almost certainly help you out with more specific style guides.

3. Future improvements.

Back when configuring the custom class you may have noticed the rows of cons cells underneath the header-string. These define what each level of org-header is to translate into. If you're paying attention you've also noticed that McDowellCV provides a set of commands cvsection and cvsubsection that would work perfectly in this scenario. You're right, except that these commands require extra properties to specify dates and other features.

At some point I'll figure out how to pass parameters into them through the default header-export mechanism. For now I'm comfortable with my macros.

4. Revision

I have spent some more time configuring, and I've figured out the appropriate settings.

(add-to-list 'org-latex-classes
             '("mcdowellcv"
               "\\documentclass[]{mcdowellcv}
                \\usepackage{amsmath}
                \\usepackage[]{multicol}
                \\usepackage[hidelinks]{hyperref}
    [NO-DEFAULT-PACKAGES]
    [NO-PACKAGES]"
               ("\\begin{cvsection}{%s}" "\\end{cvsection}")
               ("\\begin{cvsubsection}{%s}" "\\end{cvsubsection}")))

Now, as I mentioned above, each section takes just one argument. I need a way to shoehorn multiple arguments into the cvsubsection command. Fortunately, org-mode provides a subtle set of symbols to do just that: revised image

Org manual reference

It took me an hour to discover this piece of syntax. Next time I'll check the manual first!