Convert Markdown-ish to PDF with Groff MOM ================-========================= Last edited: $Date: 2021/02/16 20:20:41 $ There are many ways one can generate a PDF file from a Markdown file. One example is to use Pandoc to generate LaTeX and use pdflatex to generate a PDF. Groff can be a lot faster and require a lot less resources. TeX Live packages can be quite large and if you don't need a lot of features this can be overkill. [Mom Macros for GNU Troff](https://www.schaffter.ca/mom/mom-01.html) is a nice toolbox to create beautiful documents. I use this to convert small Markdown-ish meeting notes into a PDF document. We all appreciate the plain text format, but for some people in our organisation this is not the case. A small awk script can do wonders. Example document ---------------- This is a small example of the format I use for meeting notes. # Notes of the meeting with a special name - Date: 16 februari 2021 - Time: 14:00 - 15:00 ## A nice header Some information and some sentences. A lot more text. You can never have enough text. ## Another nice header Here we have another paragraph filled with very interesting text. This is another paragraph. ## Bullets are nice - There can never be too much bullets. - Some more are nice to look at - Always have at least three bullets ### A lower header This paragraph is right between a third level headers, because we want a lot of headers. #### Sublists This is a small test of sublists. Remember that bullets are great. - This is a bullet on the first level. - This too is a bullet on the first level. - This is a bullet on the second level. - This too is a bullet on the second level. - This is the third bullet on the second level. - This again is a bullet on the first level. - This too is a bullet on the first level. Small awk script ---------------- This is the awk script that I use to convert the Markdown-ish file to the Groff mom format. BEGIN { inlisting = 0; inlisting2 = 0; inlisting3 = 0; inparagraph = 0; print ".PAPER A4" print ".TITLE_STYLE COLOR YELLOW" print ".TITLE \"The Screaming Butterflies\" \"Flower Power Workgroup\"" print ".PDF_TITLE \"\\*[$TITLE]" print ".\\\" Formatting style, margins" print ".PRINTSTYLE TYPESET" print ".L_MARGIN 2.5c" print ".R_MARGIN 2.5c" print ".B_MARGIN 2.5c" print ".NEWCOLOR YELLOW #e36c0a" print ".HEADING_STYLE 1 COLOR YELLOW" print ".HEADING_STYLE 2 COLOR YELLOW" print ".\\\" General defaults" print ".FAMILY P" print ".FT R" print ".PT_SIZE 11" print ".AUTOLEAD 3 3" print ".PARA_INDENT 0 \\\" No indent because we're spacing paragraphs." print ".HYPHENATION 0 \\\" No hypenantion of words at end of line." print ".START" } { if ( $0 ~ /^# / ) { reset_list(); printf ".HEADING 1 \"%s\"\n", substr($0, 3); } else if ( $0 ~ /^## / ) { reset_list(); printf ".HEADING 2 \"%s\"\n", substr($0, 4); } else if ( $0 ~ /^### / ) { printf ".HEADING 3 \"%s\"\n", substr($0, 5); } else if ( $0 ~ /^#### / ) { printf ".HEADING 4 \"%s\"\n", substr($0, 6); } else if ( $0 ~ /^- / ) { if ( inlisting2 == 1 ) { inlisting2 = 0; print ".LIST OFF" } if ( inlisting == 0 ) { inlisting = 1; print ".SP .25v" print ".LIST" } print ".ITEM"; print substr($0, 3) } else if ( $0 ~ /^\t- / ) { if ( inlisting == 0 ) { inlisting = 1; print ".SP .25v" print ".LIST" } if ( inlisting2 == 0 ) { inlisting2 = 1; print ".LIST" } print ".ITEM"; print substr($0, 4) } else if ( $0 ~ /^\t\t- / ) { if ( inlisting == 0 ) { inlisting = 1; print ".SP .25v" print ".LIST" } if ( inlisting2 == 0 ) { inlisting2 = 1; print ".LIST" } if ( inlisting3 == 0 ) { inlisting3 = 1; print ".LIST" } print ".ITEM"; print substr($0, 5) } else if ( $0 ~ /^ / ) { if ( inlisting == 1 || inlisting2 == 1 || inlisting3 == 1) { gsub("^ *", "", $0) } } else { if ( inlisting3 == 1 ) { inlisting3 = 0; print ".LIST OFF" } if ( inlisting2 == 1 ) { inlisting2 = 0; print ".LIST OFF" } if ( inlisting == 1 ) { inlisting = 0; print ".LIST OFF" print ".SP .25v" } if ( inparagraph == 0 ) { inparagraph = 1; print ".PP" } print $0 } } function reset_list() { if ( inlisting3 == 1 ) { inlisting3 = 0; print ".LIST OFF" } if ( inlisting2 == 1 ) { inlisting2 = 0; print ".LIST OFF" } if ( inlisting == 1 ) { inlisting = 0; print ".LIST OFF" print ".SP .25v" } } This script creates headers with a color and allows for three levels of lists. I have just hacked it together in short time and stopped when it worked, so there is probably a lot of room for improvement. Run the awk script and pdfmom ----------------------------- To use the script, this is the worfklow: awk -f name-of-the-awk-script > tempfile.mom pdfmom tempfile.mom > final.pdf See also -------- Some very informative resources are: - Documentation of the Groff mom macros set: https://tools.ietf.org/doc/groff/html/mom/toc.html - Comprihensive pages Mom Macros for GNU Troff at schaffter.ca: https://www.schaffter.ca/mom/mom-01.html