diff --git a/doc/content/post/latex_export.md b/doc/content/post/latex_export.md index 2a473e8..57e621b 100644 --- a/doc/content/post/latex_export.md +++ b/doc/content/post/latex_export.md @@ -92,3 +92,86 @@ When exporting you can call the following function to get the latex file.

Alternative text - include a link to the PDF!

+ + +## Using AwesomeCV {#using-awesomecv} + +[AwesomeCV](https://github.com/posquit0/Awesome-CV) 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: + +
+
+ +| 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` {#cventries} + +Enclose all the subheaders in a `cventries` environment. Subheaders can +be of type `cventry`, `cvschool`, or `cvemployer`. + + +### `cvhonors` {#cvhonors} + +Enclose all the subheaders in a `cvhonors` environment. Subheaders must +be of type `cvhonor` + + +### `cventry` {#cventry} + +Converts to a `\cventry` command. Supports attributes `FROM`, `TO`, `DATE`, +`EMPLOYER`, `LOCATION`, `RIGHT_IMG`. + + +### `cvsubentry` {#cvsubentry} + +Converts to a `\cvsubentry` command. Supports attributes `FROM`, `TO`, `DATE`, +`LABEL` `RIGHT_IMG`. + + +### `cvemployer` {#cvemployer} + +Converts to a `\cventry` with only the title line. Supports attributes +`FROM`, `TO`, `DATE` and `LOCATION`. + + +### `cvschool` {#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` {#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` {#cvskills} + +Converts to a `\cvskills` environment. The headline must contain a +[description list](https://orgmode.org/manual/Plain-lists.html), which gets converted into a sequence of `\cvskill` +commands, with the term as the skill title and the description as its +contents. diff --git a/ox-awesomecv.el b/ox-awesomecv.el index 001ea76..9b90473 100644 --- a/ox-awesomecv.el +++ b/ox-awesomecv.el @@ -117,7 +117,6 @@ holding export options." ;; photo (let* ((photo (plist-get info :photo)) (photo-style (plist-get info :photostyle)) - (_ (message "photo=%s photo-style=%s" photo photo-style)) (style-str (if photo-style (format "[%s]" photo-style) ""))) (when (org-string-nw-p photo) (format "\\photo%s{%s}\n" style-str photo))) @@ -194,7 +193,7 @@ holding export options." (footer-mid (format-spec (or (plist-get info :cvfooter_middle) "") spec)) (footer-right (format-spec (or (plist-get info :cvfooter_right) "") spec))) (when (not (string= "" (concat footer-left footer-mid footer-right))) - (format "\\makecvfooter{%s}{%s}{%s}" footer-left footer-mid footer-right))) + (format "\\makecvfooter{%s}{%s}{%s}\n" footer-left footer-mid footer-right))) ;; Document's body. contents @@ -204,31 +203,78 @@ holding export options." ;; Document end. "\\end{document}"))) +;;;; Produce latex code for a right-float image +(defun org-awesomecv--cventry-right-img-code (file) + (if file + (format "\\begin{wrapfigure}{r}{0.15\\textwidth} + \\raggedleft\\vspace{-4.0mm} + \\includegraphics[width=0.1\\textwidth]{%s} +\\end{wrapfigure}" file) "")) +;;;; Individual cventry/cvsubentry/cvemployer/cvschool headlines (defun org-awesomecv--format-cventry (headline contents info) "Format HEADLINE as as cventry. CONTENTS holds the contents of the headline. INFO is a plist used as a communication channel." (let* ((entrytype (org-element-property :CV_ENV headline)) (title (org-export-data (org-element-property :title headline) info)) - (from-date (or (org-element-property :FROM headline) (error "No FROM property provided for cventry %s" title))) - (to-date (org-element-property :TO headline)) - (employer (org-element-property :EMPLOYER headline)) - (location (or (org-element-property :LOCATION headline) ""))) + (date (org-element-property :DATE headline)) + (from-date (or (org-element-property :FROM headline) date)) + (to-date (or (org-element-property :TO headline) date)) + (employer (or (org-element-property :ORGANIZATION headline) + (org-element-property :SCHOOL headline) + (org-element-property :EMPLOYER headline) + (org-element-property :EVENT headline) + (org-element-property :POSITION headline))) + (location (or (org-element-property :LOCATION headline) "")) + (right-img (org-element-property :RIGHT_IMG headline)) + (label (or (org-element-property :LABEL headline) nil)) + (label-str (if label (format "%s\\hfill{}" label) ""))) (cond + ((string= entrytype "cvemployer") + (format "\n\\cventry{%s}{%s}{}{}{}\n%s\n" + title + (format "%s\\hfill %s" (org-cv-utils--format-time-window from-date to-date) location) + contents) + ) ((string= entrytype "cventry") - (format "\n\\cventry\n{%s}\n{%s}\n{%s}\n{%s}\n{\n%s}\n" + (format "\n\\cventry\n{%s}\n{%s}\n{%s}\n{%s}\n{\n%s%s}\n" employer location title (org-cv-utils--format-time-window from-date to-date) + (org-awesomecv--cventry-right-img-code right-img) contents)) ((string= entrytype "cvsubentry") - (format "\n\\cvsubentry\n{%s}\n{%s}\n{\n%s}\n" + (format "\n\\cvsubentry\n{%s}\n{%s}\n{\n%s%s}\n" title + (format "%s%s" label-str (org-cv-utils--format-time-window from-date to-date)) + (org-awesomecv--cventry-right-img-code right-img) + contents)) + ((string= entrytype "cvschool") + (format "\n\\cventry\n{%s}\n{%s}\n{%s}\n{%s}\n{\n%s%s}\n" + title + location + employer (org-cv-utils--format-time-window from-date to-date) - contents))))) + (org-awesomecv--cventry-right-img-code right-img) + contents)) + ((string= entrytype "cvhonor") + (format "\n\\cvhonor\n{%s}\n{%s}\n{%s}\n{%s}\n" + title + employer + location + (org-cv-utils--format-time-window from-date to-date)))))) + +;;;; Headlines of type "cventries" +(defun org-awesomecv--format-cvenvironment (environment headline contents info) + "Format HEADLINE as as a cventries/cvhonors environment. +CONTENTS holds the contents of the headline. INFO is a plist used +as a communication channel." + (format "%s\n\\begin{%s}\n%s\\end{%s}\n" + (org-export-with-backend 'latex headline nil info) + environment contents environment)) ;;;; Headline (defun org-awesomecv-headline (headline contents info) @@ -240,8 +286,14 @@ as a communication channel." (or (org-string-nw-p env) "block")))) (cond ;; is a cv entry or subentry - ((or (string= environment "cventry") (string= environment "cvsubentry")) + ((or (string= environment "cventry") + (string= environment "cvsubentry") + (string= environment "cvemployer") + (string= environment "cvschool") + (string= environment "cvhonor")) (org-awesomecv--format-cventry headline contents info)) + ((or (string= environment "cventries") (string= environment "cvhonors")) + (org-awesomecv--format-cvenvironment environment headline contents info)) ((org-export-with-backend 'latex headline contents info)))))) ;;;; Plain List, to intercept and transform "cvskills" lists @@ -250,11 +302,12 @@ as a communication channel." "Transcode a PLAIN-LIST element from Org to LaTeX. CONTENTS is the contents of the list. INFO is a plist holding contextual information." - (let* ((cv-env (org-entry-get (org-element-property :begin plain-list) "CV_ENV" t))) + (let* ((cv-env (org-entry-get (org-element-property :begin plain-list) "CV_ENV" nil)) + (parent-type (car (org-element-property :parent plain-list)))) (cond ((string= cv-env "cvskills") (format "\\begin{cvskills}\n%s\\end{cvskills}" contents)) - ((or (string= cv-env "cventry") (string= cv-env "cvsubentry")) + ((and (eq parent-type 'section) (or (string= cv-env "cventry") (string= cv-env "cvsubentry") (string= cv-env "cvschool"))) (format "\\begin{cvitems}\n%s\\end{cvitems}" contents)) (t (org-latex-plain-list plain-list contents info))))) diff --git a/readme.org b/readme.org index 05ac1ef..f7d558c 100644 --- a/readme.org +++ b/readme.org @@ -213,6 +213,76 @@ When exporting you can call the following function to get the latex file. #+END_EXPORT +** 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. + * Markdown Hugo Exporter :PROPERTIES: :EXPORT_FILE_NAME: hugo_export