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!
- org-mode configuration
- LaTeX configuration
- Document structure
- Detailed ox-awesomecv documentation
- Next steps and missing stuff
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))
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.
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. Thecrypt
tag in the “Private info” section causes it to be encrypted automatically every time the file is saved, and thenoexport
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:
(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:
Field | Description |
---|---|
PHOTOSTYLE | Style of photo to use. Comma-separated values can include |
circle/rectangle,edge/noedge,left/right. | |
CVCOLOR | Color of highlights. |
STACKOVERFLOW | Stack overflow, must be specified as ID username |
FONTDIR | Directory where the fonts can be found, defaults |
to fonts/ (as in the standard AwesomeCV) | |
CVHIGHLIGHTS | Whether to colorize highlights. Defaults to true |
QUOTE | Optional quote to include at the top of the CV |
FIRSTNAME | First name to be shown in the CV. By default the first |
space-separated part of AUTHOR is used. | |
LASTNAME | Last name to be shown in the CV. By default the second |
space-separated part of AUTHOR is used. | |
CVFOOTER_LEFT | Text to include in the left footer. None by default |
CVFOOTER_MIDDLE | Text to include in the middle footer. None by default. |
CVFOOTER_RIGHT | Text 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:
Field | Description |
---|---|
FROM | Start date of the entry |
TO | End date of the entry |
DATE | Shortcut to specify both FROM and TO as the same date. |
Both FROM and TO override DATE . | |
EMPLOYER | Employer or organization, can also be specified |
as ORGANIZATION , SCHOOL , EVENT or POSITION (different | |
names make more sense depending on the type of environment) | |
LABEL | In cvsubentry environments, adds the given text to the left |
of the date range, can be used to add additional information | |
to the entry. | |
RIGHT_IMG | path 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.
Enclose all the subheaders in a cventries
environment. Subheaders can
be of type cventry
, cvschool
, or cvemployer
.
Enclose all the subheaders in a cvhonors
environment. Subheaders must
be of type cvhonor
Converts to a \cventry
command. Supports attributes FROM
, TO
, DATE
,
EMPLOYER
, LOCATION
, RIGHT_IMG
.
Converts to a \cvsubentry
command. Supports attributes FROM
, TO
, DATE
,
LABEL
RIGHT_IMG
.
Converts to a \cventry
with only the title line. Supports attributes
FROM
, TO
, DATE
and LOCATION
.
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
.
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
.
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.
- 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.