2018-04-05 01:07:59 +00:00
|
|
|
#+TITLE: Org exporter for curriculum vitae
|
2018-03-22 16:37:00 +00:00
|
|
|
#+AUTHOR: Óscar Nájera
|
|
|
|
#+EMAIL: hello@oscarnajera.com
|
2018-04-18 22:44:54 +00:00
|
|
|
|
|
|
|
#+HUGO_BASE_DIR: doc
|
|
|
|
#+HUGO_SECTION: post
|
|
|
|
#+HUGO_WEIGHT: auto
|
2018-03-22 16:37:00 +00:00
|
|
|
|
2018-05-01 18:44:16 +00:00
|
|
|
* Goal: Export backend for CV
|
|
|
|
:PROPERTIES:
|
|
|
|
:EXPORT_FILE_NAME: goal
|
|
|
|
:END:
|
2018-04-18 17:22:01 +00:00
|
|
|
This project aims to generate from an org-mode file with reasonably ordered
|
|
|
|
items a latex file which compiles into a reasonably nice CV. In the same
|
|
|
|
spirit the org-mode file must export to markdown so that it can be uses for
|
|
|
|
web based CV.
|
2018-05-02 00:24:44 +00:00
|
|
|
|
|
|
|
- Online documentation in [[https://titan-c.gitlab.io/org-cv/]]
|
2018-05-06 19:48:42 +00:00
|
|
|
- Development happens in the gitlab repository: https://gitlab.com/Titan-C/org-cv
|
|
|
|
- There is a mirror in github for backup: https://github.com/Titan-C/org-cv
|
2018-05-02 00:24:44 +00:00
|
|
|
|
2018-04-18 17:22:01 +00:00
|
|
|
* Installation
|
2018-04-18 22:44:54 +00:00
|
|
|
:PROPERTIES:
|
|
|
|
:EXPORT_FILE_NAME: installation
|
|
|
|
:END:
|
2018-04-18 21:02:48 +00:00
|
|
|
This project is not on MELPA so you have to do a manual installation. First
|
|
|
|
clone this git repository.
|
|
|
|
#+BEGIN_SRC bash
|
|
|
|
git clone https://gitlab.com/Titan-C/org-cv.git
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
There are various modules to perform the export. As of now =ox-moderncv=,
|
|
|
|
=ox-altacv=, =ox-hugocv=. Choose any or all that you prefer for install. I
|
2018-04-18 22:44:54 +00:00
|
|
|
use =use-package= to manage the installation for example of =ox-moderncv=.
|
2018-04-18 21:02:48 +00:00
|
|
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
(use-package ox-moderncv
|
2018-04-18 22:44:54 +00:00
|
|
|
:load-path "path_to_repository/org-cv/"
|
2018-04-18 21:02:48 +00:00
|
|
|
:init (require 'ox-moderncv))
|
|
|
|
#+END_SRC
|
2018-04-18 17:22:01 +00:00
|
|
|
|
|
|
|
* Basic Org file
|
2018-04-18 22:44:54 +00:00
|
|
|
:PROPERTIES:
|
|
|
|
:EXPORT_FILE_NAME: basic_config
|
|
|
|
:END:
|
2018-04-18 21:02:48 +00:00
|
|
|
The basic structure of an org file containing your CV is shown next.
|
2018-04-18 21:24:09 +00:00
|
|
|
** Personal contact information
|
2018-05-01 20:32:05 +00:00
|
|
|
=TITLE=, =AUTHOR= and =EMAIL= are standard org options. But on =TITLE= you
|
|
|
|
put your foreseen job.
|
2018-04-18 21:24:09 +00:00
|
|
|
|
2018-05-01 21:02:29 +00:00
|
|
|
#+attr_html: :class table table-striped
|
2018-04-18 21:24:09 +00:00
|
|
|
| Field | Description |
|
|
|
|
|----------+----------------------------------------------------|
|
|
|
|
| TITLE | Desired job |
|
|
|
|
| AUTHOR | Who you are? |
|
2018-05-01 20:32:05 +00:00
|
|
|
| EMAIL | Your contact email |
|
2018-04-18 21:24:09 +00:00
|
|
|
| ADDRESS | Mailing address, this can span over multiple lines |
|
|
|
|
| HOMEPAGE | URL of your website |
|
|
|
|
| MOBILE | Mobile phone |
|
|
|
|
| GITHUB | GitHub user |
|
|
|
|
| GITLAB | GitLab user |
|
|
|
|
| LINKEDIN | Linkedin username |
|
|
|
|
| PHOTO | path to photo file |
|
|
|
|
|
2018-04-19 01:07:52 +00:00
|
|
|
#+BEGIN_SRC org :tangle basic_cv.org
|
2018-04-18 17:22:01 +00:00
|
|
|
,#+TITLE: My dream job
|
|
|
|
,#+AUTHOR: John Doe
|
2018-05-01 16:36:58 +00:00
|
|
|
,#+email: john@doe.lost
|
2018-04-18 17:22:01 +00:00
|
|
|
|
|
|
|
,#+ADDRESS: My Awesome crib
|
|
|
|
,#+ADDRESS: Fantastic city -- Planet Earth
|
|
|
|
,#+MOBILE: (+9) 87654321
|
|
|
|
,#+HOMEPAGE: example.com
|
|
|
|
,#+GITHUB: Titan-C
|
|
|
|
,#+GITLAB: Titan-C
|
2018-04-18 21:24:09 +00:00
|
|
|
,#+LINKEDIN: oscar-najera
|
2018-04-19 01:07:52 +00:00
|
|
|
,#+PHOTO: smile.png
|
2018-04-18 21:24:09 +00:00
|
|
|
#+END_SRC
|
2018-04-18 21:02:48 +00:00
|
|
|
|
2018-04-18 21:24:09 +00:00
|
|
|
You can use org-modes hierarchical structure to describe your CV. To make a
|
|
|
|
specific subtree an item describing an experience point (Job you have,
|
|
|
|
degree you pursued, etc.) you use the org properties drawer and with the
|
|
|
|
=:CV_ENV: cventry= property. You should also include the =FROM= and =TO=
|
|
|
|
properties defining the span of the event, as =LOCATION= and =EMPLOYER=.
|
2018-04-19 01:07:52 +00:00
|
|
|
#+BEGIN_SRC org :tangle workcontent.org
|
2018-04-18 17:22:01 +00:00
|
|
|
,* Employement
|
|
|
|
,** One job
|
|
|
|
:PROPERTIES:
|
|
|
|
:CV_ENV: cventry
|
|
|
|
:FROM: <2014-09-01>
|
|
|
|
:TO: <2017-12-07>
|
|
|
|
:LOCATION: a city, a country
|
|
|
|
:EMPLOYER: The employer
|
|
|
|
:END:
|
2018-04-18 21:24:09 +00:00
|
|
|
|
2018-04-18 21:35:46 +00:00
|
|
|
I write about awesome stuff I do.
|
|
|
|
,** Other job
|
|
|
|
:PROPERTIES:
|
|
|
|
:CV_ENV: cventry
|
|
|
|
:FROM: <2013-09-01>
|
|
|
|
:TO: <2014-08-07>
|
|
|
|
:LOCATION: my city, your country
|
|
|
|
:EMPLOYER: The other employer
|
|
|
|
:END:
|
|
|
|
|
2018-04-18 17:22:01 +00:00
|
|
|
I write about awesome stuff I do.
|
2018-04-18 21:07:19 +00:00
|
|
|
|
2018-04-18 17:22:01 +00:00
|
|
|
,* Other stuff I do
|
|
|
|
- I work a lot
|
|
|
|
- I sleep a lot
|
|
|
|
- I eat a lot
|
|
|
|
#+END_SRC
|
|
|
|
* Latex Exporter
|
2018-04-18 22:44:54 +00:00
|
|
|
:PROPERTIES:
|
|
|
|
:EXPORT_FILE_NAME: latex_export
|
|
|
|
:END:
|
|
|
|
|
2018-04-18 17:22:01 +00:00
|
|
|
** Using modern-cv
|
2018-04-18 21:02:48 +00:00
|
|
|
[[https://www.ctan.org/tex-archive/macros/latex/contrib/moderncv][moderncv]] is a standard \(\LaTeX\) package that you can find in many of your
|
|
|
|
latex distributions. For I maintain for personal purposes a fork of it to
|
|
|
|
better work with my use case at https://github.com/Titan-C/moderncv.git
|
|
|
|
Feel free to use any or even your personal fork for your desired use case.
|
|
|
|
|
|
|
|
To configure the export for moderncv you need the addition options in your
|
|
|
|
org file.
|
2018-04-19 01:07:52 +00:00
|
|
|
#+BEGIN_SRC org :tangle moderncv.org
|
2018-04-18 21:02:48 +00:00
|
|
|
# CV theme - options include: 'casual' (default), 'classic', 'oldstyle' and 'banking'
|
|
|
|
,#+CVSTYLE: banking
|
|
|
|
# CV color - options include: 'blue' (default), 'orange', 'green', 'red', 'purple', 'grey' and 'black'
|
|
|
|
,#+CVCOLOR: green
|
|
|
|
#+END_SRC
|
|
|
|
|
2018-04-18 21:35:46 +00:00
|
|
|
# Next block is to generate exports
|
2018-04-19 01:07:52 +00:00
|
|
|
#+BEGIN_SRC org :exports none :tangle moderncv.org
|
2018-04-18 21:35:46 +00:00
|
|
|
#+include: basic_cv.org
|
|
|
|
#+include: sideactivities.org
|
|
|
|
#+include: workcontent.org
|
|
|
|
#+END_SRC
|
2018-04-18 21:02:48 +00:00
|
|
|
When exporting you can call the following function to get the latex file.
|
2018-04-18 21:07:19 +00:00
|
|
|
#+BEGIN_SRC emacs-lisp
|
2018-04-18 21:02:48 +00:00
|
|
|
(org-export-to-file 'moderncv "moderncv.tex")
|
2018-05-01 18:44:16 +00:00
|
|
|
(org-latex-compile "moderncv.tex")
|
2018-04-18 21:02:48 +00:00
|
|
|
#+END_SRC
|
2018-05-01 18:44:16 +00:00
|
|
|
|
|
|
|
#+BEGIN_EXPORT md
|
2018-05-01 23:32:50 +00:00
|
|
|
<object data="moderncv.org.pdf" type="application/pdf" width="100%" height="500px">
|
|
|
|
<p>Alternative text - include a link <a href="moderncv.org.pdf">to the PDF!</a></p>
|
2018-05-01 18:44:16 +00:00
|
|
|
</object>
|
|
|
|
#+END_EXPORT
|
2018-04-18 17:22:01 +00:00
|
|
|
** Using alta-cv
|
2018-04-18 21:02:48 +00:00
|
|
|
[[https://github.com/liantze/AltaCV][AltaCV]] is another project to generate a CV, you will need to install it
|
|
|
|
yourself. I maintain a fork too at https://github.com/Titan-C/AltaCV.git
|
2018-04-25 13:10:34 +00:00
|
|
|
because I need extra features and I encourage to use this fork on the
|
|
|
|
=sections= branch.
|
2018-04-18 21:02:48 +00:00
|
|
|
|
|
|
|
The style of this CV is more involved and you need some configuration in
|
|
|
|
your org file to get it to work. First define the margins, the large margin
|
|
|
|
to the right is to allow for a second column.
|
2018-04-19 01:07:52 +00:00
|
|
|
#+BEGIN_SRC org :tangle altacv.org
|
2018-05-01 20:32:05 +00:00
|
|
|
,#+LATEX_HEADER: \geometry{left=1cm,right=9cm,marginparwidth=6.8cm,marginparsep=1.2cm,top=1.25cm,bottom=1.25cm}
|
2018-04-18 21:02:48 +00:00
|
|
|
#+END_SRC
|
2018-04-18 21:35:46 +00:00
|
|
|
# Next block is to generate exports
|
2018-04-19 01:07:52 +00:00
|
|
|
#+BEGIN_SRC org :exports none :tangle altacv.org
|
2018-04-18 21:35:46 +00:00
|
|
|
#+include: basic_cv.org
|
|
|
|
#+END_SRC
|
2018-04-18 21:02:48 +00:00
|
|
|
Content on the right column has the same structure of a org file, but you
|
|
|
|
need to enclose it in the =\marginpar{}= command as shown next.
|
2018-04-19 01:07:52 +00:00
|
|
|
#+BEGIN_SRC org :tangle altacv.org
|
2018-04-18 21:07:19 +00:00
|
|
|
,#+latex: \marginpar{
|
2018-04-18 21:35:46 +00:00
|
|
|
#+END_SRC
|
2018-04-19 01:07:52 +00:00
|
|
|
#+BEGIN_SRC org :tangle sideactivities.org
|
2018-04-18 21:07:19 +00:00
|
|
|
,* Main Interests
|
2018-04-18 21:02:48 +00:00
|
|
|
- Free/Libre and Open Source Software (FLOSS)
|
|
|
|
- Free food
|
|
|
|
- Free beer
|
2018-03-22 16:37:00 +00:00
|
|
|
|
2018-05-01 18:44:16 +00:00
|
|
|
,* Programming
|
2018-04-18 21:02:48 +00:00
|
|
|
- Python
|
|
|
|
- C/C++
|
|
|
|
- EmacsLisp
|
|
|
|
- Bash
|
|
|
|
- JavaScript
|
|
|
|
- PHP
|
|
|
|
|
2018-04-18 21:07:19 +00:00
|
|
|
,* Languages
|
2018-04-18 21:02:48 +00:00
|
|
|
|
|
|
|
- *English* Fluent
|
|
|
|
- *German* Fluent
|
|
|
|
- *Spanish* Native
|
|
|
|
- *French* Intermediate
|
2018-04-18 21:35:46 +00:00
|
|
|
#+END_SRC
|
|
|
|
# Next block is to generate exports
|
2018-04-19 01:07:52 +00:00
|
|
|
#+BEGIN_SRC org :exports none :tangle altacv.org
|
2018-04-18 21:35:46 +00:00
|
|
|
#+include: sideactivities.org
|
|
|
|
#+END_SRC
|
2018-04-19 01:07:52 +00:00
|
|
|
#+BEGIN_SRC org :tangle altacv.org
|
2018-04-18 21:07:19 +00:00
|
|
|
,#+latex: }
|
2018-04-18 21:02:48 +00:00
|
|
|
#+END_SRC
|
2018-04-18 21:35:46 +00:00
|
|
|
# Next block is to generate exports
|
2018-04-19 01:07:52 +00:00
|
|
|
#+BEGIN_SRC org :exports none :tangle altacv.org
|
2018-04-18 21:35:46 +00:00
|
|
|
#+include: workcontent.org
|
|
|
|
#+END_SRC
|
2018-04-18 21:07:19 +00:00
|
|
|
|
2018-04-25 13:10:34 +00:00
|
|
|
When exporting you can call the following function to get the latex file.
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
2018-05-01 18:44:16 +00:00
|
|
|
(org-export-to-file 'altacv "altacv.tex")
|
|
|
|
(org-latex-compile "altacv.tex")
|
2018-04-25 13:10:34 +00:00
|
|
|
#+END_SRC
|
|
|
|
|
2018-05-01 18:44:16 +00:00
|
|
|
#+BEGIN_EXPORT md
|
2018-05-01 23:32:50 +00:00
|
|
|
<object data="altacv.org.pdf" type="application/pdf" width="100%" height="500px">
|
|
|
|
<p>Alternative text - include a link <a href="altacv.org.pdf">to the PDF!</a></p>
|
2018-05-01 18:44:16 +00:00
|
|
|
</object>
|
|
|
|
#+END_EXPORT
|
|
|
|
|
2019-12-07 19:46:35 +00:00
|
|
|
** Using AwesomeCV
|
|
|
|
|
|
|
|
[[https://github.com/posquit0/Awesome-CV][AwesomeCV]] is another LaTeX template for producing nice-looking
|
|
|
|
CVs. 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:
|
|
|
|
|
|
|
|
#+attr_html: :class table table-striped
|
|
|
|
| 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.
|
|
|
|
|
|
|
|
*** =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
|
|
|
|
[[https://orgmode.org/manual/Plain-lists.html][description list]], which gets converted into a sequence of =\cvskill=
|
|
|
|
commands, with the term as the skill title and the description as its
|
|
|
|
contents.
|
|
|
|
|
2018-05-06 15:52:37 +00:00
|
|
|
* Markdown Hugo Exporter
|
|
|
|
:PROPERTIES:
|
|
|
|
:EXPORT_FILE_NAME: hugo_export
|
|
|
|
:END:
|
|
|
|
If your target is not a PDF file but a website, this exporter extends the
|
|
|
|
[[https://ox-hugo.scripter.co/][ox-hugo]] exporter backend. So be sure to install that too.
|
|
|
|
|
|
|
|
To export, there is nothing fancy to keep track of, but as an example I
|
|
|
|
exclude some tags during export.
|
|
|
|
|
|
|
|
#+BEGIN_SRC emacs-lisp
|
|
|
|
(let ((org-export-exclude-tags '("noexport" "latexonly")))
|
|
|
|
(org-export-to-file 'hugocv "hugocv.md"))
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
You are responsible for styling your website.
|
|
|
|
|
2018-05-01 18:44:16 +00:00
|
|
|
|
2018-04-18 22:44:54 +00:00
|
|
|
* Local Variables :ARCHIVE:
|
|
|
|
# Local Variables:
|
|
|
|
# eval: (add-hook 'after-save-hook #'org-hugo-export-wim-to-md-after-save :append :local)
|
|
|
|
# End:
|