Skip to content

lsiksous/vita

Repository files navigation

Curriculum Vitae with Org-mode

This repository contains the source for my CV. The document is maintained in org-mode. The main export format is to LaTeX and PDF. You can find the end result here: https://zzamboni.org/vita/

My goal is to produce the CV from an Org file which focuses on the semantics of the CV, without worrying about the format. Ultimately, the CV should be exportable to multiple formats from the same document.

The export to LaTeX is done using the Awesome-CV LaTeX class and the ox-awesomecv exporter I wrote as part of the Org-CV package. The Awesome-CV exporter is not yet merged into Org-CV, but for now you can get it from the merge request at https://gitlab.com/Titan-C/org-cv/merge_requests/3.

Exporting to HTML using the base ox-html exporter works fairly well, but the output is not optimally formatted. The main issue is that a lot of the semantic information (e.g. job dates, employers, etc.) are specified in property drawers, and ox-html does not know how to extract/format them. As a workaround, I have configured that those properties should be exported using the prop option. This is less than ideal because the properties are exported as-they-are, without any special formatting. You can find an example export in zamboni-vita.html.

Exporting to ASCII uses the same trick as for HTML, but the result looks quite reasonable. I use the Plain Text UTF-8 exporter. You can see the output in zamboni-vita.txt.

Read the rest of this document for some more details, if you would like to use it as a starting point to write your own CV. Let me know if you have any questions or feedback!

Table of contents

org-mode configuration

Org-CV is not available in MELPA yet, so I clone the git repository under ~/.emacs.d/lisp/org-cv, and then use the following code to load the modules:

