This is a markdown setup demonstrating the power and use of markdown for technical documents:
-
fully automated conversion sequence using
gradle
+pandoc
such that exporting (Content.md) is done in the background:- export to PDF with
pandoc
toxelatex
usinglatexmk
See Output - export to HTML with
pandoc
tohtml
See Output - [todo] export to PDF with
pandoc
tohtml
then tochrome
withpupeteer
- export to PDF with
-
pandoc filters for different AST (abstract syntax tree) conversions:
- own filters with panflute [doc]
- --crosscite [doc] for citing
- pandoc-crossref [doc] for cross referencing
- pandoc-include-files [doc] for file transclusion
-
Full-fledged VS Code setup to write and style your document in one of the best IDEs.
Execute the following in a shell:
./gradlew -t build-html
This will build the HTML output from its markdown main file.
Pandoc is awesome and the founder John MacFarlane develops pandoc in a meticulous and principled style. The documentation is pretty flawless and the community (including him) is really helpful. That is why we rely heavily on pandoc.
-
We target the output formats
html5
andlatex
, because- HTML can be viewed in all browsers and web standards such as CSS3 etc. have become a major advantage and enables ridiculuous dynamic, interactive styling. Collapsable table of contents is just the beginning.
- LaTeX enables to produce high quality output PDF (
xelatex
). Every proper book and distributed PDF is written and set in LaTeX.
-
The orchestration around calling
pandoc
is basically only a file watchergradle
which callspandoc
on file changes. We want as little as possible different tools to achieve the above output formats. That also means we do not want to have lots of pre- and post-processing tasks aside from runningpandoc
. The main goal is, that users can writemarkdown
as a first-party solution with some enhanced features enabled bypandoc
itself. Writting technical documents should become a breeze. -
The common agreement in the industry about using M$ Office for writting technical documentations as demonstrated here, is considered the most complete and utter bullshit you can adhere to. Certainly employees mostly must obey. The common argument is "people need to exchange documents and work on it". experiences, a lot of time and money is spent which gets never debated.
It's about high time to turn into a direction which will likely become the standard. Technical writters should really focus on the content they write and not focus on styling quirks and tricks.
-
Every technical document writter probably knows about source code management (
git
). There you go with proper team work.
For the Gradle build tool you need a working Java runtime. On Linux and macOS you can do:
brew install java
You should not need to install Gradle, since everything is setup by the checked-in gradlew
Gradle wrapper.
You should not need to install yarn
since everything is handled by the dependent Gradle task installFrontend
. If you experience problems with having the node modules not correctly setup, use
cd tools
../build/yarn/bin/yarn install --modules-path build/node_modules
Install pandoc (>= 2.9.2.1, tested with 2.16.2)
For Linux and macOs:
brew install pandoc pandoc-crossref
For Windows:
choco install pandoc
Install a recent python3
(>= 3.9) and the following packages.
Setup a python environment in .venv
with
python -m venv --system-site-packages ./.venv
and install the packages:
python -m venv --system-site-packages .venv # or simply symlink to an existing one.
source .venv/bin/activate
pip3 install -r tools/.requirements
The VS Code tasks pass the config ${config:python.pythonEnv}
directly as an argument to gradlew
(if not set python
is the default). The tasks are run in a shell where ./.venv/bin/activate
has been called.
Then, pandoc
will use the correct python when launching the filters.
You can also use the ignored .envrc file with direnv.
Run the following tasks defined in tasks.json from VS Code or use the following shell commands:
-
Show HTML Output: Serves the HTML for preview in a browser with autoreload:
./gradlew -t view-html
-
Convert Markdown -> HTML: Runs the markdown conversion with Pandoc (
html
) continuously:./gradlew -t build-html
- The conversion with pandoc applies the following filters in defaults.
- The HTML output can be inspected in
Content.html
.
-
Convert Markdown -> PDF: Runs the markdown conversion with Pandoc (
latexmk
andxelatex
) continuously:./gradlew -t build-pdf-tex
- The conversion with pandoc applies the following filters in defaults.
- The PDF output can be inspected in
Content.pdf
. - The LaTeX output can be inspected in
build/output-tex/input.tex
.
-
Convert Markdown -> Jira: Runs the markdown conversion to Jira (experimental) with Pandoc continuously:
./gradlew -t build-jira
- The conversion with pandoc applies the following filters in defaults.
- The Jira output can be inspected in
Content.jira
.
You can edit the main.less file to change the look of the markdown. Edit the main.less file to see changes in the conversion from Content.md.
The following templates are responsible for the LaTeX output:
- Template.tex : The main template.
- Header.tex : The class, packages and styles defining the document, included by the main template with
include-in-header
in pandoc-latex.yaml
Pandoc filters are harder to debug. There is an included unix-like tee.py filter
which can be put anywhere into the filter chain as needed, to see the AST JSON output in the folder build/pandoc-filter-out
(see dev.py for adjustments). The filter teeStart.py
first clears all output before doing the same as tee.py.
Uncomment the tee.py
filters in pandoc-filters.yaml.
Using pandoc >=2.10
we have more types and AST changes in
meaning that also the python library panflute
needs to be supporting this:
- Issue :
So far relative paths are not yet supported in pandoc-include-files.lua
filter.
- Issue :
- Wrong format for
latex
: Issue : -> Update to next version.
- Add CI.
- Add tests.
- Add prince conversion to PDF.
When you use Githooks and you would like to say thank you for its development and its future maintenance: I am happy to receive any donation: