├── .gitignore
├── Fonts-README.md
├── README.md
├── docs
├── H-W-Jones.pdf
├── assets
│ ├── css
│ │ └── cv.css
│ ├── images
│ │ ├── android-chrome-192x192.png
│ │ ├── android-chrome-384x384.png
│ │ ├── apple-touch-icon.png
│ │ ├── favicon-16x16.png
│ │ ├── favicon-32x32.png
│ │ ├── favicon.ico
│ │ ├── mstile-150x150.png
│ │ ├── safari-pinned-tab.svg
│ │ └── simple-cv.png
│ └── js
│ │ └── cv.js
├── browserconfig.xml
├── index.html
└── site.webmanifest
├── metadata
├── format.yml
├── html-options.yml
├── pdf-options.yml
└── personal.yml
├── process.ps1
├── process.sh
├── sections.txt
├── sections
├── appointments.md
├── education.md
├── fields.md
├── languages.md
├── lectures.md
├── publications.md
├── service.md
├── skills.md
└── teaching.md
└── templates
├── html.html
├── tex-windows.tex
└── tex.tex
/.gitignore:
--------------------------------------------------------------------------------
1 | tmp
2 | *.log
3 | *.otf
4 |
5 |
--------------------------------------------------------------------------------
/Fonts-README.md:
--------------------------------------------------------------------------------
1 | # Fonts in Simple-CV
2 |
3 | Handling fonts in a LaTeX document like what ends up being the pdf version of
4 | your CV can be complicated. Hopefully, you will just set the name of your font
5 | in the right place in `metadata/pdf-options.yml`, and everything will work
6 | correctly. However, it may be the case that XeLaTeX (what’s actually making
7 | the pdf) cannot find your font. In that case, you have a few options:
8 |
9 | 1. In your shell, use the command `fc-list : family` to get a list of fonts
10 | that LaTeX seems to know about. This list is not authoritative, but it’s a
11 | good start. For example, if you don’t know what your specific version of
12 | Garamond is called, you can run `fc-list : family | grep -i "Garamond"`,
13 | which will print every font that matches “Garamond.” Note that if a font is
14 | listed twice on the same line, separated by a comma, the part before the
15 | comma is what you want.
16 | 2. Download or copy the font you want to use into this repository. For
17 | example:
18 | 1. Go to [dafont](http://www.dafont.com) and download the font [Lemon
19 | Tuesday](https://www.dafont.com/lemon-tuesday.font?l[]=10&l[]=1), which
20 | is 100% free.
21 | 2. Unzip the downloaded file and move the file `Lemon Tuesday.otf` into the
22 | same directory as this file.
23 | 3. Edit line 10 of `metadata/pdf-options.yml` to read: `regular-font: Lemon
24 | Tuesday.otf`.
25 | 4. Execute the shell script with `sh process.sh`
26 | 5. The new pdf of the CV should be nearly unreadable, but it proves that
27 | changing the font worked.
28 |
29 | For the purposes of a CV, I recommend using Georg Duffner’s free [EB
30 | Garamond](https://bitbucket.org/georgd/eb-garamond/downloads/). If you
31 | download and install EB Garamond, you can set line 10 of
32 | `metadata/pdf-options.yml` to read: `regular-font: EB Garamond`.
33 |
34 | If you need help installing fonts, Fontspring has a [tutorial for installing
35 | fonts on Windows or Mac](https://www.fontspring.com/support/installing).
36 |
37 | Once EB Garamond is installed, you can make use [its advanced OpenType
38 | features](https://en.wikipedia.org/wiki/EB_Garamond#OpenType_Features) like
39 | [swash](https://en.wikipedia.org/wiki/Swash_(typography)) features for italic
40 | shapes or various ligature settings, like “historic” and “rare.” To learn more
41 | about these various features and how to enable them in `templates/tex.tex`,
42 | please see section IV of the [Fontspec
43 | documentation](http://mirrors.ctan.org/macros/latex/contrib/fontspec/fontspec.pdf).
44 | Here, for example, is the appropriate section of [my own
45 | cv](http://cv.moacir.com/MPdSP-cv.pdf)’s template:
46 |
47 | ```tex
48 | \setmainfont{$regular-font$}[%
49 | $if(pdf-bold-as-smallcaps)$
50 | BoldFont = $regular-font$ ,
51 | BoldFeatures = {Letters=SmallCaps} ,
52 | $endif$
53 | Ligatures=Historic ,
54 | Ligatures=Rare ,
55 | ItalicFeatures={Style=Swash} ,
56 | Mapping=tex-text
57 | ]
58 | ```
59 |
60 | Finally, the fonts may not work entirely as advertised in terms of producing
61 | smallcaps or replacing bold with smallcaps. Again, adjusting the options sent
62 | to Fontspec should help get precisely the look you want.
63 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # simple-cv
2 |
3 | 
4 |
5 | This repository lets one write an academic CV using Markdown. With the
6 | discrete Markdown files and a bit of information provided by `YAML` files, it
7 | generates a CV in both `html` and `pdf` forms that have similar content.
8 | Furthermore, it even allows you to host them on GitHub Pages. This project was
9 | inspired by my [own cv](http://cv.moacir.com), which uses the same underlying
10 | logic.
11 |
12 | Demos:
13 |
14 | * [http://plain-plain-text.github.io/simple-cv/ ](http://plain-plain-text.github.io/simple-cv/)
15 | * [http://plain-plain-text.github.io/simple-cv/H_W_Jones.pdf ](http://plain-plain-text.github.io/simple-cv/H_W_Jones.pdf)
16 |
17 | ## Requirements/Assumptions
18 |
19 | 1. You have used the command line before. The creation of the `html` and `pdf`
20 | files is done with a shell script you run from the command line.
21 |
22 | 1. You generally know what Git is and how to stage, commit, and push.
23 |
24 | 1. You know the basics of the [YAML
25 | syntax](https://learnxinyminutes.com/docs/yaml/). The repository as it
26 | exists here has examples of all the features in it, but it’s useful to know
27 | what YAML is, at least.
28 |
29 | 1. [Pandoc](https://pandoc.org/) installed. The Pandoc people have an
30 | [installation
31 | page](https://pandoc.org/installing.html) that explains the process for
32 | various systems. For Macs, you can simply do `brew install pandoc` if you
33 | have [Homebrew](http://brew.sh) installed, which you should.
34 |
35 | 1. A TeX engine of some sort. The folks at Pandoc [have recommendations and
36 | instructions](https://pandoc.org/installing.html) for different operating systems.
37 |
38 | ## Installing
39 |
40 | 1. Fork this repository by clicking on the “Fork” link at the top of this
41 | page.
42 |
43 | 1. In your new, forked repository, enable GitHub pages:
44 | * Click on the “Settings” on your repository’s GitHub page.
45 | * Scroll down to “GitHub Pages” and choose “master branch /docs folder.”
46 | * Click “Save” beside that.
47 |
48 | Now the sample CV should be visible at `http://GITHUBUSERNAME.github.io/simple-cv/`.
49 |
50 | 1. Your forked repository should now be cloned to your computer. GitHub
51 | [provides extensive
52 | instructions](https://help.github.com/articles/fork-a-repo/), but your own
53 | method may vary. If you use Atom as your text editor (which is a good
54 | choice, especially for beginners), you can follow [the instructions I wrote
55 | for my JavaScript students on linking Atom to a GitHub
56 | repository](https://the-javascripting-english-major.org/1-environment#s-link-atom-to-github),
57 | but you should note that the url you want to use is
58 | `https://github.com/GITHUBUSERNAME/simple-cv.git`.
59 |
60 | 1. Once the repository is forked to your GitHub account and cloned to your
61 | computer, you can start editing the YAML files in `metadata/` and the Markdown
62 | files in `sections/` as indicated below.
63 |
64 | ## Editing
65 |
66 | There are three things to edit in this repository.
67 |
68 | 1. The data, which is simple information about yourself and about the CV
69 | you want, which is distributed among the `YAML` files saved in `metadata/`.
70 |
71 | 1. Each section of your CV (education, publications, etc.) is its own Markdown
72 | file in `sections/`. **Note:** The processing script does not know about
73 | these files, so you need to inform the script about them by filling out the
74 | file `sections.txt` with each file’s name on a separate line. This allows
75 | you to determine the order of the sections on the fly.
76 |
77 | 1. The look and feel of both the `html` and `pdf` versions of the document are
78 | managed by the two files in the `templates/` directory. The [Pandoc
79 | templating language](https://pandoc.org/MANUAL.html#templates) is pretty
80 | straightforward, and the templates reveal how the data in `metadata/` is
81 | incorporated into the templates. That said, just because the templating
82 | language is easy doesn’t mean the templates are. The `html` file depends on
83 | the [Bootstrap](http://getbootstrap.com) framework, and the `pdf` file
84 | depends on the rather expansive [`memoir` LaTeX
85 | package](https://ctan.org/pkg/memoir?lang=en). I have tried to make the
86 | defaults acceptable, aesthetically, but I leave fine tuning up to you.
87 |
88 | When you’ve made your changes, you must run the shell script in command line:
89 |
90 | `sh process.sh`
91 |
92 | If you have the [`run-command`](https://atom.io/packages/run-command) package
93 | installed in Atom, you can simply type `ctrl-r` and type in `sh process.rb` in
94 | the little dialog box to process the files without the need of opening the
95 | command line or leaving Atom.
96 |
97 | The shell script produces new versions of the `html` and `pdf` files, so you can
98 | subsequently stage, commit, and push, to make the files available online via
99 | GitHub.
100 |
101 | ## Features
102 |
103 | * Single source for both “paper” and web versions of your cv.
104 | * Customizable sections that can be switched in and out or reordered just by
105 | changing the contents of `sections.txt`.
106 | * Customizable styles for `html` *and* `pdf` (fonts, etc.) via `YAML` configuration files.
107 | * Straightforward templates that allow for massive flexibility with
108 | comparatively little effort.
109 | * Agnostic taxonomy of sections. If you don’t want to include your
110 | publications, say, don’t.
111 | * Responsive `html` page with dynamically generated navbar provided by
112 | [Bootstrap](http://getbootstrap.com).
113 | * URL support for digital projects, etc., in the `pdf`, meaning readers can
114 | click on the `pdf` to open websites.
115 | * Dublin Core, Open Graph, and Twitter card metadata in the web version.
116 |
117 | ## `metadata/` `YAML` files.
118 |
119 | **This section is liable to be out of date!**
120 |
121 | ### `format.yml`
122 |
123 | This document holds all the configuration options shared in common between
124 | `html` and `pdf` versions.
125 | documents as well as the `html` and `pdf` versions on their own. These options
126 | become variables like `$format.title$` in the templates. The templates use
127 | [Pandoc’s templating language](https://pandoc.org/MANUAL.html#templates),
128 | which allows for, crucially, iteration and conditionals. The options are split
129 | up into three groups:
130 |
131 | #### General options
132 |
133 | These are mandatory:
134 |
135 | * `title` this sets the `
` tag for the webpage and the metadata title
136 | for the pdf.
137 | * `author`: This can be a collection or a single value of the author’s name.
138 | * `author-lastname-first`: Dublin Core prefers the names to be with the family
139 | name first. Definitely surround this with quotes.
140 | * `mode`: For the time being, this must be set to `markdown`.
141 | * `cv-sections`: This `YAML` collection stands in as the list of sections to
142 | the CV. Every section is its own Markdown page in the `sections/` directory.
143 | The order in which they are listed here is the order in which they appear in
144 | the final documents
145 | * `contact-information`: The first section, “Contact Information,” isn’t
146 | created by a section above. Here is where you can set what the heading is.
147 | * `markers`: Most of the CV is probably unordered lists. Here you can set what
148 | markers make up the first three levels deep on the list. Any sort of
149 | character should work for html, but some characters may break the
150 | pdf-template. I use `»` for top level and `›` for the rest.
151 | * `level-1`: First level marker. Default is `•`.
152 | * `level-2`: Second level marker. Default is `-`.
153 | * `level-3`: Third level marker. Default is `*`.
154 |
155 | #### `pdf` options
156 |
157 | These options alert the `pdf` template to make certain decisions in building
158 | the document
159 |
160 | * `filename`: The name of the resulting `pdf` document (which is linked to
161 | from the `html` page as well).
162 | * `footer`: By default, a footer is added that includes the author(s) name(s)
163 | and the last modified date. One or both of those options can be suppressed.
164 | * `fonts`: This lets you give the name of OpenType fonts for use in the
165 | document, but they must be in the `fonts/` directory. See `fonts/FONTS-README.md`
166 | for more details.
167 | * `headings`: One of two settings for the section headings. The
168 | default is `overlapped`, which creates headings that jut out to the left a
169 | bit in comparison to the body. The only other option is `margin`, which
170 | places the headings in their own boxes in the margin to create a nice
171 | effect.
172 | * `smallcaps-headings`: Whether the headers and name are in small caps or not.
173 | * `bold-as-smallcaps`: Text typed as `**bold**` will appear as small caps
174 | instead. This is useful when your font (EB Garamond, say) does not have a
175 | bold face.
176 | * `papersize`: Letter paper (8.5in x 11in) is the default, but any page size
177 | LaTeX understands works. `a4` is the only other size I can imagine using for a CV…
178 | * `typesize`: How large the default text should be. The headings, etc., are
179 | all scaled in relation to this setting.
180 | * `left-margin`: The left margin. Can be set in inches, centimeters,
181 | whatever. In the absence of a `right-margin`, it stands in for both
182 | horizontal margins.
183 | * `right-margin`: The right margin. Only needed if it’s different from the
184 | left margin.
185 | * `top-margin`: Should be a minimum of about .5in so that there is room at
186 | the bottom for the footer.
187 | * `bottom-margin`: Unneeded unless the margin is different from the top
188 | margin. If this margin is large enough for the footer (.5in or so), then
189 | the top-margin can be made hilariously small.
190 | * `display-style`: I created a default look, called `line` that is based on
191 | the `resume` package. However, any `memoir` chapter style, as demonstrated
192 | in [10.5 of the Memoir
193 | manual](http://texdoc.net/texmf-dist/doc/latex/memoir/memman.pdf) can be
194 | used here. Reasonable values include: `bianchi`, `bringhurst`, `chappell`,
195 | `crosshead`, `demo2`, `dowding`, `lyhne`, and `wilsondob`. Some of these styles will
196 | clobber your font choices.
197 |
198 | #### `html` options
199 |
200 | * `headshot-url`: Some cultures expect a headshot in a CV. Here is where you
201 | tell Pandoc where to find it. Leaving it blank means no headshot. This
202 | feature does not yet work perfectly, so it is left off by default.
203 | * `lang`: The language code for the CV. Default is `en` because American hegemony.
204 | * `fontawesome`: Whether to use the [Font Awesome](http://fontawesome.com)
205 | icons.
206 | * `background-color`: *Enclosed in "*, this is color recognizable by CSS, so, typically, either a hex value (“`#nnnnnn`”), an rgb value (“`rgb(n, n, n)`”), or an
207 | rgba value if you want to change the opacity (“`rgba(n, n, n)`”). See [this
208 | color picker](https://www.w3schools.com/colors/colors_picker.asp) provided
209 | by W3Schools to handcraft your color choice.
210 | * `navbar`: A set of settings regarding the navbar that is added by default.
211 | * `background`: This option, set to `light` by default, corresponds to Bootstrap’s [semantic background
212 | colors](https://getbootstrap.com/docs/4.1/utilities/colors/#background-color)
213 | * `text`: `light` or `dark`, this corresponds to the background, so it’s a
214 | bit counter intuitive. That is, pick `light` if your background is light
215 | (though the text will be dark) and vice versa.
216 | * `position`: By default, the navbar scrolls with the rest of the CV. The
217 | other options, `fixed-top` and `fixed-bottom`, change that behavior. The
218 | most correct one to use is `sticky-top`, but that is not fully supported
219 | in all browsers yet.
220 | * `margin`: If the navbar is fixed, then we need to push the content away
221 | from it to provide some padding. Here you can tell it how many pixels to
222 | push it away. Default is 20.
223 | * `background-color`: This overrides the selection made for the navbar
224 | `background` above. See `background-color` above for information about
225 | picking colors.
226 | * `fonts`: Three separate font families are supported, one for the body text,
227 | one for the headings, and one for the navbar. If you only want one custom
228 | font throughout, set the `body` font and comment our `headings` and
229 | `navbar`. Each of `body`, `headings`, and `navbar` needs three options:
230 | * `type`: `serif`, `sans-serif`, or `monospace`. This is the fallback
231 | should the preferred font not load.
232 | * `url`: The URL for the font, like from
233 | [Google](http://fonts.google.com).
234 | * `name`: The name of the font for the CSS.
235 | * `colors`: These allow adjusting the color values of the text. See
236 | `background-color` above for information about picking colors. Each
237 | color value must be enclosed in quotes. These are *optional*.
238 | * `body`: The color of the main body text.
239 | * `headings`: The color of the headings.
240 | * `display`: The color of the display name.
241 | * `navbar-items`: The color of the items in the navbar.
242 | * `links`: These adjust the colors of links.
243 | * `regular`: The color of the link text under regular circumstances.
244 | * `hover`: The color of the link text when the mouse or finger hovers
245 | over it.
246 | * `smallcaps-headings`: Whether the headers and name are in small caps or not.
247 | * `bold-as-smallcaps`: Text typed as `**bold**` will appear as small caps
248 | instead. This is useful when your font (EB Garamond, say) does not have a
249 | bold face.
250 | * `keywords`: A list of keywords for SEO like this even works.
251 | * `last-modified`: As with the `pdf`, this triggers a “last modified” widget
252 | to appear at the top right corner of the page.
253 | * `meta-title`: The title used in the metadata on Twitter or Facebook.
254 | * `canonical-url`: The canonical URL for the site.
255 | * `date-created`: A date when the CV was _created_, as opposed to last
256 | _modified_.
257 | * `description`: A short description of the CV.
258 | * `og-image`: This gives a few settings to embed an image in the metadata for
259 | sharing on Twitter or Facebook.
260 | * `url`: The URL of the image
261 | * `type`: Its type. Probably `image/jpeg` or `image/png`.
262 | * `height`: Its height.
263 | * `width`: Its width.
264 |
265 | ### personal.yml
266 |
267 | ## Sections
268 |
269 | The sections are all separate Markdown files in the `sections/` directory.
270 | They can be called whatever, but the file names must correspond with the
271 | `cv-sections` collection in `metadata/format.yml`.
272 |
273 | Each section should begin with a `## Header`. Failure to do so will cause
274 | problems in both the `html` and `pdf` versions of the CV. The text of the
275 | header can be whatever.
276 |
277 | The Markdown files can then be written however you want. A list, a narrative,
278 | things with links, whatever is expected in your field and aligned with your
279 | fantasies.
280 |
281 | ## Rationale
282 |
283 | Being able to update both my online and “paper” CV at once has been a goal for
284 | over a decade. Luckily, Pandoc has stepped in to make that process simpler.
285 | This project used to be a complicated and very brittle system using
286 | MultiMarkDown and shell script. This all works, in my opinion, more simply.
287 |
288 | ## Features to Add
289 |
290 | * YAML mode that gets rid of Markdown completely
291 | * BibTeX support
292 | * Europass support
293 | * Sass integration with Bootstrap.
294 |
--------------------------------------------------------------------------------
/docs/H-W-Jones.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/plain-plain-text/simple-cv/6684cc83d8a55ee2013ee2c5b7f17d88e6fe05c3/docs/H-W-Jones.pdf
--------------------------------------------------------------------------------
/docs/assets/css/cv.css:
--------------------------------------------------------------------------------
1 | @media (max-width: 575.98px) {
2 | #widgets {
3 | width: 50%;
4 | }
5 | }
6 | @media (min-width: 576px) {
7 | #widgets {
8 | width: 25%;
9 | }
10 | }
11 |
12 | #cvBody {
13 | max-width: 900px;
14 | }
15 |
16 | body {
17 | font-size: 1.25rem;
18 | }
19 |
20 | .navbar-brand {
21 | font-size: 2rem;
22 | }
23 |
--------------------------------------------------------------------------------
/docs/assets/images/android-chrome-192x192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/plain-plain-text/simple-cv/6684cc83d8a55ee2013ee2c5b7f17d88e6fe05c3/docs/assets/images/android-chrome-192x192.png
--------------------------------------------------------------------------------
/docs/assets/images/android-chrome-384x384.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/plain-plain-text/simple-cv/6684cc83d8a55ee2013ee2c5b7f17d88e6fe05c3/docs/assets/images/android-chrome-384x384.png
--------------------------------------------------------------------------------
/docs/assets/images/apple-touch-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/plain-plain-text/simple-cv/6684cc83d8a55ee2013ee2c5b7f17d88e6fe05c3/docs/assets/images/apple-touch-icon.png
--------------------------------------------------------------------------------
/docs/assets/images/favicon-16x16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/plain-plain-text/simple-cv/6684cc83d8a55ee2013ee2c5b7f17d88e6fe05c3/docs/assets/images/favicon-16x16.png
--------------------------------------------------------------------------------
/docs/assets/images/favicon-32x32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/plain-plain-text/simple-cv/6684cc83d8a55ee2013ee2c5b7f17d88e6fe05c3/docs/assets/images/favicon-32x32.png
--------------------------------------------------------------------------------
/docs/assets/images/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/plain-plain-text/simple-cv/6684cc83d8a55ee2013ee2c5b7f17d88e6fe05c3/docs/assets/images/favicon.ico
--------------------------------------------------------------------------------
/docs/assets/images/mstile-150x150.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/plain-plain-text/simple-cv/6684cc83d8a55ee2013ee2c5b7f17d88e6fe05c3/docs/assets/images/mstile-150x150.png
--------------------------------------------------------------------------------
/docs/assets/images/safari-pinned-tab.svg:
--------------------------------------------------------------------------------
1 |
2 |
4 |
62 |
--------------------------------------------------------------------------------
/docs/assets/images/simple-cv.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/plain-plain-text/simple-cv/6684cc83d8a55ee2013ee2c5b7f17d88e6fe05c3/docs/assets/images/simple-cv.png
--------------------------------------------------------------------------------
/docs/assets/js/cv.js:
--------------------------------------------------------------------------------
1 | // If the navbar is fixed-top, we need to push the container down, etc.
2 | if($(".fixed-top").length){
3 | $("#cvBody").css("margin-top", $("#navbar").height() + $(".fixed-top").data("margin") + "px");
4 | }
5 | if($(".fixed-bottom").length){
6 | $("#cvBody").css("margin-bottom", $("#navbar").height() + $(".fixed-bottom").data("margin") + "px");
7 | }
8 |
9 | if($(window).width() > 575){
10 | $("#widgets").removeClass("w-50").addClass("w-25");
11 | }
12 |
13 | // Build the dropdown.
14 | $("#navList").html(() => {
15 | let list = "";
16 | $("h2").each(function(){ // can't use => because of setting this.
17 | list = list + "