(use-package ox-awesomecv
  :load-path "~/.emacs.d/lisp/org-cv"
  :init (require 'ox-awesomecv))
(use-package ox-hugocv
  :load-path "~/.emacs.d/lisp/org-cv"
  :init (require 'ox-hugocv))

LaTeX configuration

You need a functional TeX/LaTeX install. I recommend using the TeXLive distribution, which contains all the base packages and binaries. Use the version corresponding to your OS.

This repository contains a slightly-customized version of the Awesome-CV package. The LaTeX files are in the texinput directory, so you need to add it to the $TEXINPUT environment variable for the compile to work. I use latexmk (included in the TeXLive distribution) to handle the document compilation, you can see its configuration file in .latexmkrc. I have also put together a simple Makefile to run latexmk with different useful options, and to automate publishing the latest version of my CV to my website.

Document structure

Some things you may find useful:

  • By Org-CV convention, the title of the org-document (as specified by #+title:) is used for the “desired job/position”, since your name is specified using the #+author: document property.
  • You can specify many other properties (e.g. mobile phone, twitter profile, email address, home page URL, etc.) using other document properties. Some are supported by all Org-CV modules, others only by the AwesomeCV exporter, see the Org-CV documentation for the general properties, and the the documentation below for the ox-awesomecv details.
  • At the top of the Org document there is a block starting with #+begin cv_config. This block contains all the global document properties to specify AwesomeCV, org-mode and LaTeX configuration properties. The block is optional, I use it only so I can easily collapse the whole block when I don’t need it.
  • The “Private info” section contains private information which should not be included in the CV by default. It is kept encrypted, so that even if the source file is publicly visible (like mine), the private information is kept protected. The encryption is done automatically thanks to the org-crypt package, whose configuration you can see here: https://github.com/zzamboni/dot-emacs/blob/master/init.org#encryption. The crypt tag in the “Private info” section causes it to be encrypted automatically every time the file is saved, and the noexport tag causes it to be omitted when the file gets exported. Its contents, when unencrypted, contains field definitions like this:
    #+mobile: <my mobile number>
    #+address: <my address>
    #+extrainfo: <other private information>
        

    When encrypted, this information is simply ignored. When I want to produce a version of my CV which includes this information, I run M-x org-decrypt-entry, which prompts for my GPG passphrase. Then, without saving the file, I run the following export command:

    (org-export-to-file 'awesomecv "zamboni-vita-private.tex")
        
  • Org-CV does not yet have integration into the org-mode Export menu. For now, the export is done manually by executing a command like the following:
    (org-export-to-file 'awesomecv "zamboni-vita.tex")
        
  • You can automate the export by adding an after-save hook to run the export every time you save the org file. To do this, add the following code at the end of the document (see my org file for an example):
    * Local Variables :ARCHIVE:noexport:
    # Local Variables:
    # eval: (add-hook 'after-save-hook (lambda () (org-export-to-file 'awesomecv "zamboni-vita.tex")) :append :local)
    # End:
        

Detailed ox-awesomecv documentation

(this is extracted from the org-cv documentation about the AwesomeCV exporter)

AwesomeCV is another LaTeX template for producing nice-looking CVs. In addition to the regular document attributes, the following are supported:

FieldDescription
PHOTOSTYLEStyle of photo to use. Comma-separated values can include
circle/rectangle,edge/noedge,left/right.
CVCOLORColor of highlights.
STACKOVERFLOWStack overflow, must be specified as ID username
FONTDIRDirectory where the fonts can be found, defaults
to fonts/ (as in the standard AwesomeCV)
CVHIGHLIGHTSWhether to colorize highlights. Defaults to true
QUOTEOptional quote to include at the top of the CV
FIRSTNAMEFirst name to be shown in the CV. By default the first
space-separated part of AUTHOR is used.
LASTNAMELast name to be shown in the CV. By default the second
space-separated part of AUTHOR is used.
CVFOOTER_LEFTText to include in the left footer. None by default
CVFOOTER_MIDDLEText to include in the middle footer. None by default.
CVFOOTER_RIGHTText to include in the right footer. None by default.

AwesomeCV supports a few additional types of environment types in CV_ENV, including cvemployer, cvskills, cvhonors and cvschool. Some of these support additional property fields:

FieldDescription
FROMStart date of the entry
TOEnd date of the entry
DATEShortcut to specify both FROM and TO as the same date.
Both FROM and TO override DATE.
EMPLOYEREmployer or organization, can also be specified
as ORGANIZATION, SCHOOL, EVENT or POSITION (different
names make more sense depending on the type of environment)
LABELIn cvsubentry environments, adds the given text to the left
of the date range, can be used to add additional information
to the entry.
RIGHT_IMGpath to an image to include floating to the right of a cventry,
a cvsubentry or cvschool entry. Meant to be used to show a logo.

All the supported values of CV_ENV are described below.

cventries

Enclose all the subheaders in a cventries environment. Subheaders can be of type cventry, cvschool, or cvemployer.

cvhonors

Enclose all the subheaders in a cvhonors environment. Subheaders must be of type cvhonor

cventry

Converts to a \cventry command. Supports attributes FROM, TO, DATE, EMPLOYER, LOCATION, RIGHT_IMG.

cvsubentry

Converts to a \cvsubentry command. Supports attributes FROM, TO, DATE, LABEL RIGHT_IMG.

cvemployer

Converts to a \cventry with only the title line. Supports attributes FROM, TO, DATE and LOCATION.

cvschool

Converts to a \cventry. The headline should contain the degree obtained, shown as the main title. Supports attributes LOCATION, SCHOOL, FROM, TO, DATE and RIGHT_IMG.

cvhonor

Converts to a \cvhonor command (must be inside a cvhonors headline). Supports attributes LOCATION, EMPLOYER (in this case EVENT or POSITION might be more semantically accurate, and can also be used), FROM, TO, DATE.

cvskills

Converts to a \cvskills environment. The headline must contain a description list, which gets converted into a sequence of \cvskill commands, with the term as the skill title and the description as its contents.

Next steps and missing stuff

  • I would like to improve Org-CV’s ox-hugocv to support the additional properties introduced by ox-awesomecv, so that the Hugo Markdown export looks good and can be used instead of ox-html. This would allow me to publish an HTML version of my CV in my website.
  • Add integration of Org-CV’s exporters into the org-mode Export menu.
  • It would be nice to automate somehow the export of a CV with the private information unencrypted.
  • I’m torn about the use of fully-semantic properties for specifying information in the CV. On one hand, it’s the cleanest and easiest way of doing it. On the other hand, it makes it harder to use the default org-mode exporters while still preserving the information in the output.
  • I wonder if it would make more sense to specify CV_ENV as a tag in the headline.