noxz-sites

A collection of a builder and various scripts creating the noxz.tech sites
git clone https://noxz.tech/git/noxz-sites.git
Log | Files | README | LICENSE

commit: ed1c97326d475c00b23d9a6c09a047df28660eb4
parent: 64cd4ec3ab697b0bce1a5e98591a9a4e46889ee5
author: Chris Noxz <chris@noxz.tech>
date:   Sat, 26 Oct 2019 20:29:46 +0200
New groff article about a 'Simple compiler for vim'
Anoxz.tech/guides/groff/simple_compiler_for_vim/index.md73++++++++++++++++++++
1 file changed, 73 insertions(+)
diff --git a/noxz.tech/guides/groff/simple_compiler_for_vim/index.md b/noxz.tech/guides/groff/simple_compiler_for_vim/index.md
@@ -0,0 +1,73 @@
+Simple compiler for vim
+=======================
+When writing documents in vim it's nice to have a quick way of compiling them
+into desired formats. In my case I compile my groff files into pdfs, while at
+the same time having a preview in zathura. Zathura automatically detects
+changes in pdfs and reloads accordingly, which is nice.
+
+The compiler code
+-----------------
+Below I will describe the code in short.
+
+    #!/bin/sh
+    
+    _FILE=$(readlink -f "$1")
+    _DIR=$(dirname "$_FILE")
+    _BASE="${_FILE%.*}"
+    _PRFX="---COMPILE:"
+    _ARGS="$(grep -oP -- "$_PRFX.*$" "$_FILE" |  sed -s "s|$_PRFX||")"
+    
+    cd "$_DIR" || return
+    
+    case "$_FILE" in
+    *\.ms)  preconv "$_FILE"                                                \
+            | refer                                                         \
+            | tbl -Tpdf                                                     \
+            | eqn -Tpdf                                                     \
+            | pic -Tpdf                                                     \
+            | groff -k -ms $_ARGS -dpaper=a4 -P-pa4 -P-e -Tpdf              \
+            | gs                                                            \
+                -q                                                          \
+                -dNOPAUSE                                                   \
+                -dBATCH                                                     \
+                -dPDFSETTINGS=/prepress                                     \
+                -sDEVICE=pdfwrite                                           \
+                -dPrinted=false                                             \
+                -sOutputFile="$_BASE.pdf" -
+            ;;
+    esac
+
+The script above is called *compile* and is intended to be used for multiple
+file types. In this version I have only implemented support for *.ms* files.
+First the filename is read from the first argument to the script. From the
+filename I determine the directory path and the "base name" without the
+filename's extension. In the file I search for the pattern *---COMPILE:* as it
+may contain additional arguments for the compiler (used above as *$_ARGS*).
+
+The script then changes the directory to the file's directory and executes a
+chain of programs. First *preconv* is executed to handle unicode characters.
+Then *refer* handles references, *eqn* handles mathematical expressions, *pic*
+handles pictures, groff compiles everything into an *a4* pdf using the *ms*
+macro set and finally Ghostscript runs post processing and embeds used fonts
+into the pdf (while preserving hyperlinks).
+
+Everything is then being outputted to the same "base name", but as a pdf file.
+
+Usage in vim
+------------
+In vim I have the following key binding set to compile the document upon
+request.
+
+    map <leader>c :w! \| silent !compile <c-r>%<CR><Esc>:redraw!<CR>
+
+Not much to say here. The document is being saved, compiled and then vim is
+being redrawn (to avoid glitches).
+
+Workflow
+--------
+My usual workflow for writing documents in vim, using the above compiler,
+consists of me first starting a terminal (with tmux). I then open a new tab,
+start vim and setup everything for a base document in groff. After that I run
+the compiler to create an empty pdf. In the first tab I execute zathura to view
+the pdf. As I use dwm (a tiling window manager), I have vim on one side of the
+screen and zathura on the other. Simple and functional!