From cc5acb4271a3116ed441ac38c01833e06ffd8ef2 Mon Sep 17 00:00:00 2001
From: Pierre-Yves Barriat <pierre-yves.barriat@uclouvain.be>
Date: Mon, 24 Mar 2025 10:34:06 +0100
Subject: [PATCH] Upgrade markdown 2025

---
 .gitignore                                    |    1 +
 learning-markdown/MarkDown.md                 |   78 +-
 learning-markdown/assets/install_all.bash     |   48 +
 learning-markdown/example/advanced.md         |   27 +-
 learning-markdown/example/assets/columns.lua  | 1036 +++++++++++++++++
 learning-markdown/example/report.md           |    4 +-
 .../tex_templates/after-header-includes.latex |   10 +
 .../example/tex_templates/common.latex        |  289 +++++
 .../tex_templates/eisvogel-added.latex        |  303 +++++
 .../tex_templates/eisvogel-title-page.latex   |   67 ++
 .../example/tex_templates/eisvogel.latex      |  938 +--------------
 .../example/tex_templates/font-settings.latex |  103 ++
 .../example/tex_templates/fonts.latex         |   23 +
 .../example/tex_templates/hypersetup.latex    |   35 +
 .../example/tex_templates/passoptions.latex   |    7 +
 15 files changed, 1979 insertions(+), 990 deletions(-)
 create mode 100644 learning-markdown/assets/install_all.bash
 create mode 100644 learning-markdown/example/assets/columns.lua
 create mode 100644 learning-markdown/example/tex_templates/after-header-includes.latex
 create mode 100644 learning-markdown/example/tex_templates/common.latex
 create mode 100644 learning-markdown/example/tex_templates/eisvogel-added.latex
 create mode 100644 learning-markdown/example/tex_templates/eisvogel-title-page.latex
 create mode 100644 learning-markdown/example/tex_templates/font-settings.latex
 create mode 100644 learning-markdown/example/tex_templates/fonts.latex
 create mode 100644 learning-markdown/example/tex_templates/hypersetup.latex
 create mode 100644 learning-markdown/example/tex_templates/passoptions.latex

diff --git a/.gitignore b/.gitignore
index 59e33e8..b968e05 100644
--- a/.gitignore
+++ b/.gitignore
@@ -11,6 +11,7 @@ learning-vscode/VSCode_WSL.html
 learning-vscode/VSCode_Ubuntu.html
 learning-markdown/MarkDown.html
 learning-markdown/TODO_makdown.md
+learning-markdown/example/advanced.pdf
 learning-python/Python.html
 learning-python/sandbox.txt
 
diff --git a/learning-markdown/MarkDown.md b/learning-markdown/MarkDown.md
index e219fd1..1cfa522 100644
--- a/learning-markdown/MarkDown.md
+++ b/learning-markdown/MarkDown.md
@@ -5,7 +5,7 @@ author: P.Y. Barriat
 description: Markdown and applications
 backgroundImage: url('assets/back.png')
 _backgroundImage: url('assets/garde.png')
-footer: 26/03/2024 | Markdown and applications | PY Barriat
+footer: 25/03/2025 | Markdown and applications | PY Barriat
 _footer: ""
 paginate: true
 _paginate: false
@@ -15,12 +15,12 @@ _paginate: false
 Markdown and applications<!--fit-->
 ===
 
-https://forge.uclouvain.be/barriat/learning-markdown
+https://forge.uclouvain.be/elic/learning.git
 
 ![h:250](assets/logo.png)
 
 **Pierre-Yves Barriat**
-ACELI Training Sessions `March 26th, 2024`
+ACELI Training Sessions `March 25th, 2025`
 
 ---
 
@@ -83,8 +83,8 @@ VSC is one of the most popular and powerful text editors used by software engine
 
 ### You didn't already install VS Code ?
 
-Take a look here
-https://forge.uclouvain.be/barriat/learning-vscode
+Take a look in the `learning-git` folder in:
+https://forge.uclouvain.be/elic/learning.git
 
 ---
 
@@ -96,17 +96,11 @@ Pandoc is a library for converting from one markup format to another, and a comm
 > - [Pandoc-crossref](https://github.com/lierdakil/pandoc-crossref/releases)
 
 ```bash
-cd
-wget https://github.com/jgm/pandoc/releases/download/3.1.12.3/pandoc-3.1.12.3-linux-amd64.tar.gz
-wget https://github.com/lierdakil/pandoc-crossref/releases/download/v0.3.17.0f/pandoc-crossref-Linux.tar.xz
-tar xzf pandoc-3.1.12.3-linux-amd64.tar.gz
-tar -xf pandoc-crossref-Linux.tar.xz
-mv pandoc-3*/* .
-mv pandoc-crossref bin
-mv pandoc-crossref.1 share/man/man1
-echo "export PATH=\$PATH:\$HOME/bin" >> .bashrc
-echo "export MANPATH=\$MANPATH:\$HOME/share" >> .bashrc
-rm -rf pandoc*
+cd ; git clone https://forge.uclouvain.be/elic/learning.git
+cd learning/learning-markdown/
+chmod 755 assets/install_all.bash
+./assets/install_all.bash
+exit
 ```
 
 ---
@@ -116,17 +110,6 @@ rm -rf pandoc*
 **LaTeX** is a high-quality typesetting system; it includes features designed for the production of technical and scientific documentation.
 > free and available for [macOS](https://www.tug.org/mactex/), [Windows](https://miktex.org/download), and Linux
 
-```bash
-sudo apt install -y texlive-latex-base \
-                 texlive-latex-recommended \
-                 texlive-fonts-recommended \
-                 texlive-latex-extra \
-                 texlive-fonts-extra \
-                 texlive-xetex \
-                 texlive-lang-french \
-                 texlive-latex-extra
-```
-
 ---
 
 ## Marp
@@ -136,46 +119,19 @@ Marp (MarkDown slides extension) can convert **Marp Markdown** files into static
 Download and install marp-cli (a **CLI** interface for Marp) from the standalone binaries
 > free and [available](https://github.com/marp-team/marp-cli/releases/) for macOS, Windows and Linux
 
-```bash
-cd ; wget https://github.com/marp-team/marp-cli/releases/download/v3.4.0/marp-cli-v3.4.0-linux.tar.gz
-tar xzf marp-cli-v3.4.0-linux.tar.gz
-mv marp bin ; rm -f marp-cli*
-```
-
----
-
-### You must install Chrome, Chromium or Edge
-
-*True* Ubuntu, install **chromium-browser**
-
-```bash
-sudo apt install chromium-browser -y
-```
-
-Ubuntu with WSL, add *ppa* for **google-chrome** and install it
-
-```bash
-wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | sudo gpg --dearmour -o /usr/share/keyrings/google_linux_signing_key.gpg
-sudo sh -c 'echo "deb [arch=amd64 signed-by=/usr/share/keyrings/google_linux_signing_key.gpg] http://dl.google.com/linux/chrome/deb/ stable main" > /etc/apt/sources.list.d/google.list'
-sudo apt update
-sudo apt install google-chrome-stable
-```
-
-> In WSL, snapd is not available by default and chromium-browser needs it
-
 ---
 
 ## VS Code nice extensions
 
 Open VS Code and install the following extensions
 
-- `Markdown All in One` : *v3.5.1 - Yu Zhang*
-- `Marp for VS Code` : *v2.6.0 - Marp team*
+- `Markdown All in One` : *v3.6.3 - Yu Zhang*
+- `Marp for VS Code` : *v3.1.1 - Marp team*
 
 And maybe :
 
-- `Markdown Preview Enhanced` : *v0.6.8 - Yiyi Wang*
-- `Markdownlint` : *v0.50.0 - David Anson*
+- `Markdown Preview Enhanced` : *v0.8.18 - Yiyi Wang*
+- `Markdownlint` : *v0.59.0 - David Anson*
 - `Pandoc Markdown` : *v0.1.2 - rsolano*
 - `Excel to Markdown table` : *v1.3.0 - Sebastian Holmqvist*
 
@@ -187,7 +143,9 @@ https://www.markdownguide.org/basic-syntax/
 
 ## My first example: `README.md` on a Git web server
 
-https://forge.uclouvain.be/barriat/learning-markdown/-/tree/master/example
+```bash
+cd ~/learning/learning-markdown/example
+```
 
 ### How to convert it ?
 
@@ -262,7 +220,7 @@ pandoc -s report.md -o report.pdf --template tex_templates/eisvogel \
 ```bash
 pandoc -s advanced.md -o advanced.html --webtex -H html_templates/report.css --citeproc
 
-pandoc -s advanced.md -o advanced.pdf --template tex_templates/eisvogel --citeproc
+pandoc -s advanced.md -o advanced.pdf --template tex_templates/eisvogel --citeproc --lua-filter assets/columns.lua --listings
 ```
 
 Compare the HTML ouput and the PDF output !
diff --git a/learning-markdown/assets/install_all.bash b/learning-markdown/assets/install_all.bash
new file mode 100644
index 0000000..2322853
--- /dev/null
+++ b/learning-markdown/assets/install_all.bash
@@ -0,0 +1,48 @@
+#!/bin/bash
+# Install Markdown environment for Ubuntu
+# PYB 21/03/2025
+#
+sudo apt update
+sudo apt install -y wget fonts-ubuntu
+
+echo "Download pandoc..."
+cd ; wget https://github.com/jgm/pandoc/releases/download/3.6.2/pandoc-3.6.2-linux-amd64.tar.gz
+echo -e "\nDownload pandoc-crossref..."
+wget https://github.com/lierdakil/pandoc-crossref/releases/download/v0.3.18.1a/pandoc-crossref-Linux-X64.tar.xz
+echo -e "\nInstall pandoc & pandoc-crossref..."
+tar xzf pandoc-*-linux-amd64.tar.gz
+tar -xf pandoc-*.tar.xz
+mv pandoc-3*/* .
+mv pandoc-crossref bin
+mv pandoc-crossref.1 share/man/man1
+echo "export PATH=\$PATH:\$HOME/bin" >> .bashrc
+echo "export MANPATH=\$MANPATH:\$HOME/share" >> .bashrc
+rm -rf pandoc*
+
+echo -e "\nInstall Tex..."
+sudo apt install -y texlive-latex-base \
+                 texlive-latex-recommended \
+                 texlive-fonts-recommended \
+                 texlive-latex-extra \
+                 texlive-fonts-extra \
+                 texlive-xetex \
+                 texlive-lang-french \
+                 texlive-latex-extra
+
+echo -e "\nDownload Marp..."
+cd ; wget https://github.com/marp-team/marp-cli/releases/download/v4.1.2/marp-cli-v4.1.2-linux.tar.gz
+echo -e "\nInstall Marp..."
+tar xzf marp-cli-*.tar.gz
+mv marp bin ; rm -f marp-cli*
+
+echo -e "\nInstall Brave..."
+cd ; sudo curl -fsSLo /usr/share/keyrings/brave-browser-archive-keyring.gpg https://brave-browser-apt-release.s3.brave.com/brave-browser-archive-keyring.gpg
+echo "deb [arch=amd64 signed-by=/usr/share/keyrings/brave-browser-archive-keyring.gpg] https://brave-browser-apt-release.s3.brave.com/ stable main"| sudo tee /etc/apt/sources.list.d/brave-browser-release.list
+sudo apt update
+sudo apt -y install brave-browser
+export CHROME_PATH=`which brave-browser`
+
+echo " " >> $HOME/.bashrc
+echo "alias marp=\"CHROME_PATH=\`which brave-browser\` \$HOME/bin/marp\"" >> $HOME/.bashrc
+
+echo -e "\nALL DONE."
diff --git a/learning-markdown/example/advanced.md b/learning-markdown/example/advanced.md
index 595bf55..6af1acc 100644
--- a/learning-markdown/example/advanced.md
+++ b/learning-markdown/example/advanced.md
@@ -91,11 +91,9 @@ Which produces something as:
 
 #### i. Simple
 
-Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua (see [Table 1](#Table1)).
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua (see Table \ref{Table1}).
 
-    incididunt ut labore et dolore magna aliqua (see [Table 1](#Table1)).
-
-    : Tabla 1: Tabla simple []{#Table1}
+    : Tabla 1: Tabla simple \label{Table1}
 
     | Syntax    | Description |
     | --------- | ----------- |
@@ -104,7 +102,7 @@ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor i
 
 Which renders as:
 
-: Tabla 1: Tabla simple []{#Table1}
+: Tabla 1: Tabla simple \label{Table1}
 
 | Syntax    | Description |
 | --------- | ----------- |
@@ -173,7 +171,9 @@ pear   | 1.37       | 2 kg
 
 To write small caps, use the smallcaps class: 
 
-    This is a  [Small caps text]{.smallcaps} , got it?
+~~~md
+This is a  [Small caps text]{.smallcaps} , got it?
+~~~
 
 This is a  [Small caps text]{.smallcaps} , got it?
 
@@ -182,14 +182,19 @@ This is a  [Small caps text]{.smallcaps} , got it?
 
 #### i. Simple
 
-    See [Fig. 1](#fig1)
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. 
 
+~~~md
 See [Fig. 1](#fig1)
+~~~
 
+See [Fig. 1](#fig1)
 
-    ![Figure 1: A math plot](assets/plot-3d-small.png){#fig1}
+~~~md
+![Figure 1: A math plot](assets/plot-3d-small.png){#fig1}
 
 Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. 
+~~~
 
 ![Figure 1: A math plot](assets/plot-3d-small.png){#fig1}
 
@@ -199,14 +204,14 @@ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor i
 
 See [Fig. 2](#figattrs).
 
-    ![Fig. 2: Image (scaled to width=40% column)](assets/plot-3d-small.png){#figattrs width=40%}
+~~~md
+![Fig. 2: Image (scaled to width=40% column)](assets/plot-3d-small.png){#figattrs width=40%}
+~~~
 
 Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua (see [Fig Attrs](#figattrs)).
 
 ![Fig. 2: Image (scaled to width=40% column)](assets/plot-3d-small.png){#figattrs width=40%}
 
-
-
 ### 2.6 Aside figures and text
 
     <aside>
diff --git a/learning-markdown/example/assets/columns.lua b/learning-markdown/example/assets/columns.lua
new file mode 100644
index 0000000..1d4e3e3
--- /dev/null
+++ b/learning-markdown/example/assets/columns.lua
@@ -0,0 +1,1036 @@
+--[[-- # Columns - multiple column support in Pandoc's markdown.
+
+This Lua filter provides support for multiple columns in
+latex and html outputs. For details, see README.md.
+
+@author Julien Dutant <julien.dutant@kcl.ac.uk>
+@copyright 2021 Julien Dutant
+@license MIT - see LICENSE file for details.
+@release 1.1
+]]
+
+-- # Internal settings
+
+-- target_formats  filter is triggered when those format are targeted
+local target_formats = {
+  "html.*",
+  "latex",
+}
+
+-- # Helper functions
+
+--- type: pandoc-friendly type function
+-- panbdoc.utils.type is only defined in Pandoc >= 2.17
+-- if it isn't, we extend Lua's type function to give the same values
+-- as pandoc.utils.type on Meta objects: Inlines, Inline, Blocks, Block,
+-- string and booleans
+-- Caution: not to be used on non-Meta Pandoc elements, the
+-- results will differ (only 'Block', 'Blocks', 'Inline', 'Inlines' in
+-- >=2.17, the .t string in <2.17).
+local utils = require('pandoc.utils')
+local type = utils.type or function (obj)
+        local tag = type(obj) == 'table' and obj.t and obj.t:gsub('^Meta', '')
+        return tag and tag ~= 'Map' and tag or type(obj)
+    end
+
+--- Test whether the target format is in a given list.
+-- @param formats list of formats to be matched
+-- @return true if match, false otherwise
+local function format_matches(formats)
+  for _,format in pairs(formats) do
+    if FORMAT:match(format) then
+      return true
+    end
+  end
+  return false
+end
+
+
+--- Add a block to the document's header-includes meta-data field.
+-- @param meta the document's metadata block
+-- @param block Pandoc block element (e.g. RawBlock or Para) to be added to header-includes
+-- @return meta the modified metadata block
+local function add_header_includes(meta, block)
+
+    local header_includes = pandoc.List:new()
+
+    -- use meta['header-includes']
+
+    if meta['header-includes'] then
+      if type(meta['header-includes']) ==  'List' then
+        header_includes:extend(meta['header-includes'])
+      else
+        header_includes:insert(meta['header-includes'])
+      end
+    end
+
+    -- insert `block` in header-includes
+
+    header_includes:insert(pandoc.MetaBlocks({block}))
+
+    -- save header-includes in the document's meta
+
+    meta['header-includes'] = header_includes
+
+    return meta
+end
+
+--- Add a class to an element.
+-- @param element Pandoc AST element
+-- @param class name of the class to be added (string)
+-- @return the modified element, or the unmodified element if the element has no classes
+local function add_class(element, class)
+
+  -- act only if the element has classes
+  if element.attr and element.attr.classes then
+
+    -- if the class is absent, add it
+    if not element.attr.classes:includes(class) then
+      element.attr.classes:insert(class)
+    end
+
+  end
+
+  return element
+end
+
+--- Removes a class from an element.
+-- @param element Pandoc AST element
+-- @param class name of the class to be removed (string)
+-- @return the modified element, or the unmodified element if the element has no classes
+local function remove_class(element, class)
+
+  -- act only if the element has classes
+  if element.attr and element.attr.classes then
+
+    -- if the class is present, remove it
+    if element.attr.classes:includes(class) then
+      element.attr.classes = element.attr.classes:filter(
+        function(x)
+          return not (x == class)
+        end
+        )
+    end
+
+  end
+
+  return element
+end
+
+--- Set the value of an element's attribute.
+-- @param element Pandoc AST element to be modified
+-- @param key name of the attribute to be set (string)
+-- @param value value to be set. If nil, the attribute is removed.
+-- @return the modified element, or the element if it's not an element with attributes.
+local function set_attribute(element,key,value)
+
+  -- act only if the element has attributes
+  if element.attr and element.attr.attributes then
+
+    -- if `value` is `nil`, remove the attribute
+    if value == nil then
+      if element.attr.attributes[key] then
+       element.attr.attributes[key] = nil
+     end
+
+    -- otherwise set its value
+    else
+      element.attr.attributes[key] = value
+    end
+
+  end
+
+  return element
+end
+
+--- Add html style markup to an element's attributes.
+-- @param element the Pandoc AST element to be modified
+-- @param style the style markup to add (string in CSS)
+-- @return the modified element, or the unmodified element if it's an element without attributes
+local function add_to_html_style(element, style)
+
+  -- act only if the element has attributes
+  if element.attr and element.attr.attributes then
+
+    -- if the element has style markup, append
+    if element.attr.attributes['style'] then
+
+      element.attr.attributes['style'] =
+        element.attr.attributes['style'] .. '; ' .. style .. ' ;'
+
+    -- otherwise create
+    else
+
+      element.attr.attributes['style'] = style .. ' ;'
+
+    end
+
+  end
+
+  return element
+
+end
+
+--- Translate an English number name into a number.
+-- Converts cardinals ("one") and numerals ("first").
+-- Returns nil if the name isn't understood.
+-- @param name an English number name (string)
+-- @return number or nil
+local function number_by_name(name)
+
+  local names = {
+    one = 1,
+    two = 2,
+    three = 3,
+    four = 4,
+    five = 5,
+    six = 6,
+    seven = 7,
+    eight = 8,
+    nine = 9,
+    ten = 10,
+    first = 1,
+    second = 2,
+    third = 3,
+    fourth = 4,
+    fifth = 5,
+    sixth = 6,
+    seventh = 7,
+    eighth = 8,
+    ninth = 9,
+    tenth = 10,
+  }
+
+  result = nil
+
+  if name and names[name] then
+      return names[name]
+  end
+
+end
+
+--- Convert some CSS values (lengths, colous) to LaTeX equivalents.
+-- Example usage: `css_values_to_latex("1px solid black")` returns
+-- `{ length = "1pt", color = "black", colour = "black"}`.
+-- @param css_str a CSS string specifying a value
+-- @return table with keys `length`, `color` (alias `colour`) if found
+local function css_values_to_latex(css_str)
+
+  -- color conversion table
+  --  keys are CSS values, values are LaTeX equivalents
+
+  latex_colors = {
+    -- xcolor always available
+    black = 'black',
+    blue = 'blue',
+    brown = 'brown',
+    cyan = 'cyan',
+    darkgray = 'darkgray',
+    gray = 'gray',
+    green = 'green',
+    lightgray = 'lightgray',
+    lime = 'lime',
+    magenta = 'magenta',
+    olive = 'olive',
+    orange = 'orange',
+    pink = 'pink',
+    purple = 'purple',
+    red = 'red',
+    teal = 'teal',
+    violet = 'violet',
+    white = 'white',
+    yellow = 'yellow',
+    -- css1 colors
+    silver = 'lightgray',
+    fuschia = 'magenta',
+    aqua = 'cyan',
+  }
+
+  local result = {}
+
+  -- look for color values
+  --  by color name
+  --  rgb, etc.: to be added
+
+  local color = ''
+
+  -- space in front simplifies pattern matching
+  css_str = ' ' .. css_str
+
+  -- look for colour names
+  for text in string.gmatch(css_str, '[%s](%a+)') do
+
+    -- if we have LaTeX equivalent of `text`, store it
+    if latex_colors[text] then
+      result['color'] = latex_colors[text]
+    end
+
+  end
+
+  -- provide British spelling
+
+  if result['color'] then
+    result['colour'] = result['color']
+  end
+
+  -- look for lengths
+
+  --  0 : converted to 0em
+  if string.find(css_str, '%s0%s') then
+   result['length'] = '0em'
+  end
+
+  --  px : converted to pt
+  for text in string.gmatch(css_str, '(%s%d+)px') do
+   result['length'] = text .. 'pt'
+  end
+
+  -- lengths units to be kept as is
+  --  nb, % must be escaped
+  --  nb, if several found, the latest type is preserved
+  keep_units = { '%%', 'pt', 'mm', 'cm', 'in', 'ex', 'em' }
+
+  for _,unit in pairs(keep_units) do
+
+    -- .11em format
+    for text in string.gmatch(css_str, '%s%.%d+'.. unit) do
+      result['length'] = text
+    end
+
+    -- 2em and 1.2em format
+    for text in string.gmatch(css_str, '%s%d+%.?%d*'.. unit) do
+      result['length'] = text
+    end
+
+  end
+
+  return result
+
+end
+
+--- Ensures that a string specifies a LaTeX length
+-- @param text text to be checked
+-- @return text if it is a LaTeX length, `nil` otherwise
+local function ensures_latex_length(text)
+
+  -- LaTeX lengths units
+  --  nb, % must be escaped in lua patterns
+  units = { '%%', 'pt', 'mm', 'cm', 'in', 'ex', 'em' }
+
+  local result = nil
+
+  -- ignore spaces, controls and punctuation other than
+  -- dot, plus, minus
+  text = string.gsub(text, "[%s%c,;%(%)%[%]%*%?%%%^%$]+", "")
+
+  for _,unit in pairs(units) do
+
+    -- match .11em format and 1.2em format
+    if string.match(text, '^%.%d+'.. unit .. '$') or
+      string.match(text, '^%d+%.?%d*'.. unit .. '$') then
+
+      result = text
+
+    end
+
+  end
+
+  return result
+end
+
+
+-- # Filter-specific functions
+
+--- Process the metadata block.
+-- Adds any needed material to the document's metadata block.
+-- @param meta the document's metadata element
+local function process_meta(meta)
+
+  -- in LaTeX, require the `multicols` package
+  if FORMAT:match('latex') then
+
+    return add_header_includes(meta,
+      pandoc.RawBlock('latex', '\\usepackage{multicol}\n'))
+
+  end
+
+  -- in html, ensure that the first element of `columns` div
+  -- has a top margin of zero (otherwise we get white space
+  -- on the top of the first column)
+  -- idem for the first element after a `column-span` element
+  if FORMAT:match('html.*') then
+
+    html_header = [[
+<style>
+/* Styles added by the columns.lua pandoc filter */
+  .columns :first-child {margin-top: 0;}
+  .column-span + * {margin-top: 0;}
+</style>
+]]
+
+    return add_header_includes(meta, pandoc.RawBlock('html', html_header))
+
+  end
+
+  return meta
+
+end
+
+--- Convert explicit columnbreaks.
+-- This function converts any explict columnbreak markup in an element
+-- into a single syntax: a Div with class `columnbreak`.
+-- Note: if there are `column` Divs in the element we keep them
+-- in case they harbour further formatting (e.g. html classes). However
+-- we remove their `column` class to avoid double-processing when
+-- column fields are nested.
+-- @param elem Pandoc native Div element
+-- @return elem modified as needed
+local function convert_explicit_columbreaks(elem)
+
+  -- if `elem` ends with a `column` Div, this last Div should
+  -- not generate a columnbreak. We tag it to make sure we don't convert it.
+
+  if elem.content[#elem.content] and elem.content[#elem.content].classes
+    and elem.content[#elem.content].classes:includes('column') then
+
+    elem.content[#elem.content] =
+      add_class(elem.content[#elem.content], 'column-div-in-last-position')
+
+  end
+
+  -- processes `column` Divs and `\columnbreak` LaTeX RawBlocks
+  filter = {
+
+    Div = function (el)
+
+      -- syntactic sugar: `column-break` converted to `columnbreak`
+      if el.classes:includes("column-break") then
+
+        el = add_class(el,"columnbreak")
+        el = remove_class(el,"column-break")
+
+      end
+
+      if el.classes:includes("column") then
+
+        -- with `column` Div, add a break if it's not in last position
+        if not el.classes:includes('column-div-in-last-position') then
+
+          local breaking_div = pandoc.Div({})
+          breaking_div = add_class(breaking_div, "columnbreak")
+
+          el.content:insert(breaking_div)
+
+        -- if it's in the last position, remove the custom tag
+        else
+
+          el = remove_class(el, 'column-div-in-last-position')
+
+        end
+
+        -- remove `column` classes, but leave the div and other
+        -- attributes the user might have added
+        el = remove_class(el, 'column')
+
+      end
+
+      return el
+    end,
+
+    RawBlock = function (el)
+      if el.format == "tex" and el.text == '\\columnbreak' then
+
+        local breaking_div = pandoc.Div({})
+        breaking_div = add_class(breaking_div, "columnbreak")
+
+        return breaking_div
+
+      else
+
+        return el
+
+      end
+
+    end
+
+  }
+
+  return pandoc.walk_block(elem, filter)
+
+end
+
+--- Tag an element with the number of explicit columnbreaks it contains.
+-- Counts the number of epxlicit columnbreaks contained in an element and
+-- tags the element with a `number_explicit_columnbreaks` attribute.
+-- In the process columnbreaks are tagged with the class `columnbreak_already_counted`
+-- in order to avoid double-counting when multi-columns are nested.
+-- @param elem Pandoc element (native Div element of class `columns`)
+-- @return elem with the attribute `number_explicit_columnbreaks` set.
+local function tag_with_number_of_explicit_columnbreaks(elem)
+
+  local number_columnbreaks = 0
+
+  local filter = {
+
+    Div = function(el)
+
+      if el.classes:includes('columnbreak') and
+        not el.classes:includes('columnbreak_already_counted')  then
+
+          number_columnbreaks = number_columnbreaks + 1
+          el = add_class(el, 'columnbreak_already_counted')
+
+      end
+
+      return el
+
+    end
+  }
+
+  elem = pandoc.walk_block(elem, filter)
+
+  elem = set_attribute(elem, 'number_explicit_columnbreaks',
+      number_columnbreaks)
+
+  return elem
+
+end
+
+--- Consolidate aliases for column attributes.
+-- Provides syntacic sugar: unifies various ways of
+-- specifying attributes of a multi-column environment.
+-- When several specifications conflit, favours `column-gap` and
+-- `column-rule` specifications.
+-- @param elem Pandoc element (Div of class `columns`) with column attributes.
+-- @return elem modified as needed.
+local function consolidate_colattrib_aliases(elem)
+
+  if elem.attr and elem.attr.attributes then
+
+    -- `column-gap` if the preferred syntax is set, erase others
+    if elem.attr.attributes["column-gap"] then
+
+      elem = set_attribute(elem, "columngap", nil)
+      elem = set_attribute(elem, "column-sep", nil)
+      elem = set_attribute(elem, "columnsep", nil)
+
+    -- otherwise fetch and unset any alias
+    else
+
+      if elem.attr.attributes["columnsep"] then
+
+        elem = set_attribute(elem, "column-gap",
+            elem.attr.attributes["columnsep"])
+        elem = set_attribute(elem, "columnsep", nil)
+
+      end
+
+      if elem.attr.attributes["column-sep"] then
+
+        elem = set_attribute(elem, "column-gap",
+            elem.attr.attributes["column-sep"])
+        elem = set_attribute(elem, "column-sep", nil)
+
+      end
+
+      if elem.attr.attributes["columngap"] then
+
+        elem = set_attribute(elem, "column-gap",
+            elem.attr.attributes["columngap"])
+        elem = set_attribute(elem, "columngap", nil)
+
+      end
+
+    end
+
+    -- `column-rule` if the preferred syntax is set, erase others
+    if elem.attr.attributes["column-rule"] then
+
+      elem = set_attribute(elem, "columnrule", nil)
+
+    -- otherwise fetch and unset any alias
+    else
+
+      if elem.attr.attributes["columnrule"] then
+
+        elem = set_attribute(elem, "column-rule",
+            elem.attr.attributes["columnrule"])
+        elem = set_attribute(elem, "columnrule", nil)
+
+      end
+
+    end
+
+  end
+
+  return elem
+
+end
+
+--- Pre-process a Div of class `columns`.
+-- Converts explicit column breaks into a unified syntax
+-- and count the Div's number of columns.
+-- When several columns are nested Pandoc will apply
+-- this filter to the innermost `columns` Div first;
+-- we use that feature to prevent double-counting.
+-- @param elem Pandoc element to be processes (Div of class `columns`)
+-- @return elem modified as needed
+local function preprocess_columns(elem)
+
+  -- convert any explicit column syntax in a single format:
+  -- native Divs with class `columnbreak`
+
+  elem = convert_explicit_columbreaks(elem)
+
+  -- count explicit columnbreaks
+
+  elem = tag_with_number_of_explicit_columnbreaks(elem)
+
+  return elem
+end
+
+--- Determine the number of column in a `columns` Div.
+-- Looks up two attributes in the Div: the user-specified
+-- `columns-count` and the filter-generated `number_explicit_columnbreaks`
+-- which is based on the number of explicit breaks specified.
+-- The final number of columns will be 2 or whichever of `column-count` and
+-- `number_explicit_columnbreaks` is the highest. This ensures there are
+-- enough columns for all explicit columnbreaks.
+-- This provides a single-column when the user specifies `column-count = 1` and
+-- there are no explicit columnbreaks.
+-- @param elem Pandoc element (Div of class `columns`) whose number of columns is to be determined.
+-- @return number of columns (number, default 2).
+local function determine_column_count(elem)
+
+    -- is there a specified column count?
+  local specified_column_count = 0
+  if elem.attr.attributes and elem.attr.attributes['column-count'] then
+      specified_column_count = tonumber(
+        elem.attr.attributes["column-count"])
+  end
+
+  -- is there an count of explicit columnbreaks?
+  local number_explicit_columnbreaks = 0
+  if elem.attr.attributes and elem.attr.attributes['number_explicit_columnbreaks'] then
+
+      number_explicit_columnbreaks = tonumber(
+        elem.attr.attributes['number_explicit_columnbreaks']
+        )
+
+      set_attribute(elem, 'number_explicit_columnbreaks', nil)
+
+  end
+
+  -- determines the number of columns
+  -- default 2
+  -- recall that number of columns = nb columnbreaks + 1
+
+  local number_columns = 2
+
+  if specified_column_count > 0 or number_explicit_columnbreaks > 0 then
+
+      if (number_explicit_columnbreaks + 1) > specified_column_count then
+        number_columns = number_explicit_columnbreaks + 1
+      else
+        number_columns = specified_column_count
+      end
+
+  end
+
+  return number_columns
+
+end
+
+--- Convert a pandoc Header to a list of inlines for latex output.
+-- @param header Pandoc Header element
+-- @return list of Inline elements
+local function header_to_latex_and_inlines(header)
+
+-- @todo check if level interpretation has been shifted, e.g. section is level 2
+-- @todo we could check the Pandoc state to check whether hypertargets are required?
+
+  local latex_header = {
+    'section',
+    'subsection',
+    'subsubsection',
+    'paragraph',
+    'subparagraph',
+  }
+
+  -- create a list if the header's inlines
+  local inlines = pandoc.List:new(header.content)
+
+  -- wrap in a latex_header if available
+
+  if header.level and latex_header[header.level] then
+
+    inlines:insert(1, pandoc.RawInline('latex',
+        '\\' .. latex_header[header.level] .. '{'))
+    inlines:insert(pandoc.RawInline('latex', '}'))
+
+  end
+
+  -- wrap in a link if available
+  if header.identifier then
+
+    inlines:insert(1, pandoc.RawInline('latex',
+        '\\hypertarget{' .. header.identifier .. '}{%\n'))
+    inlines:insert(pandoc.RawInline('latex',
+        '\\label{' .. header.identifier .. '}}'))
+
+  end
+
+  return inlines
+
+end
+
+--- Format column span in LaTeX.
+-- Formats a bit of text spanning across all columns for LaTeX output.
+-- If the colspan is only one block, it is turned into an option
+-- of a new `multicol` environment. Otherwise insert it is
+-- inserted between the two `multicol` environments.
+-- @param elem Pandoc element that is supposed to span across all
+--    columns.
+-- @param number_columns number of columns in the present environment.
+-- @return a pandoc RawBlock element in LaTeX format
+local function format_colspan_latex(elem, number_columns)
+
+    local result = pandoc.List:new()
+
+    -- does the content consists of a single header?
+
+    if #elem.content == 1 and elem.content[1].t == 'Header' then
+
+      -- create a list of inlines
+      inlines = pandoc.List:new()
+      inlines:insert(pandoc.RawInline('latex',
+        "\\end{multicols}\n"))
+      inlines:insert(pandoc.RawInline('latex',
+        "\\begin{multicols}{".. number_columns .."}["))
+      inlines:extend(header_to_latex_and_inlines(elem.content[1]))
+      inlines:insert(pandoc.RawInline('latex',"]\n"))
+
+      -- insert as a Plain block
+      result:insert(pandoc.Plain(inlines))
+
+      return result
+
+    else
+
+      result:insert(pandoc.RawBlock('latex',
+        "\\end{multicols}\n"))
+      result:extend(elem.content)
+      result:insert(pandoc.RawBlock('latex',
+        "\\begin{multicols}{".. number_columns .."}"))
+      return result
+
+    end
+
+end
+
+--- Format columns for LaTeX output
+-- @param elem Pandoc element (Div of "columns" class) containing the
+--    columns to be formatted.
+-- @return elem with suitable RawBlocks in LaTeX added
+local function format_columns_latex(elem)
+
+  -- make content into a List object
+  pandoc.List:new(elem.content)
+
+  -- how many columns?
+  number_columns = determine_column_count(elem)
+
+  -- set properties and insert LaTeX environment
+  --  we wrap the entire environment in `{...}` to
+  --  ensure properties (gap, rule) don't carry
+  --  over to following columns
+
+  local latex_begin = '{'
+  local latex_end = '}'
+
+  if elem.attr.attributes then
+
+    if elem.attr.attributes["column-gap"] then
+
+      local latex_value = ensures_latex_length(
+        elem.attr.attributes["column-gap"])
+
+      if latex_value then
+
+        latex_begin = latex_begin ..
+          "\\setlength{\\columnsep}{" .. latex_value .. "}\n"
+
+      end
+
+      -- remove the `column-gap` attribute
+      elem = set_attribute(elem, "column-gap", nil)
+
+    end
+
+    if elem.attr.attributes["column-rule"] then
+
+      -- converts CSS value string to LaTeX values
+      local latex_values = css_values_to_latex(
+        elem.attr.attributes["column-rule"])
+
+      if latex_values["length"] then
+
+        latex_begin = latex_begin ..
+          "\\setlength{\\columnseprule}{" ..
+          latex_values["length"] .. "}\n"
+
+      end
+
+      if latex_values["color"] then
+
+        latex_begin = latex_begin ..
+          "\\renewcommand{\\columnseprulecolor}{\\color{" ..
+          latex_values["color"] .. "}}\n"
+
+      end
+
+
+      -- remove the `column-rule` attribute
+      elem = set_attribute(elem, "column-rule", nil)
+
+    end
+
+  end
+
+  latex_begin = latex_begin ..
+    "\\begin{multicols}{" .. number_columns .. "}\n"
+  latex_end = "\\end{multicols}\n" .. latex_end
+
+  elem.content:insert(1, pandoc.RawBlock('latex', latex_begin))
+  elem.content:insert(pandoc.RawBlock('latex', latex_end))
+
+  -- process blocks contained in `elem`
+  --  turn any explicit columnbreaks into LaTeX markup
+  --  turn `column-span` Divs into LaTeX markup
+
+  filter = {
+
+    Div = function(el)
+
+      if el.classes:includes("columnbreak") then
+        return pandoc.RawBlock('latex', "\\columnbreak\n")
+      end
+
+      if el.classes:includes("column-span-to-be-processed") then
+        return format_colspan_latex(el, number_columns)
+      end
+
+    end
+
+  }
+
+  elem = pandoc.walk_block(elem, filter)
+
+  return elem
+
+end
+
+
+--- Formats columns for html output.
+-- Uses CSS3 style added to the elements themselves.
+-- @param elem Pandoc element (Div of `columns` style)
+-- @return elem with suitable html attributes
+local function format_columns_html(elem)
+
+  -- how many columns?
+  number_columns = determine_column_count(elem)
+
+  -- add properties to the `columns` Div
+
+  elem = add_to_html_style(elem, 'column-count: ' .. number_columns)
+  elem = set_attribute(elem, 'column-count', nil)
+
+  if elem.attr.attributes then
+
+    if elem.attr.attributes["column-gap"] then
+
+      elem = add_to_html_style(elem, 'column-gap: ' ..
+        elem.attr.attributes["column-gap"])
+
+      -- remove the `column-gap` attribute
+      elem = set_attribute(elem, "column-gap")
+
+    end
+
+    if elem.attr.attributes["column-rule"] then
+
+      elem = add_to_html_style(elem, 'column-rule: ' ..
+        elem.attr.attributes["column-rule"])
+
+      -- remove the `column-rule` attribute
+      elem = set_attribute(elem, "column-rule", nil)
+
+    end
+
+  end
+
+  -- convert any explicit columnbreaks in CSS markup
+
+  filter = {
+
+    Div = function(el)
+
+      -- format column-breaks
+      if el.classes:includes("columnbreak") then
+
+        el = add_to_html_style(el, 'break-after: column')
+
+        -- remove columbreaks class to avoid double processing
+        -- when nested
+        -- clean up already-counted tag
+        el = remove_class(el, "columnbreak")
+        el = remove_class(el, "columnbreak_already_counted")
+
+      -- format column-spans
+      elseif el.classes:includes("column-span-to-be-processed") then
+
+        el = add_to_html_style(el, 'column-span: all')
+
+        -- remove column-span-to-be-processed class to avoid double processing
+        -- add column-span class to allow for styling
+        el = add_class(el, "column-span")
+        el = remove_class(el, "column-span-to-be-processed")
+
+      end
+
+      return el
+
+    end
+
+  }
+
+  elem = pandoc.walk_block(elem, filter)
+
+  return elem
+
+end
+
+
+-- # Main filters
+
+--- Formating filter.
+-- Applied last, converts prepared columns in target output formats
+-- @field Div looks for `columns` class
+format_filter = {
+
+  Div = function (element)
+
+    -- pick up `columns` Divs for formatting
+    if element.classes:includes ("columns") then
+
+      if FORMAT:match('latex') then
+        element = format_columns_latex(element)
+      elseif FORMAT:match('html.*') then
+        element = format_columns_html(element)
+      end
+
+      return element
+
+    end
+
+  end
+}
+
+--- Preprocessing filter.
+-- Processes meta-data fields and walks the document to pre-process
+-- columns blocks. Determine how many columns they contain, tags the
+-- last column Div, etc. Avoids double-counting when columns environments
+-- are nested.
+-- @field Div looks for `columns` class
+-- @field Meta processes the metadata block
+preprocess_filter = {
+
+  Div = function (element)
+
+      -- send `columns` Divs to pre-processing
+      if element.classes:includes("columns") then
+        return preprocess_columns(element)
+      end
+
+    end,
+
+  Meta = function (meta)
+
+    return process_meta(meta)
+
+  end
+}
+
+--- Syntactic sugar filter.
+-- Provides alternative ways of specifying columns properties.
+-- Kept separate from the pre-processing filter for clarity.
+-- @field Div looks for Div of classes `columns` (and related) and `column-span`
+syntactic_sugar_filter = {
+
+  Div = function(element)
+
+      -- convert "two-columns" into `columns` Divs
+      for _,class in pairs(element.classes) do
+
+        -- match xxxcolumns, xxx_columns, xxx-columns
+        -- if xxx is the name of a number, make
+        -- a `columns` div and set its `column-count` attribute
+        local number = number_by_name(
+          string.match(class,'(%a+)[_%-]?columns$')
+          )
+
+        if number then
+
+          element = set_attribute(element,
+              "column-count", tostring(number))
+          element = remove_class(element, class)
+          element = add_class(element, "columns")
+
+        end
+
+      end
+
+      -- allows different ways of specifying `columns` attributes
+      if element.classes:includes('columns') then
+
+        element = consolidate_colattrib_aliases(element)
+
+      end
+
+      -- `column-span` syntax
+      -- mark up as "to-be-processed" to avoid
+      --  double processing when nested
+      if element.classes:includes('column-span') or
+        element.classes:includes('columnspan') then
+
+        element = add_class(element, 'column-span-to-be-processed')
+        element = remove_class(element, 'column-span')
+        element = remove_class(element, 'columnspan')
+
+      end
+
+    return element
+
+  end
+
+}
+
+-- Main statement returns filters only if the
+-- target format matches our list. The filters
+-- returned are applied in the following order:
+-- 1. `syntatic_sugar_filter` deals with multiple syntax
+-- 2. `preprocessing_filter` converts all explicit
+--    columnbreaks into a common syntax and tags
+--    those that are already counted. We must do
+--    that for all `columns` environments before
+--    turning any break back into LaTeX `\columnbreak` blocks
+--    otherwise we mess up the count in nested `columns` Divs.
+-- 3. `format_filter` formats the columns after the counting
+--    has been done
+if format_matches(target_formats) then
+  return {syntactic_sugar_filter,
+    preprocess_filter,
+    format_filter}
+else
+  return
+end
diff --git a/learning-markdown/example/report.md b/learning-markdown/example/report.md
index dddb6f8..866e18d 100644
--- a/learning-markdown/example/report.md
+++ b/learning-markdown/example/report.md
@@ -32,7 +32,7 @@ Petrol		| Br		| 456.10
 
 Sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit.
 
- ![Fig. 1 - A sample figure](http://www.butleranalytics.com/wp-content/uploads/2014/07/optimizationw.jpg){width=60%}
+![Fig. 1 - A sample figure](assets/kitten.jpg){width=60%}
 
 
 ## 4. Equations
@@ -61,4 +61,4 @@ $$
 \end{cases}
 $$
 
-## References
\ No newline at end of file
+## References
diff --git a/learning-markdown/example/tex_templates/after-header-includes.latex b/learning-markdown/example/tex_templates/after-header-includes.latex
new file mode 100644
index 0000000..2c59e87
--- /dev/null
+++ b/learning-markdown/example/tex_templates/after-header-includes.latex
@@ -0,0 +1,10 @@
+\usepackage{bookmark}
+\IfFileExists{xurl.sty}{\usepackage{xurl}}{} % add URL line breaks if available
+\urlstyle{$if(urlstyle)$$urlstyle$$else$same$endif$}
+$if(links-as-notes)$
+% Make links footnotes instead of hotlinks:
+\DeclareRobustCommand{\href}[2]{#2\footnote{\url{#1}}}
+$endif$
+$if(verbatim-in-note)$
+\VerbatimFootnotes % allow verbatim text in footnotes
+$endif$
diff --git a/learning-markdown/example/tex_templates/common.latex b/learning-markdown/example/tex_templates/common.latex
new file mode 100644
index 0000000..6206974
--- /dev/null
+++ b/learning-markdown/example/tex_templates/common.latex
@@ -0,0 +1,289 @@
+$if(linestretch)$
+\usepackage{setspace}
+$else$
+% Use setspace anyway because we change the default line spacing.
+% The spacing is changed early to affect the titlepage and the TOC.
+\usepackage{setspace}
+\setstretch{1.2}
+$endif$
+$--
+$-- paragraph formatting
+$--
+$if(indent)$
+$else$
+\makeatletter
+\@ifundefined{KOMAClassName}{% if non-KOMA class
+  \IfFileExists{parskip.sty}{%
+    \usepackage{parskip}
+  }{% else
+    \setlength{\parindent}{0pt}
+    \setlength{\parskip}{6pt plus 2pt minus 1pt}}
+}{% if KOMA class
+  \KOMAoptions{parskip=half}}
+\makeatother
+$endif$
+$if(beamer)$
+$else$
+$if(block-headings)$
+% Make \paragraph and \subparagraph free-standing
+\makeatletter
+\ifx\paragraph\undefined\else
+  \let\oldparagraph\paragraph
+  \renewcommand{\paragraph}{
+    \@ifstar
+      \xxxParagraphStar
+      \xxxParagraphNoStar
+  }
+  \newcommand{\xxxParagraphStar}[1]{\oldparagraph*{#1}\mbox{}}
+  \newcommand{\xxxParagraphNoStar}[1]{\oldparagraph{#1}\mbox{}}
+\fi
+\ifx\subparagraph\undefined\else
+  \let\oldsubparagraph\subparagraph
+  \renewcommand{\subparagraph}{
+    \@ifstar
+      \xxxSubParagraphStar
+      \xxxSubParagraphNoStar
+  }
+  \newcommand{\xxxSubParagraphStar}[1]{\oldsubparagraph*{#1}\mbox{}}
+  \newcommand{\xxxSubParagraphNoStar}[1]{\oldsubparagraph{#1}\mbox{}}
+\fi
+\makeatother
+$endif$
+$endif$
+$--
+$-- verbatim in notes
+$--
+$if(verbatim-in-note)$
+\usepackage{fancyvrb}
+$endif$
+$-- highlighting
+$if(listings)$
+\usepackage{listings}
+\newcommand{\passthrough}[1]{#1}
+\lstset{defaultdialect=[5.3]Lua}
+\lstset{defaultdialect=[x86masm]Assembler}
+$endif$
+$if(listings-no-page-break)$
+\usepackage{etoolbox}
+\BeforeBeginEnvironment{lstlisting}{\par\noindent\begin{minipage}{\linewidth}}
+\AfterEndEnvironment{lstlisting}{\end{minipage}\par\addvspace{\topskip}}
+$endif$
+$if(lhs)$
+\lstnewenvironment{code}{\lstset{language=Haskell,basicstyle=\small\ttfamily}}{}
+$endif$
+$if(highlighting-macros)$
+$highlighting-macros$
+
+% Workaround/bugfix from jannick0.
+% See https://github.com/jgm/pandoc/issues/4302#issuecomment-360669013)
+% or https://github.com/Wandmalfarbe/pandoc-latex-template/issues/2
+%
+% Redefine the verbatim environment 'Highlighting' to break long lines (with
+% the help of fvextra). Redefinition is necessary because it is unlikely that
+% pandoc includes fvextra in the default template.
+\usepackage{fvextra}
+\DefineVerbatimEnvironment{Highlighting}{Verbatim}{breaklines,fontsize=$if(code-block-font-size)$$code-block-font-size$$else$\small$endif$,commandchars=\\\{\}}
+
+$endif$
+$--
+$-- tables
+$--
+$if(tables)$
+\usepackage{longtable,booktabs,array}
+$if(multirow)$
+\usepackage{multirow}
+$endif$
+\usepackage{calc} % for calculating minipage widths
+$if(beamer)$
+\usepackage{caption}
+% Make caption package work with longtable
+\makeatletter
+\def\fnum@table{\tablename~\thetable}
+\makeatother
+$else$
+% Correct order of tables after \paragraph or \subparagraph
+\usepackage{etoolbox}
+\makeatletter
+\patchcmd\longtable{\par}{\if@noskipsec\mbox{}\fi\par}{}{}
+\makeatother
+% Allow footnotes in longtable head/foot
+\IfFileExists{footnotehyper.sty}{\usepackage{footnotehyper}}{\usepackage{footnote}}
+\makesavenoteenv{longtable}
+$endif$
+$endif$
+$--
+$-- graphics
+$--
+$if(graphics)$
+\usepackage{graphicx}
+\makeatletter
+\newsavebox\pandoc@box
+\newcommand*\pandocbounded[1]{% scales image to fit in text height/width
+  \sbox\pandoc@box{#1}%
+  \Gscale@div\@tempa{\textheight}{\dimexpr\ht\pandoc@box+\dp\pandoc@box\relax}%
+  \Gscale@div\@tempb{\linewidth}{\wd\pandoc@box}%
+  \ifdim\@tempb\p@<\@tempa\p@\let\@tempa\@tempb\fi% select the smaller of both
+  \ifdim\@tempa\p@<\p@\scalebox{\@tempa}{\usebox\pandoc@box}%
+  \else\usebox{\pandoc@box}%
+  \fi%
+}
+% Set default figure placement to htbp
+% Make use of float-package and set default placement for figures to H.
+% The option H means 'PUT IT HERE' (as  opposed to the standard h option which means 'You may put it here if you like').
+\usepackage{float}
+\floatplacement{figure}{$if(float-placement-figure)$$float-placement-figure$$else$H$endif$}
+\makeatother
+$endif$
+$if(svg)$
+\usepackage{svg}
+$endif$
+$--
+$-- strikeout/underline
+$--
+$if(strikeout)$
+\ifLuaTeX
+  \usepackage{luacolor}
+  \usepackage[soul]{lua-ul}
+\else
+  \usepackage{soul}
+$if(beamer)$
+  \makeatletter
+  \let\HL\hl
+  \renewcommand\hl{% fix for beamer highlighting
+    \let\set@color\beamerorig@set@color
+    \let\reset@color\beamerorig@reset@color
+    \HL}
+  \makeatother
+$endif$
+$if(CJKmainfont)$
+  \ifXeTeX
+    % soul's \st doesn't work for CJK:
+    \usepackage{xeCJKfntef}
+    \renewcommand{\st}[1]{\sout{#1}}
+  \fi
+$endif$
+\fi
+$endif$
+$--
+$-- CSL citations
+$--
+$if(csl-refs)$
+% definitions for citeproc citations
+\NewDocumentCommand\citeproctext{}{}
+\NewDocumentCommand\citeproc{mm}{%
+  \begingroup\def\citeproctext{#2}\cite{#1}\endgroup}
+\makeatletter
+ % allow citations to break across lines
+ \let\@cite@ofmt\@firstofone
+ % avoid brackets around text for \cite:
+ \def\@biblabel#1{}
+ \def\@cite#1#2{{#1\if@tempswa , #2\fi}}
+\makeatother
+\newlength{\cslhangindent}
+\setlength{\cslhangindent}{1.5em}
+\newlength{\csllabelwidth}
+\setlength{\csllabelwidth}{3em}
+\newenvironment{CSLReferences}[2] % #1 hanging-indent, #2 entry-spacing
+ {\begin{list}{}{%
+  \setlength{\itemindent}{0pt}
+  \setlength{\leftmargin}{0pt}
+  \setlength{\parsep}{0pt}
+  % turn on hanging indent if param 1 is 1
+  \ifodd #1
+   \setlength{\leftmargin}{\cslhangindent}
+   \setlength{\itemindent}{-1\cslhangindent}
+  \fi
+  % set entry spacing
+  \setlength{\itemsep}{#2\baselineskip}}}
+ {\end{list}}
+\usepackage{calc}
+\newcommand{\CSLBlock}[1]{\hfill\break\parbox[t]{\linewidth}{\strut\ignorespaces#1\strut}}
+\newcommand{\CSLLeftMargin}[1]{\parbox[t]{\csllabelwidth}{\strut#1\strut}}
+\newcommand{\CSLRightInline}[1]{\parbox[t]{\linewidth - \csllabelwidth}{\strut#1\strut}}
+\newcommand{\CSLIndent}[1]{\hspace{\cslhangindent}#1}
+$endif$
+$--
+$-- Babel language support
+$--
+$if(lang)$
+\ifLuaTeX
+\usepackage[bidi=basic]{babel}
+\else
+\usepackage[bidi=default]{babel}
+\fi
+$if(babel-lang)$
+\babelprovide[main,import]{$babel-lang$}
+$if(mainfont)$
+\ifPDFTeX
+\else
+\babelfont{rm}[$for(mainfontoptions)$$mainfontoptions$$sep$,$endfor$$if(mainfontfallback)$,RawFeature={fallback=mainfontfallback}$endif$]{$mainfont$}
+\fi
+$endif$
+$endif$
+$for(babel-otherlangs)$
+\babelprovide[import]{$babel-otherlangs$}
+$endfor$
+$for(babelfonts/pairs)$
+\babelfont[$babelfonts.key$]{rm}{$babelfonts.value$}
+$endfor$
+% get rid of language-specific shorthands (see #6817):
+\let\LanguageShortHands\languageshorthands
+\def\languageshorthands#1{}
+$if(selnolig-langs)$
+\ifLuaTeX
+  \usepackage[$for(selnolig-langs)$$it$$sep$,$endfor$]{selnolig} % disable illegal ligatures
+\fi
+$endif$
+$endif$
+$--
+$-- pagestyle
+$--
+$if(pagestyle)$
+\pagestyle{$pagestyle$}
+$endif$
+$--
+$-- prevent overfull lines
+$--
+\setlength{\emergencystretch}{3em} % prevent overfull lines
+$--
+$-- tight lists
+$--
+\providecommand{\tightlist}{%
+  \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}}
+$--
+$-- subfigure support
+$--
+$if(subfigure)$
+\usepackage{subcaption}
+$endif$
+$--
+$-- text direction support for pdftex
+$--
+$if(dir)$
+\ifPDFTeX
+  \TeXXeTstate=1
+  \newcommand{\RL}[1]{\beginR #1\endR}
+  \newcommand{\LR}[1]{\beginL #1\endL}
+  \newenvironment{RTL}{\beginR}{\endR}
+  \newenvironment{LTR}{\beginL}{\endL}
+\fi
+$endif$
+$--
+$-- bibliography support support for natbib and biblatex
+$--
+$if(natbib)$
+\usepackage[$natbiboptions$]{natbib}
+\bibliographystyle{$if(biblio-style)$$biblio-style$$else$plainnat$endif$}
+$endif$
+$if(biblatex)$
+\usepackage[$if(biblio-style)$style=$biblio-style$,$endif$$for(biblatexoptions)$$biblatexoptions$$sep$,$endfor$]{biblatex}
+$for(bibliography)$
+\addbibresource{$bibliography$}
+$endfor$
+$endif$
+$--
+$-- csquotes
+$--
+$if(csquotes)$
+\usepackage{csquotes}
+$endif$
diff --git a/learning-markdown/example/tex_templates/eisvogel-added.latex b/learning-markdown/example/tex_templates/eisvogel-added.latex
new file mode 100644
index 0000000..7b1eacc
--- /dev/null
+++ b/learning-markdown/example/tex_templates/eisvogel-added.latex
@@ -0,0 +1,303 @@
+$if(page-background)$
+\usepackage[pages=all]{background}
+$endif$
+
+%
+% for the background color of the title page
+%
+$if(titlepage)$
+\usepackage{pagecolor}
+\usepackage{afterpage}
+$if(titlepage-background)$
+\usepackage{tikz}
+$endif$
+$if(geometry)$
+$else$
+\usepackage[margin=2.5cm,includehead=true,includefoot=true,centering]{geometry}
+$endif$
+$endif$
+
+%
+% break urls
+%
+\PassOptionsToPackage{hyphens}{url}
+
+%
+% When using babel or polyglossia with biblatex, loading csquotes is recommended
+% to ensure that quoted texts are typeset according to the rules of your main language.
+%
+\usepackage{csquotes}
+
+%
+% captions
+%
+\definecolor{caption-color}{HTML}{777777}
+\usepackage[font={stretch=1.2}, textfont={color=caption-color}, position=top, skip=4mm, labelfont=bf, singlelinecheck=false, justification=$if(caption-justification)$$caption-justification$$else$raggedright$endif$]{caption}
+\setcapindent{0em}
+
+%
+% blockquote
+%
+\definecolor{blockquote-border}{RGB}{221,221,221}
+\definecolor{blockquote-text}{RGB}{119,119,119}
+\usepackage{mdframed}
+\newmdenv[rightline=false,bottomline=false,topline=false,linewidth=3pt,linecolor=blockquote-border,skipabove=\parskip]{customblockquote}
+\renewenvironment{quote}{\begin{customblockquote}\list{}{\rightmargin=0em\leftmargin=0em}%
+\item\relax\color{blockquote-text}\ignorespaces}{\unskip\unskip\endlist\end{customblockquote}}
+
+%
+% Source Sans Pro as the default font family
+% Source Code Pro for monospace text
+%
+% 'default' option sets the default
+% font family to Source Sans Pro, not \sfdefault.
+%
+\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex
+  $if(fontfamily)$
+  $else$
+  \usepackage[default]{sourcesanspro}
+  \usepackage{sourcecodepro}
+  $endif$
+\else % if not pdftex
+  $if(mainfont)$
+  $else$
+  \usepackage[default]{sourcesanspro}
+  \usepackage{sourcecodepro}
+
+  % XeLaTeX specific adjustments for straight quotes: https://tex.stackexchange.com/a/354887
+  % This issue is already fixed (see https://github.com/silkeh/latex-sourcecodepro/pull/5) but the
+  % fix is still unreleased.
+  % TODO: Remove this workaround when the new version of sourcecodepro is released on CTAN.
+  \ifxetex
+    \makeatletter
+    \defaultfontfeatures[\ttfamily]
+      { Numbers   = \sourcecodepro@figurestyle,
+        Scale     = \SourceCodePro@scale,
+        Extension = .otf }
+    \setmonofont
+      [ UprightFont    = *-\sourcecodepro@regstyle,
+        ItalicFont     = *-\sourcecodepro@regstyle It,
+        BoldFont       = *-\sourcecodepro@boldstyle,
+        BoldItalicFont = *-\sourcecodepro@boldstyle It ]
+      {SourceCodePro}
+    \makeatother
+  \fi
+  $endif$
+\fi
+
+%
+% heading color
+%
+\definecolor{heading-color}{RGB}{40,40,40}
+\addtokomafont{section}{\color{heading-color}}
+% When using the classes report, scrreprt, book,
+% scrbook or memoir, uncomment the following line.
+%\addtokomafont{chapter}{\color{heading-color}}
+
+%
+% variables for title, author and date
+%
+\usepackage{titling}
+\title{$title$}
+\author{$for(author)$$author$$sep$, $endfor$}
+\date{$date$}
+
+%
+% tables
+%
+$if(tables)$
+
+\definecolor{table-row-color}{HTML}{F5F5F5}
+\definecolor{table-rule-color}{HTML}{999999}
+
+%\arrayrulecolor{black!40}
+\arrayrulecolor{table-rule-color}     % color of \toprule, \midrule, \bottomrule
+\setlength\heavyrulewidth{0.3ex}      % thickness of \toprule, \bottomrule
+\renewcommand{\arraystretch}{1.3}     % spacing (padding)
+
+$if(table-use-row-colors)$
+% Unfortunately the colored cells extend beyond the edge of the
+% table because pandoc uses @-expressions (@{}) like so:
+%
+% \begin{longtable}[]{@{}ll@{}}
+% \end{longtable}
+%
+% https://en.wikibooks.org/wiki/LaTeX/Tables#.40-expressions
+\usepackage{etoolbox}
+\AtBeginEnvironment{longtable}{\rowcolors{2}{}{table-row-color!100}}
+\preto{\toprule}{\hiderowcolors}{}{}
+\appto{\endhead}{\showrowcolors}{}{}
+\appto{\endfirsthead}{\showrowcolors}{}{}
+$endif$
+$endif$
+
+%
+% remove paragraph indentation
+%
+\setlength{\parindent}{0pt}
+\setlength{\parskip}{6pt plus 2pt minus 1pt}
+\setlength{\emergencystretch}{3em}  % prevent overfull lines
+
+%
+%
+% Listings
+%
+%
+
+$if(listings)$
+
+%
+% general listing colors
+%
+\definecolor{listing-background}{HTML}{F7F7F7}
+\definecolor{listing-rule}{HTML}{B3B2B3}
+\definecolor{listing-numbers}{HTML}{B3B2B3}
+\definecolor{listing-text-color}{HTML}{000000}
+\definecolor{listing-keyword}{HTML}{435489}
+\definecolor{listing-keyword-2}{HTML}{1284CA} % additional keywords
+\definecolor{listing-keyword-3}{HTML}{9137CB} % additional keywords
+\definecolor{listing-identifier}{HTML}{435489}
+\definecolor{listing-string}{HTML}{00999A}
+\definecolor{listing-comment}{HTML}{8E8E8E}
+
+\lstdefinestyle{eisvogel_listing_style}{
+  language         = java,
+$if(listings-disable-line-numbers)$
+  xleftmargin      = 0.6em,
+  framexleftmargin = 0.4em,
+$else$
+  numbers          = left,
+  xleftmargin      = 2.7em,
+  framexleftmargin = 2.5em,
+$endif$
+  backgroundcolor  = \color{listing-background},
+  basicstyle       = \color{listing-text-color}\linespread{1.0}%
+                      \lst@ifdisplaystyle%
+                      $if(code-block-font-size)$$code-block-font-size$$else$\small$endif$%
+                      \fi\ttfamily{},
+  breaklines       = true,
+  frame            = single,
+  framesep         = 0.19em,
+  rulecolor        = \color{listing-rule},
+  frameround       = ffff,
+  tabsize          = 4,
+  numberstyle      = \color{listing-numbers},
+  aboveskip        = 1.0em,
+  belowskip        = 0.1em,
+  abovecaptionskip = 0em,
+  belowcaptionskip = 1.0em,
+  keywordstyle     = {\color{listing-keyword}\bfseries},
+  keywordstyle     = {[2]\color{listing-keyword-2}\bfseries},
+  keywordstyle     = {[3]\color{listing-keyword-3}\bfseries\itshape},
+  sensitive        = true,
+  identifierstyle  = \color{listing-identifier},
+  commentstyle     = \color{listing-comment},
+  stringstyle      = \color{listing-string},
+  showstringspaces = false,
+  escapeinside     = {/*@}{@*/}, % Allow LaTeX inside these special comments
+  literate         =
+  {á}{{\'a}}1 {é}{{\'e}}1 {í}{{\'i}}1 {ó}{{\'o}}1 {ú}{{\'u}}1
+  {Á}{{\'A}}1 {É}{{\'E}}1 {Í}{{\'I}}1 {Ó}{{\'O}}1 {Ú}{{\'U}}1
+  {à}{{\`a}}1 {è}{{\`e}}1 {ì}{{\`i}}1 {ò}{{\`o}}1 {ù}{{\`u}}1
+  {À}{{\`A}}1 {È}{{\`E}}1 {Ì}{{\`I}}1 {Ò}{{\`O}}1 {Ù}{{\`U}}1
+  {ä}{{\"a}}1 {ë}{{\"e}}1 {ï}{{\"i}}1 {ö}{{\"o}}1 {ü}{{\"u}}1
+  {Ä}{{\"A}}1 {Ë}{{\"E}}1 {Ï}{{\"I}}1 {Ö}{{\"O}}1 {Ü}{{\"U}}1
+  {â}{{\^a}}1 {ê}{{\^e}}1 {î}{{\^i}}1 {ô}{{\^o}}1 {û}{{\^u}}1
+  {Â}{{\^A}}1 {Ê}{{\^E}}1 {Î}{{\^I}}1 {Ô}{{\^O}}1 {Û}{{\^U}}1
+  {œ}{{\oe}}1 {Œ}{{\OE}}1 {æ}{{\ae}}1 {Æ}{{\AE}}1 {ß}{{\ss}}1
+  {ç}{{\c c}}1 {Ç}{{\c C}}1 {ø}{{\o}}1 {å}{{\r a}}1 {Å}{{\r A}}1
+  {€}{{\EUR}}1 {£}{{\pounds}}1 {«}{{\guillemotleft}}1
+  {»}{{\guillemotright}}1 {ñ}{{\~n}}1 {Ñ}{{\~N}}1 {¿}{{?`}}1
+  {…}{{\ldots}}1 {≥}{{>=}}1 {≤}{{<=}}1 {„}{{\glqq}}1 {“}{{\grqq}}1
+  {”}{{''}}1
+}
+\lstset{style=eisvogel_listing_style}
+
+%
+% Java (Java SE 12, 2019-06-22)
+%
+\lstdefinelanguage{Java}{
+  morekeywords={
+    % normal keywords (without data types)
+    abstract,assert,break,case,catch,class,continue,default,
+    do,else,enum,exports,extends,final,finally,for,if,implements,
+    import,instanceof,interface,module,native,new,package,private,
+    protected,public,requires,return,static,strictfp,super,switch,
+    synchronized,this,throw,throws,transient,try,volatile,while,
+    % var is an identifier
+    var
+  },
+  morekeywords={[2] % data types
+    % primitive data types
+    boolean,byte,char,double,float,int,long,short,
+    % String
+    String,
+    % primitive wrapper types
+    Boolean,Byte,Character,Double,Float,Integer,Long,Short
+    % number types
+    Number,AtomicInteger,AtomicLong,BigDecimal,BigInteger,DoubleAccumulator,DoubleAdder,LongAccumulator,LongAdder,Short,
+    % other
+    Object,Void,void
+  },
+  morekeywords={[3] % literals
+    % reserved words for literal values
+    null,true,false,
+  },
+  sensitive,
+  morecomment  = [l]//,
+  morecomment  = [s]{/*}{*/},
+  morecomment  = [s]{/**}{*/},
+  morestring   = [b]",
+  morestring   = [b]',
+}
+
+\lstdefinelanguage{XML}{
+  morestring      = [b]",
+  moredelim       = [s][\bfseries\color{listing-keyword}]{<}{\ },
+  moredelim       = [s][\bfseries\color{listing-keyword}]{</}{>},
+  moredelim       = [l][\bfseries\color{listing-keyword}]{/>},
+  moredelim       = [l][\bfseries\color{listing-keyword}]{>},
+  morecomment     = [s]{<?}{?>},
+  morecomment     = [s]{<!--}{-->},
+  commentstyle    = \color{listing-comment},
+  stringstyle     = \color{listing-string},
+  identifierstyle = \color{listing-identifier}
+}
+$endif$
+
+%
+% header and footer
+%
+$if(disable-header-and-footer)$
+$else$
+\usepackage[headsepline,footsepline]{scrlayer-scrpage}
+
+\newpairofpagestyles{eisvogel-header-footer}{
+  \clearpairofpagestyles
+  \ihead*{$if(header-left)$$header-left$$else$$title$$endif$}
+  \chead*{$if(header-center)$$header-center$$else$$endif$}
+  \ohead*{$if(header-right)$$header-right$$else$$date$$endif$}
+  \ifoot*{$if(footer-left)$$footer-left$$else$$for(author)$$author$$sep$, $endfor$$endif$}
+  \cfoot*{$if(footer-center)$$footer-center$$else$$endif$}
+  \ofoot*{$if(footer-right)$$footer-right$$else$\thepage$endif$}
+  \addtokomafont{pageheadfoot}{\upshape}
+}
+\pagestyle{eisvogel-header-footer}
+
+$if(book)$
+\deftripstyle{ChapterStyle}{}{}{}{}{\pagemark}{}
+\renewcommand*{\chapterpagestyle}{ChapterStyle}
+$endif$
+
+$if(page-background)$
+\backgroundsetup{
+scale=1,
+color=black,
+opacity=$if(page-background-opacity)$$page-background-opacity$$else$0.2$endif$,
+angle=0,
+contents={%
+  \includegraphics[width=\paperwidth,height=\paperheight]{$page-background$}
+  }%
+}
+$endif$
+$endif$
diff --git a/learning-markdown/example/tex_templates/eisvogel-title-page.latex b/learning-markdown/example/tex_templates/eisvogel-title-page.latex
new file mode 100644
index 0000000..6553502
--- /dev/null
+++ b/learning-markdown/example/tex_templates/eisvogel-title-page.latex
@@ -0,0 +1,67 @@
+$if(titlepage)$
+\begin{titlepage}
+$if(titlepage-background)$
+\newgeometry{top=2cm, right=4cm, bottom=3cm, left=4cm}
+$else$
+\newgeometry{left=6cm}
+$endif$
+$if(titlepage-color)$
+\definecolor{titlepage-color}{HTML}{$titlepage-color$}
+\newpagecolor{titlepage-color}\afterpage{\restorepagecolor}
+$endif$
+$if(titlepage-background)$
+\tikz[remember picture,overlay] \node[inner sep=0pt] at (current page.center){\includegraphics[width=\paperwidth,height=\paperheight]{$titlepage-background$}};
+$endif$
+\newcommand{\colorRule}[3][black]{\textcolor[HTML]{#1}{\rule{#2}{#3}}}
+\begin{flushleft}
+\noindent
+\\[-1em]
+\color[HTML]{$if(titlepage-text-color)$$titlepage-text-color$$else$5F5F5F$endif$}
+\makebox[0pt][l]{\colorRule[$if(titlepage-rule-color)$$titlepage-rule-color$$else$435488$endif$]{1.3\textwidth}{$if(titlepage-rule-height)$$titlepage-rule-height$$else$4$endif$pt}}
+\par
+\noindent
+
+$if(titlepage-background)$
+% The titlepage with a background image has other text spacing and text size
+{
+  \setstretch{2}
+  \vfill
+  \vskip -8em
+  \noindent {\huge \textbf{\textsf{$title$}}}
+  $if(subtitle)$
+  \vskip 1em
+  {\Large \textsf{$subtitle$}}
+  $endif$
+  \vskip 2em
+  \noindent {\Large \textsf{$for(author)$$author$$sep$, $endfor$} \vskip 0.6em \textsf{$date$}}
+  \vfill
+}
+$else$
+{
+  \setstretch{1.4}
+  \vfill
+  \noindent {\huge \textbf{\textsf{$title$}}}
+  $if(subtitle)$
+  \vskip 1em
+  {\Large \textsf{$subtitle$}}
+  $endif$
+  \vskip 2em
+  \noindent {\Large \textsf{$for(author)$$author$$sep$, $endfor$}}
+  \vfill
+}
+$endif$
+
+$if(titlepage-logo)$
+\noindent
+\includegraphics[width=$if(logo-width)$$logo-width$$else$35mm$endif$, left]{$titlepage-logo$}
+$endif$
+
+$if(titlepage-background)$
+$else$
+\textsf{$date$}
+$endif$
+\end{flushleft}
+\end{titlepage}
+\restoregeometry
+\pagenumbering{arabic}
+$endif$
diff --git a/learning-markdown/example/tex_templates/eisvogel.latex b/learning-markdown/example/tex_templates/eisvogel.latex
index 109cb83..a11cf8f 100644
--- a/learning-markdown/example/tex_templates/eisvogel.latex
+++ b/learning-markdown/example/tex_templates/eisvogel.latex
@@ -1,6 +1,6 @@
 %%
-% Copyright (c) 2017 - 2023, Pascal Wagler;
-% Copyright (c) 2014 - 2023, John MacFarlane
+% Copyright (c) 2017 - 2025, Pascal Wagler;
+% Copyright (c) 2014 - 2025, John MacFarlane
 %
 % All rights reserved.
 %
@@ -39,15 +39,7 @@
 % For usage information and examples visit the official GitHub page:
 % https://github.com/Wandmalfarbe/pandoc-latex-template
 %%
-
-% Options for packages loaded elsewhere
-\PassOptionsToPackage{unicode$for(hyperrefoptions)$,$hyperrefoptions$$endfor$}{hyperref}
-\PassOptionsToPackage{hyphens}{url}
-\PassOptionsToPackage{dvipsnames,svgnames,x11names,table}{xcolor}
-$if(CJKmainfont)$
-\PassOptionsToPackage{space}{xeCJK}
-$endif$
-%
+$passoptions.latex()$
 \documentclass[
 $if(fontsize)$
   $fontsize$,
@@ -57,228 +49,15 @@ $if(papersize)$
 $else$
   paper=a4,
 $endif$
-$if(beamer)$
-  ignorenonframetext,
-$if(handout)$
-  handout,
-$endif$
-$if(aspectratio)$
-  aspectratio=$aspectratio$,
-$endif$
-$endif$
 $for(classoption)$
   $classoption$$sep$,
 $endfor$
   ,captions=tableheading
-]{$if(beamer)$$documentclass$$else$$if(book)$scrbook$else$scrartcl$endif$$endif$}
-$if(beamer)$
-$if(background-image)$
-\usebackgroundtemplate{%
-  \includegraphics[width=\paperwidth]{$background-image$}%
-}
-% In beamer background-image does not work well when other images are used, so this is the workaround
-\pgfdeclareimage[width=\paperwidth,height=\paperheight]{background}{$background-image$}
-\usebackgroundtemplate{\pgfuseimage{background}}
-$endif$
-\usepackage{pgfpages}
-\setbeamertemplate{caption}[numbered]
-\setbeamertemplate{caption label separator}{: }
-\setbeamercolor{caption name}{fg=normal text.fg}
-\beamertemplatenavigationsymbols$if(navigation)$$navigation$$else$empty$endif$
-$for(beameroption)$
-\setbeameroption{$beameroption$}
-$endfor$
-% Prevent slide breaks in the middle of a paragraph
-\widowpenalties 1 10000
-\raggedbottom
-$if(section-titles)$
-\setbeamertemplate{part page}{
-  \centering
-  \begin{beamercolorbox}[sep=16pt,center]{part title}
-    \usebeamerfont{part title}\insertpart\par
-  \end{beamercolorbox}
-}
-\setbeamertemplate{section page}{
-  \centering
-  \begin{beamercolorbox}[sep=12pt,center]{part title}
-    \usebeamerfont{section title}\insertsection\par
-  \end{beamercolorbox}
-}
-\setbeamertemplate{subsection page}{
-  \centering
-  \begin{beamercolorbox}[sep=8pt,center]{part title}
-    \usebeamerfont{subsection title}\insertsubsection\par
-  \end{beamercolorbox}
-}
-\AtBeginPart{
-  \frame{\partpage}
-}
-\AtBeginSection{
-  \ifbibliography
-  \else
-    \frame{\sectionpage}
-  \fi
-}
-\AtBeginSubsection{
-  \frame{\subsectionpage}
-}
-$endif$
-$endif$
+]{$if(book)$scrbook$else$scrartcl$endif$}
 $if(beamerarticle)$
 \usepackage{beamerarticle} % needs to be loaded first
 $endif$
-\usepackage{amsmath,amssymb}
-$if(linestretch)$
-\usepackage{setspace}
-$else$
-% Use setspace anyway because we change the default line spacing.
-% The spacing is changed early to affect the titlepage and the TOC.
-\usepackage{setspace}
-\setstretch{1.2}
-$endif$
-\usepackage{iftex}
-\ifPDFTeX
-  \usepackage[$if(fontenc)$$fontenc$$else$T1$endif$]{fontenc}
-  \usepackage[utf8]{inputenc}
-  \usepackage{textcomp} % provide euro and other symbols
-\else % if luatex or xetex
-$if(mathspec)$
-  \ifXeTeX
-    \usepackage{mathspec} % this also loads fontspec
-  \else
-    \usepackage{unicode-math} % this also loads fontspec
-  \fi
-$else$
-  \usepackage{unicode-math} % this also loads fontspec
-$endif$
-  \defaultfontfeatures{Scale=MatchLowercase}$-- must come before Beamer theme
-  \defaultfontfeatures[\rmfamily]{Ligatures=TeX,Scale=1}
-\fi
-$if(fontfamily)$
-$else$
-$-- Set default font before Beamer theme so the theme can override it
-\usepackage{lmodern}
-$endif$
-$-- Set Beamer theme before user font settings so they can override theme
-$if(beamer)$
-$if(theme)$
-\usetheme[$for(themeoptions)$$themeoptions$$sep$,$endfor$]{$theme$}
-$endif$
-$if(colortheme)$
-\usecolortheme{$colortheme$}
-$endif$
-$if(fonttheme)$
-\usefonttheme{$fonttheme$}
-$endif$
-$if(mainfont)$
-\usefonttheme{serif} % use mainfont rather than sansfont for slide text
-$endif$
-$if(innertheme)$
-\useinnertheme{$innertheme$}
-$endif$
-$if(outertheme)$
-\useoutertheme{$outertheme$}
-$endif$
-$endif$
-$-- User font settings (must come after default font and Beamer theme)
-$if(fontfamily)$
-\usepackage[$for(fontfamilyoptions)$$fontfamilyoptions$$sep$,$endfor$]{$fontfamily$}
-$endif$
-\ifPDFTeX\else
-  % xetex/luatex font selection
-$if(mainfont)$
-  \setmainfont[$for(mainfontoptions)$$mainfontoptions$$sep$,$endfor$]{$mainfont$}
-$endif$
-$if(sansfont)$
-  \setsansfont[$for(sansfontoptions)$$sansfontoptions$$sep$,$endfor$]{$sansfont$}
-$endif$
-$if(monofont)$
-  \setmonofont[$for(monofontoptions)$$monofontoptions$$sep$,$endfor$]{$monofont$}
-$endif$
-$for(fontfamilies)$
-  \newfontfamily{$fontfamilies.name$}[$for(fontfamilies.options)$$fontfamilies.options$$sep$,$endfor$]{$fontfamilies.font$}
-$endfor$
-$if(mathfont)$
-$if(mathspec)$
-  \ifXeTeX
-    \setmathfont(Digits,Latin,Greek)[$for(mathfontoptions)$$mathfontoptions$$sep$,$endfor$]{$mathfont$}
-  \else
-    \setmathfont[$for(mathfontoptions)$$mathfontoptions$$sep$,$endfor$]{$mathfont$}
-  \fi
-$else$
-  \setmathfont[$for(mathfontoptions)$$mathfontoptions$$sep$,$endfor$]{$mathfont$}
-$endif$
-$endif$
-$if(CJKmainfont)$
-  \ifXeTeX
-    \usepackage{xeCJK}
-    \setCJKmainfont[$for(CJKoptions)$$CJKoptions$$sep$,$endfor$]{$CJKmainfont$}
-    $if(CJKsansfont)$
-      \setCJKsansfont[$for(CJKoptions)$$CJKoptions$$sep$,$endfor$]{$CJKsansfont$}
-    $endif$
-    $if(CJKmonofont)$
-      \setCJKmonofont[$for(CJKoptions)$$CJKoptions$$sep$,$endfor$]{$CJKmonofont$}
-    $endif$
-  \fi
-$endif$
-$if(luatexjapresetoptions)$
-  \ifLuaTeX
-    \usepackage[$for(luatexjapresetoptions)$$luatexjapresetoptions$$sep$,$endfor$]{luatexja-preset}
-  \fi
-$endif$
-$if(CJKmainfont)$
-  \ifLuaTeX
-    \usepackage[$for(luatexjafontspecoptions)$$luatexjafontspecoptions$$sep$,$endfor$]{luatexja-fontspec}
-    \setmainjfont[$for(CJKoptions)$$CJKoptions$$sep$,$endfor$]{$CJKmainfont$}
-  \fi
-$endif$
-\fi
-$if(zero-width-non-joiner)$
-%% Support for zero-width non-joiner characters.
-\makeatletter
-\def\zerowidthnonjoiner{%
-  % Prevent ligatures and adjust kerning, but still support hyphenating.
-  \texorpdfstring{%
-    \TextOrMath{\nobreak\discretionary{-}{}{\kern.03em}%
-      \ifvmode\else\nobreak\hskip\z@skip\fi}{}%
-  }{}%
-}
-\makeatother
-\ifPDFTeX
-  \DeclareUnicodeCharacter{200C}{\zerowidthnonjoiner}
-\else
-  \catcode`^^^^200c=\active
-  \protected\def ^^^^200c{\zerowidthnonjoiner}
-\fi
-%% End of ZWNJ support
-$endif$
-% Use upquote if available, for straight quotes in verbatim environments
-\IfFileExists{upquote.sty}{\usepackage{upquote}}{}
-\IfFileExists{microtype.sty}{% use microtype if available
-  \usepackage[$for(microtypeoptions)$$microtypeoptions$$sep$,$endfor$]{microtype}
-  \UseMicrotypeSet[protrusion]{basicmath} % disable protrusion for tt fonts
-}{}
-$if(indent)$
-$else$
-\makeatletter
-\@ifundefined{KOMAClassName}{% if non-KOMA class
-  \IfFileExists{parskip.sty}{%
-    \usepackage{parskip}
-  }{% else
-    \setlength{\parindent}{0pt}
-    \setlength{\parskip}{6pt plus 2pt minus 1pt}}
-}{% if KOMA class
-  \KOMAoptions{parskip=half}}
-\makeatother
-$endif$
-$if(verbatim-in-note)$
-\usepackage{fancyvrb}
-$endif$
 \usepackage{xcolor}
-\definecolor{default-linkcolor}{HTML}{A50000}
-\definecolor{default-filecolor}{HTML}{A50000}
-\definecolor{default-citecolor}{HTML}{4077C0}
-\definecolor{default-urlcolor}{HTML}{4077C0}
 $if(footnotes-pretty)$
 % load footmisc in order to customize footnotes (footmisc has to be loaded before hyperref, cf. https://tex.stackexchange.com/a/169124/144087)
 \usepackage[hang,flushmargin,bottom,multiple]{footmisc}
@@ -288,718 +67,66 @@ $if(footnotes-pretty)$
 \setlength{\footskip}{0.9cm} % set space between footnote and page bottom
 $endif$
 $if(geometry)$
-$if(beamer)$
-\geometry{$for(geometry)$$geometry$$sep$,$endfor$}
-$else$
 \usepackage[$for(geometry)$$geometry$$sep$,$endfor$]{geometry}
-$endif$
-$else$
-$if(beamer)$
 $else$
 \usepackage[margin=2.5cm,includehead=true,includefoot=true,centering,$for(geometry)$$geometry$$sep$,$endfor$]{geometry}
 $endif$
-$endif$
+\usepackage{amsmath,amssymb}
+
 $if(titlepage-logo)$
 \usepackage[export]{adjustbox}
 \usepackage{graphicx}
 $endif$
-$if(beamer)$
-\newif\ifbibliography
-$endif$
-$if(listings)$
-\usepackage{listings}
-\newcommand{\passthrough}[1]{#1}
-\lstset{defaultdialect=[5.3]Lua}
-\lstset{defaultdialect=[x86masm]Assembler}
-$endif$
-$if(listings-no-page-break)$
-\usepackage{etoolbox}
-\BeforeBeginEnvironment{lstlisting}{\par\noindent\begin{minipage}{\linewidth}}
-\AfterEndEnvironment{lstlisting}{\end{minipage}\par\addvspace{\topskip}}
-$endif$
-$if(lhs)$
-\lstnewenvironment{code}{\lstset{language=Haskell,basicstyle=\small\ttfamily}}{}
-$endif$
-$if(highlighting-macros)$
-$highlighting-macros$
-
-% Workaround/bugfix from jannick0.
-% See https://github.com/jgm/pandoc/issues/4302#issuecomment-360669013)
-% or https://github.com/Wandmalfarbe/pandoc-latex-template/issues/2
-%
-% Redefine the verbatim environment 'Highlighting' to break long lines (with
-% the help of fvextra). Redefinition is necessary because it is unlikely that
-% pandoc includes fvextra in the default template.
-\usepackage{fvextra}
-\DefineVerbatimEnvironment{Highlighting}{Verbatim}{breaklines,fontsize=$if(code-block-font-size)$$code-block-font-size$$else$\small$endif$,commandchars=\\\{\}}
 
-$endif$
-$if(tables)$
-\usepackage{longtable,booktabs,array}
-$if(multirow)$
-\usepackage{multirow}
-$endif$
-\usepackage{calc} % for calculating minipage widths
-$if(beamer)$
-\usepackage{caption}
-% Make caption package work with longtable
-\makeatletter
-\def\fnum@table{\tablename~\thetable}
-\makeatother
-$else$
-% Correct order of tables after \paragraph or \subparagraph
-\usepackage{etoolbox}
-\makeatletter
-\patchcmd\longtable{\par}{\if@noskipsec\mbox{}\fi\par}{}{}
-\makeatother
-% Allow footnotes in longtable head/foot
-\IfFileExists{footnotehyper.sty}{\usepackage{footnotehyper}}{\usepackage{footnote}}
-\makesavenoteenv{longtable}
-$endif$
-$endif$
 % add backlinks to footnote references, cf. https://tex.stackexchange.com/questions/302266/make-footnote-clickable-both-ways
 $if(footnotes-disable-backlinks)$
 $else$
 \usepackage{footnotebackref}
 $endif$
-$if(graphics)$
-\usepackage{graphicx}
-\makeatletter
-\def\maxwidth{\ifdim\Gin@nat@width>\linewidth\linewidth\else\Gin@nat@width\fi}
-\def\maxheight{\ifdim\Gin@nat@height>\textheight\textheight\else\Gin@nat@height\fi}
-\makeatother
-% Scale images if necessary, so that they will not overflow the page
-% margins by default, and it is still possible to overwrite the defaults
-% using explicit options in \includegraphics[width, height, ...]{}
-\setkeys{Gin}{width=\maxwidth,height=\maxheight,keepaspectratio}
-% Set default figure placement to htbp
-\makeatletter
-% Make use of float-package and set default placement for figures to H.
-% The option H means 'PUT IT HERE' (as  opposed to the standard h option which means 'You may put it here if you like').
-\usepackage{float}
-\floatplacement{figure}{$if(float-placement-figure)$$float-placement-figure$$else$H$endif$}
-\makeatother
-$endif$
-$if(svg)$
-\usepackage{svg}
-$endif$
-$if(strikeout)$
-$-- also used for underline
-\ifLuaTeX
-  \usepackage{luacolor}
-  \usepackage[soul]{lua-ul}
-\else
-\usepackage{soul}
-$if(CJKmainfont)$
-  \ifXeTeX
-    % soul's \st doesn't work for CJK:
-    \usepackage{xeCJKfntef}
-    \renewcommand{\st}[1]{\sout{#1}}
-  \fi
-$endif$
-\fi
-$endif$
-\setlength{\emergencystretch}{3em} % prevent overfull lines
-\providecommand{\tightlist}{%
-  \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}}
+$--
+$-- section numbering
+$--
 $if(numbersections)$
 \setcounter{secnumdepth}{$if(secnumdepth)$$secnumdepth$$else$5$endif$}
 $else$
 \setcounter{secnumdepth}{-\maxdimen} % remove section numbering
 $endif$
-$if(subfigure)$
-\usepackage{subcaption}
-$endif$
-$if(beamer)$
-$else$
-$if(block-headings)$
-% Make \paragraph and \subparagraph free-standing
-\ifx\paragraph\undefined\else
-  \let\oldparagraph\paragraph
-  \renewcommand{\paragraph}[1]{\oldparagraph{#1}\mbox{}}
-\fi
-\ifx\subparagraph\undefined\else
-  \let\oldsubparagraph\subparagraph
-  \renewcommand{\subparagraph}[1]{\oldsubparagraph{#1}\mbox{}}
-\fi
-$endif$
-$endif$
-$if(pagestyle)$
-\pagestyle{$pagestyle$}
-$endif$
-$if(csl-refs)$
-% definitions for citeproc citations
-\NewDocumentCommand\citeproctext{}{}
-\NewDocumentCommand\citeproc{mm}{%
-  \begingroup\def\citeproctext{#2}\cite{#1}\endgroup}
-\makeatletter
- % allow citations to break across lines
- \let\@cite@ofmt\@firstofone
- % avoid brackets around text for \cite:
- \def\@biblabel#1{}
- \def\@cite#1#2{{#1\if@tempswa , #2\fi}}
-\makeatother
-\newlength{\cslhangindent}
-\setlength{\cslhangindent}{1.5em}
-\newlength{\csllabelwidth}
-\setlength{\csllabelwidth}{3em}
-\newenvironment{CSLReferences}[2] % #1 hanging-indent, #2 entry-spacing
-  {\begin{list}{}{%
-   \setlength{\itemindent}{0pt}
-   \setlength{\leftmargin}{0pt}
-   \setlength{\parsep}{0pt}
-   % turn on hanging indent if param 1 is 1
-   \ifodd #1
-    \setlength{\leftmargin}{\cslhangindent}
-    \setlength{\itemindent}{-1\cslhangindent}
-   \fi
-   % set entry spacing
-   \setlength{\itemsep}{#2\baselineskip}}}
-  {\end{list}}
-\usepackage{calc}
-\newcommand{\CSLBlock}[1]{\hfill\break\parbox[t]{\linewidth}{\strut\ignorespaces#1\strut}}
-\newcommand{\CSLLeftMargin}[1]{\parbox[t]{\csllabelwidth}{\strut#1\strut}}
-\newcommand{\CSLRightInline}[1]{\parbox[t]{\linewidth - \csllabelwidth}{\strut#1\strut}}
-\newcommand{\CSLIndent}[1]{\hspace{\cslhangindent}#1}
-$endif$
-$if(lang)$
-\ifLuaTeX
-\usepackage[bidi=basic]{babel}
-\else
-\usepackage[bidi=default]{babel}
-\fi
-$if(babel-lang)$
-\babelprovide[main,import]{$babel-lang$}
-$if(mainfont)$
-\ifPDFTeX
-\else
-\babelfont{rm}[$for(mainfontoptions)$$mainfontoptions$$sep$,$endfor$]{$mainfont$}
-\fi
-$endif$
-$endif$
-$for(babel-otherlangs)$
-\babelprovide[import]{$babel-otherlangs$}
-$endfor$
-$for(babelfonts/pairs)$
-\babelfont[$babelfonts.key$]{rm}{$babelfonts.value$}
-$endfor$
-% get rid of language-specific shorthands (see #6817):
-\let\LanguageShortHands\languageshorthands
-\def\languageshorthands#1{}
-$endif$
+$fonts.latex()$
+$font-settings.latex()$
+$common.latex()$
 $for(header-includes)$
 $header-includes$
 $endfor$
-\ifLuaTeX
-  \usepackage{selnolig}  % disable illegal ligatures
-\fi
-$if(dir)$
-\ifPDFTeX
-  \TeXXeTstate=1
-  \newcommand{\RL}[1]{\beginR #1\endR}
-  \newcommand{\LR}[1]{\beginL #1\endL}
-  \newenvironment{RTL}{\beginR}{\endR}
-  \newenvironment{LTR}{\beginL}{\endL}
-\fi
-$endif$
-$if(natbib)$
-\usepackage[$natbiboptions$]{natbib}
-\bibliographystyle{$if(biblio-style)$$biblio-style$$else$plainnat$endif$}
-$endif$
-$if(biblatex)$
-\usepackage[$if(biblio-style)$style=$biblio-style$,$endif$$for(biblatexoptions)$$biblatexoptions$$sep$,$endfor$]{biblatex}
-$for(bibliography)$
-\addbibresource{$bibliography$}
-$endfor$
-$endif$
-$if(nocite-ids)$
-\nocite{$for(nocite-ids)$$it$$sep$, $endfor$}
-$endif$
-$if(csquotes)$
-\usepackage{csquotes}
-$endif$
-\IfFileExists{bookmark.sty}{\usepackage{bookmark}}{\usepackage{hyperref}}
-\IfFileExists{xurl.sty}{\usepackage{xurl}}{} % add URL line breaks if available
-\urlstyle{$if(urlstyle)$$urlstyle$$else$same$endif$}
-$if(links-as-notes)$
-% Make links footnotes instead of hotlinks:
-\DeclareRobustCommand{\href}[2]{#2\footnote{\url{#1}}}
-$endif$
-$if(verbatim-in-note)$
-\VerbatimFootnotes % allow verbatim text in footnotes
-$endif$
-\hypersetup{
-$if(title-meta)$
-  pdftitle={$title-meta$},
-$endif$
-$if(author-meta)$
-  pdfauthor={$author-meta$},
-$endif$
-$if(lang)$
-  pdflang={$lang$},
-$endif$
-$if(subject)$
-  pdfsubject={$subject$},
-$endif$
-$if(keywords)$
-  pdfkeywords={$for(keywords)$$keywords$$sep$, $endfor$},
-$endif$
-$if(colorlinks)$
-  colorlinks=true,
-  linkcolor={$if(linkcolor)$$linkcolor$$else$default-linkcolor$endif$},
-  filecolor={$if(filecolor)$$filecolor$$else$default-filecolor$endif$},
-  citecolor={$if(citecolor)$$citecolor$$else$default-citecolor$endif$},
-  urlcolor={$if(urlcolor)$$urlcolor$$else$default-urlcolor$endif$},
-$else$
-  hidelinks,
-$endif$
-  breaklinks=true,
-  pdfcreator={LaTeX via pandoc with the Eisvogel template}}
+$after-header-includes.latex()$
+$hypersetup.latex()$
+
 $if(title)$
 \title{$title$$if(thanks)$\thanks{$thanks$}$endif$}
 $endif$
 $if(subtitle)$
-$if(beamer)$
-$else$
 \usepackage{etoolbox}
 \makeatletter
 \providecommand{\subtitle}[1]{% add subtitle to \maketitle
   \apptocmd{\@title}{\par {\large #1 \par}}{}{}
 }
 \makeatother
-$endif$
 \subtitle{$subtitle$}
 $endif$
 \author{$for(author)$$author$$sep$ \and $endfor$}
 \date{$date$}
-$if(beamer)$
-$if(institute)$
-\institute{$for(institute)$$institute$$sep$ \and $endfor$}
-$endif$
-$if(titlegraphic)$
-\titlegraphic{\includegraphics{$titlegraphic$}}
-$endif$
-$if(logo)$
-\logo{\includegraphics{$logo$}}
-$endif$
-$endif$
-
-
 
-%%
-%% added
-%%
-
-$if(page-background)$
-\usepackage[pages=all]{background}
-$endif$
-
-%
-% for the background color of the title page
-%
-$if(titlepage)$
-\usepackage{pagecolor}
-\usepackage{afterpage}
-$if(titlepage-background)$
-\usepackage{tikz}
-$endif$
-$if(geometry)$
-$else$
-\usepackage[margin=2.5cm,includehead=true,includefoot=true,centering]{geometry}
-$endif$
-$endif$
-
-%
-% break urls
-%
-\PassOptionsToPackage{hyphens}{url}
-
-%
-% When using babel or polyglossia with biblatex, loading csquotes is recommended
-% to ensure that quoted texts are typeset according to the rules of your main language.
-%
-\usepackage{csquotes}
-
-%
-% captions
-%
-\definecolor{caption-color}{HTML}{777777}
-$if(beamer)$
-$else$
-\usepackage[font={stretch=1.2}, textfont={color=caption-color}, position=top, skip=4mm, labelfont=bf, singlelinecheck=false, justification=$if(caption-justification)$$caption-justification$$else$raggedright$endif$]{caption}
-\setcapindent{0em}
-$endif$
-
-%
-% blockquote
-%
-\definecolor{blockquote-border}{RGB}{221,221,221}
-\definecolor{blockquote-text}{RGB}{119,119,119}
-\usepackage{mdframed}
-\newmdenv[rightline=false,bottomline=false,topline=false,linewidth=3pt,linecolor=blockquote-border,skipabove=\parskip]{customblockquote}
-\renewenvironment{quote}{\begin{customblockquote}\list{}{\rightmargin=0em\leftmargin=0em}%
-\item\relax\color{blockquote-text}\ignorespaces}{\unskip\unskip\endlist\end{customblockquote}}
-
-%
-% Source Sans Pro as the default font family
-% Source Code Pro for monospace text
-%
-% 'default' option sets the default
-% font family to Source Sans Pro, not \sfdefault.
-%
-\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex
-  $if(fontfamily)$
-  $else$
-  \usepackage[default]{sourcesanspro}
-  \usepackage{sourcecodepro}
-  $endif$
-\else % if not pdftex
-  $if(mainfont)$
-  $else$
-  \usepackage[default]{sourcesanspro}
-  \usepackage{sourcecodepro}
-
-  % XeLaTeX specific adjustments for straight quotes: https://tex.stackexchange.com/a/354887
-  % This issue is already fixed (see https://github.com/silkeh/latex-sourcecodepro/pull/5) but the
-  % fix is still unreleased.
-  % TODO: Remove this workaround when the new version of sourcecodepro is released on CTAN.
-  \ifxetex
-    \makeatletter
-    \defaultfontfeatures[\ttfamily]
-      { Numbers   = \sourcecodepro@figurestyle,
-        Scale     = \SourceCodePro@scale,
-        Extension = .otf }
-    \setmonofont
-      [ UprightFont    = *-\sourcecodepro@regstyle,
-        ItalicFont     = *-\sourcecodepro@regstyle It,
-        BoldFont       = *-\sourcecodepro@boldstyle,
-        BoldItalicFont = *-\sourcecodepro@boldstyle It ]
-      {SourceCodePro}
-    \makeatother
-  \fi
-  $endif$
-\fi
-
-%
-% heading color
-%
-\definecolor{heading-color}{RGB}{40,40,40}
-$if(beamer)$
-$else$
-\addtokomafont{section}{\color{heading-color}}
-$endif$
-% When using the classes report, scrreprt, book,
-% scrbook or memoir, uncomment the following line.
-%\addtokomafont{chapter}{\color{heading-color}}
-
-%
-% variables for title, author and date
-%
-$if(beamer)$
-$else$
-\usepackage{titling}
-\title{$title$}
-\author{$for(author)$$author$$sep$, $endfor$}
-\date{$date$}
-$endif$
-
-%
-% tables
-%
-$if(tables)$
-
-\definecolor{table-row-color}{HTML}{F5F5F5}
-\definecolor{table-rule-color}{HTML}{999999}
-
-%\arrayrulecolor{black!40}
-\arrayrulecolor{table-rule-color}     % color of \toprule, \midrule, \bottomrule
-\setlength\heavyrulewidth{0.3ex}      % thickness of \toprule, \bottomrule
-\renewcommand{\arraystretch}{1.3}     % spacing (padding)
-
-$if(table-use-row-colors)$
-% Unfortunately the colored cells extend beyond the edge of the
-% table because pandoc uses @-expressions (@{}) like so:
-%
-% \begin{longtable}[]{@{}ll@{}}
-% \end{longtable}
-%
-% https://en.wikibooks.org/wiki/LaTeX/Tables#.40-expressions
-\usepackage{etoolbox}
-\AtBeginEnvironment{longtable}{\rowcolors{2}{}{table-row-color!100}}
-\preto{\toprule}{\hiderowcolors}{}{}
-\appto{\endhead}{\showrowcolors}{}{}
-\appto{\endfirsthead}{\showrowcolors}{}{}
-$endif$
-$endif$
-
-%
-% remove paragraph indentation
-%
-\setlength{\parindent}{0pt}
-\setlength{\parskip}{6pt plus 2pt minus 1pt}
-\setlength{\emergencystretch}{3em}  % prevent overfull lines
-
-%
-%
-% Listings
-%
-%
-
-$if(listings)$
-
-%
-% general listing colors
-%
-\definecolor{listing-background}{HTML}{F7F7F7}
-\definecolor{listing-rule}{HTML}{B3B2B3}
-\definecolor{listing-numbers}{HTML}{B3B2B3}
-\definecolor{listing-text-color}{HTML}{000000}
-\definecolor{listing-keyword}{HTML}{435489}
-\definecolor{listing-keyword-2}{HTML}{1284CA} % additional keywords
-\definecolor{listing-keyword-3}{HTML}{9137CB} % additional keywords
-\definecolor{listing-identifier}{HTML}{435489}
-\definecolor{listing-string}{HTML}{00999A}
-\definecolor{listing-comment}{HTML}{8E8E8E}
-
-\lstdefinestyle{eisvogel_listing_style}{
-  language         = java,
-$if(listings-disable-line-numbers)$
-  xleftmargin      = 0.6em,
-  framexleftmargin = 0.4em,
-$else$
-  numbers          = left,
-  xleftmargin      = 2.7em,
-  framexleftmargin = 2.5em,
-$endif$
-  backgroundcolor  = \color{listing-background},
-  basicstyle       = \color{listing-text-color}\linespread{1.0}%
-                      \lst@ifdisplaystyle%
-                      $if(code-block-font-size)$$code-block-font-size$$else$\small$endif$%
-                      \fi\ttfamily{},
-  breaklines       = true,
-  frame            = single,
-  framesep         = 0.19em,
-  rulecolor        = \color{listing-rule},
-  frameround       = ffff,
-  tabsize          = 4,
-  numberstyle      = \color{listing-numbers},
-  aboveskip        = 1.0em,
-  belowskip        = 0.1em,
-  abovecaptionskip = 0em,
-  belowcaptionskip = 1.0em,
-  keywordstyle     = {\color{listing-keyword}\bfseries},
-  keywordstyle     = {[2]\color{listing-keyword-2}\bfseries},
-  keywordstyle     = {[3]\color{listing-keyword-3}\bfseries\itshape},
-  sensitive        = true,
-  identifierstyle  = \color{listing-identifier},
-  commentstyle     = \color{listing-comment},
-  stringstyle      = \color{listing-string},
-  showstringspaces = false,
-  escapeinside     = {/*@}{@*/}, % Allow LaTeX inside these special comments
-  literate         =
-  {á}{{\'a}}1 {é}{{\'e}}1 {í}{{\'i}}1 {ó}{{\'o}}1 {ú}{{\'u}}1
-  {Á}{{\'A}}1 {É}{{\'E}}1 {Í}{{\'I}}1 {Ó}{{\'O}}1 {Ú}{{\'U}}1
-  {à}{{\`a}}1 {è}{{\`e}}1 {ì}{{\`i}}1 {ò}{{\`o}}1 {ù}{{\`u}}1
-  {À}{{\`A}}1 {È}{{\`E}}1 {Ì}{{\`I}}1 {Ò}{{\`O}}1 {Ù}{{\`U}}1
-  {ä}{{\"a}}1 {ë}{{\"e}}1 {ï}{{\"i}}1 {ö}{{\"o}}1 {ü}{{\"u}}1
-  {Ä}{{\"A}}1 {Ë}{{\"E}}1 {Ï}{{\"I}}1 {Ö}{{\"O}}1 {Ü}{{\"U}}1
-  {â}{{\^a}}1 {ê}{{\^e}}1 {î}{{\^i}}1 {ô}{{\^o}}1 {û}{{\^u}}1
-  {Â}{{\^A}}1 {Ê}{{\^E}}1 {Î}{{\^I}}1 {Ô}{{\^O}}1 {Û}{{\^U}}1
-  {œ}{{\oe}}1 {Œ}{{\OE}}1 {æ}{{\ae}}1 {Æ}{{\AE}}1 {ß}{{\ss}}1
-  {ç}{{\c c}}1 {Ç}{{\c C}}1 {ø}{{\o}}1 {å}{{\r a}}1 {Å}{{\r A}}1
-  {€}{{\EUR}}1 {£}{{\pounds}}1 {«}{{\guillemotleft}}1
-  {»}{{\guillemotright}}1 {ñ}{{\~n}}1 {Ñ}{{\~N}}1 {¿}{{?`}}1
-  {…}{{\ldots}}1 {≥}{{>=}}1 {≤}{{<=}}1 {„}{{\glqq}}1 {“}{{\grqq}}1
-  {”}{{''}}1
-}
-\lstset{style=eisvogel_listing_style}
-
-%
-% Java (Java SE 12, 2019-06-22)
-%
-\lstdefinelanguage{Java}{
-  morekeywords={
-    % normal keywords (without data types)
-    abstract,assert,break,case,catch,class,continue,default,
-    do,else,enum,exports,extends,final,finally,for,if,implements,
-    import,instanceof,interface,module,native,new,package,private,
-    protected,public,requires,return,static,strictfp,super,switch,
-    synchronized,this,throw,throws,transient,try,volatile,while,
-    % var is an identifier
-    var
-  },
-  morekeywords={[2] % data types
-    % primitive data types
-    boolean,byte,char,double,float,int,long,short,
-    % String
-    String,
-    % primitive wrapper types
-    Boolean,Byte,Character,Double,Float,Integer,Long,Short
-    % number types
-    Number,AtomicInteger,AtomicLong,BigDecimal,BigInteger,DoubleAccumulator,DoubleAdder,LongAccumulator,LongAdder,Short,
-    % other
-    Object,Void,void
-  },
-  morekeywords={[3] % literals
-    % reserved words for literal values
-    null,true,false,
-  },
-  sensitive,
-  morecomment  = [l]//,
-  morecomment  = [s]{/*}{*/},
-  morecomment  = [s]{/**}{*/},
-  morestring   = [b]",
-  morestring   = [b]',
-}
-
-\lstdefinelanguage{XML}{
-  morestring      = [b]",
-  moredelim       = [s][\bfseries\color{listing-keyword}]{<}{\ },
-  moredelim       = [s][\bfseries\color{listing-keyword}]{</}{>},
-  moredelim       = [l][\bfseries\color{listing-keyword}]{/>},
-  moredelim       = [l][\bfseries\color{listing-keyword}]{>},
-  morecomment     = [s]{<?}{?>},
-  morecomment     = [s]{<!--}{-->},
-  commentstyle    = \color{listing-comment},
-  stringstyle     = \color{listing-string},
-  identifierstyle = \color{listing-identifier}
-}
-$endif$
-
-%
-% header and footer
-%
-$if(beamer)$
-$else$
-$if(disable-header-and-footer)$
-$else$
-\usepackage[headsepline,footsepline]{scrlayer-scrpage}
-
-\newpairofpagestyles{eisvogel-header-footer}{
-  \clearpairofpagestyles
-  \ihead*{$if(header-left)$$header-left$$else$$title$$endif$}
-  \chead*{$if(header-center)$$header-center$$else$$endif$}
-  \ohead*{$if(header-right)$$header-right$$else$$date$$endif$}
-  \ifoot*{$if(footer-left)$$footer-left$$else$$for(author)$$author$$sep$, $endfor$$endif$}
-  \cfoot*{$if(footer-center)$$footer-center$$else$$endif$}
-  \ofoot*{$if(footer-right)$$footer-right$$else$\thepage$endif$}
-  \addtokomafont{pageheadfoot}{\upshape}
-}
-\pagestyle{eisvogel-header-footer}
-
-$if(book)$
-\deftripstyle{ChapterStyle}{}{}{}{}{\pagemark}{}
-\renewcommand*{\chapterpagestyle}{ChapterStyle}
-$endif$
-
-$if(page-background)$
-\backgroundsetup{
-scale=1,
-color=black,
-opacity=$if(page-background-opacity)$$page-background-opacity$$else$0.2$endif$,
-angle=0,
-contents={%
-  \includegraphics[width=\paperwidth,height=\paperheight]{$page-background$}
-  }%
-}
-$endif$
-$endif$
-$endif$
-
-%%
-%% end added
-%%
+$eisvogel-added.latex()$
 
 \begin{document}
 
-%%
-%% begin titlepage
-%%
-$if(beamer)$
-$else$
-$if(titlepage)$
-\begin{titlepage}
-$if(titlepage-background)$
-\newgeometry{top=2cm, right=4cm, bottom=3cm, left=4cm}
-$else$
-\newgeometry{left=6cm}
-$endif$
-$if(titlepage-color)$
-\definecolor{titlepage-color}{HTML}{$titlepage-color$}
-\newpagecolor{titlepage-color}\afterpage{\restorepagecolor}
-$endif$
-$if(titlepage-background)$
-\tikz[remember picture,overlay] \node[inner sep=0pt] at (current page.center){\includegraphics[width=\paperwidth,height=\paperheight]{$titlepage-background$}};
-$endif$
-\newcommand{\colorRule}[3][black]{\textcolor[HTML]{#1}{\rule{#2}{#3}}}
-\begin{flushleft}
-\noindent
-\\[-1em]
-\color[HTML]{$if(titlepage-text-color)$$titlepage-text-color$$else$5F5F5F$endif$}
-\makebox[0pt][l]{\colorRule[$if(titlepage-rule-color)$$titlepage-rule-color$$else$435488$endif$]{1.3\textwidth}{$if(titlepage-rule-height)$$titlepage-rule-height$$else$4$endif$pt}}
-\par
-\noindent
-
-$if(titlepage-background)$
-% The titlepage with a background image has other text spacing and text size
-{
-  \setstretch{2}
-  \vfill
-  \vskip -8em
-  \noindent {\huge \textbf{\textsf{$title$}}}
-  $if(subtitle)$
-  \vskip 1em
-  {\Large \textsf{$subtitle$}}
-  $endif$
-  \vskip 2em
-  \noindent {\Large \textsf{$for(author)$$author$$sep$, $endfor$} \vskip 0.6em \textsf{$date$}}
-  \vfill
-}
-$else$
-{
-  \setstretch{1.4}
-  \vfill
-  \noindent {\huge \textbf{\textsf{$title$}}}
-  $if(subtitle)$
-  \vskip 1em
-  {\Large \textsf{$subtitle$}}
-  $endif$
-  \vskip 2em
-  \noindent {\Large \textsf{$for(author)$$author$$sep$, $endfor$}}
-  \vfill
-}
-$endif$
-
-$if(titlepage-logo)$
-\noindent
-\includegraphics[width=$if(logo-width)$$logo-width$$else$35mm$endif$, left]{$titlepage-logo$}
-$endif$
-
-$if(titlepage-background)$
-$else$
-\textsf{$date$}
-$endif$
-\end{flushleft}
-\end{titlepage}
-\restoregeometry
-\pagenumbering{arabic}
-$endif$
-$endif$
-
-%%
-%% end titlepage
-%%
+$eisvogel-title-page.latex()$
 
 $if(has-frontmatter)$
 \frontmatter
 $endif$
 $if(title)$
-$if(beamer)$
-\frame{\titlepage}
 % don't generate the default title
-% $else$
 % \maketitle
-$endif$
 $if(abstract)$
 \begin{abstract}
 $abstract$
@@ -1020,17 +147,6 @@ $if(toc)$
 $if(toc-title)$
 \renewcommand*\contentsname{$toc-title$}
 $endif$
-$if(beamer)$
-\begin{frame}[allowframebreaks]
-$if(toc-title)$
-  \frametitle{$toc-title$}
-$endif$
-  \tableofcontents[hideallsubsections]
-\end{frame}
-$if(toc-own-page)$
-\newpage
-$endif$
-$else$
 {
 $if(colorlinks)$
 \hypersetup{linkcolor=$if(toccolor)$$toccolor$$else$$endif$}
@@ -1042,7 +158,6 @@ $if(toc-own-page)$
 $endif$
 }
 $endif$
-$endif$
 $if(lof)$
 \listoffigures
 $endif$
@@ -1060,6 +175,9 @@ $body$
 $if(has-frontmatter)$
 \backmatter
 $endif$
+$if(nocite-ids)$
+\nocite{$for(nocite-ids)$$it$$sep$, $endfor$}
+$endif$
 $if(natbib)$
 $if(bibliography)$
 $if(biblio-title)$
@@ -1069,26 +187,12 @@ $else$
 \renewcommand\refname{$biblio-title$}
 $endif$
 $endif$
-$if(beamer)$
-\begin{frame}[allowframebreaks]{$biblio-title$}
-  \bibliographytrue
-$endif$
-  \bibliography{$for(bibliography)$$bibliography$$sep$,$endfor$}
-$if(beamer)$
-\end{frame}
-$endif$
+\bibliography{$for(bibliography)$$bibliography$$sep$,$endfor$}
 
 $endif$
 $endif$
 $if(biblatex)$
-$if(beamer)$
-\begin{frame}[allowframebreaks]{$biblio-title$}
-  \bibliographytrue
-  \printbibliography[heading=none]
-\end{frame}
-$else$
 \printbibliography$if(biblio-title)$[title=$biblio-title$]$endif$
-$endif$
 
 $endif$
 $for(include-after)$
diff --git a/learning-markdown/example/tex_templates/font-settings.latex b/learning-markdown/example/tex_templates/font-settings.latex
new file mode 100644
index 0000000..f9362b0
--- /dev/null
+++ b/learning-markdown/example/tex_templates/font-settings.latex
@@ -0,0 +1,103 @@
+$-- User font settings (must come after default font and Beamer theme)
+$if(fontfamily)$
+\usepackage[$for(fontfamilyoptions)$$fontfamilyoptions$$sep$,$endfor$]{$fontfamily$}
+$endif$
+\ifPDFTeX\else
+  % xetex/luatex font selection
+$if(mainfont)$
+  $if(mainfontfallback)$
+    \ifLuaTeX
+      \usepackage{luaotfload}
+      \directlua{luaotfload.add_fallback("mainfontfallback",{
+        $for(mainfontfallback)$"$mainfontfallback$"$sep$,$endfor$
+      })}
+    \fi
+  $endif$
+  \setmainfont[$for(mainfontoptions)$$mainfontoptions$$sep$,$endfor$$if(mainfontfallback)$,RawFeature={fallback=mainfontfallback}$endif$]{$mainfont$}
+$endif$
+$if(sansfont)$
+  $if(sansfontfallback)$
+    \ifLuaTeX
+      \usepackage{luaotfload}
+      \directlua{luaotfload.add_fallback("sansfontfallback",{
+        $for(sansfontfallback)$"$sansfontfallback$"$sep$,$endfor$
+      })}
+    \fi
+  $endif$
+  \setsansfont[$for(sansfontoptions)$$sansfontoptions$$sep$,$endfor$$if(sansfontfallback)$,RawFeature={fallback=sansfontfallback}$endif$]{$sansfont$}
+$endif$
+$if(monofont)$
+  $if(monofontfallback)$
+    \ifLuaTeX
+      \usepackage{luaotfload}
+      \directlua{luaotfload.add_fallback("monofontfallback",{
+        $for(monofontfallback)$"$monofontfallback$"$sep$,$endfor$
+      })}
+    \fi
+  $endif$
+  \setmonofont[$for(monofontoptions)$$monofontoptions$$sep$,$endfor$$if(monofontfallback)$,RawFeature={fallback=monofontfallback}$endif$]{$monofont$}
+$endif$
+$for(fontfamilies)$
+  \newfontfamily{$fontfamilies.name$}[$for(fontfamilies.options)$$fontfamilies.options$$sep$,$endfor$]{$fontfamilies.font$}
+$endfor$
+$if(mathfont)$
+$if(mathspec)$
+  \ifXeTeX
+    \setmathfont(Digits,Latin,Greek)[$for(mathfontoptions)$$mathfontoptions$$sep$,$endfor$]{$mathfont$}
+  \else
+    \setmathfont[$for(mathfontoptions)$$mathfontoptions$$sep$,$endfor$]{$mathfont$}
+  \fi
+$else$
+  \setmathfont[$for(mathfontoptions)$$mathfontoptions$$sep$,$endfor$]{$mathfont$}
+$endif$
+$endif$
+$if(CJKmainfont)$
+  \ifXeTeX
+    \usepackage{xeCJK}
+    \setCJKmainfont[$for(CJKoptions)$$CJKoptions$$sep$,$endfor$]{$CJKmainfont$}
+    $if(CJKsansfont)$
+      \setCJKsansfont[$for(CJKoptions)$$CJKoptions$$sep$,$endfor$]{$CJKsansfont$}
+    $endif$
+    $if(CJKmonofont)$
+      \setCJKmonofont[$for(CJKoptions)$$CJKoptions$$sep$,$endfor$]{$CJKmonofont$}
+    $endif$
+  \fi
+$endif$
+$if(luatexjapresetoptions)$
+  \ifLuaTeX
+    \usepackage[$for(luatexjapresetoptions)$$luatexjapresetoptions$$sep$,$endfor$]{luatexja-preset}
+  \fi
+$endif$
+$if(CJKmainfont)$
+  \ifLuaTeX
+    \usepackage[$for(luatexjafontspecoptions)$$luatexjafontspecoptions$$sep$,$endfor$]{luatexja-fontspec}
+    \setmainjfont[$for(CJKoptions)$$CJKoptions$$sep$,$endfor$]{$CJKmainfont$}
+  \fi
+$endif$
+\fi
+$if(zero-width-non-joiner)$
+%% Support for zero-width non-joiner characters.
+\makeatletter
+\def\zerowidthnonjoiner{%
+  % Prevent ligatures and adjust kerning, but still support hyphenating.
+  \texorpdfstring{%
+    \TextOrMath{\nobreak\discretionary{-}{}{\kern.03em}%
+      \ifvmode\else\nobreak\hskip\z@skip\fi}{}%
+  }{}%
+}
+\makeatother
+\ifPDFTeX
+  \DeclareUnicodeCharacter{200C}{\zerowidthnonjoiner}
+\else
+  \catcode`^^^^200c=\active
+  \protected\def ^^^^200c{\zerowidthnonjoiner}
+\fi
+%% End of ZWNJ support
+$endif$
+% Use upquote if available, for straight quotes in verbatim environments
+\IfFileExists{upquote.sty}{\usepackage{upquote}}{}
+\IfFileExists{microtype.sty}{% use microtype if available
+  \usepackage[$for(microtypeoptions)$$microtypeoptions$$sep$,$endfor$]{microtype}
+  \UseMicrotypeSet[protrusion]{basicmath} % disable protrusion for tt fonts
+}{}
+
diff --git a/learning-markdown/example/tex_templates/fonts.latex b/learning-markdown/example/tex_templates/fonts.latex
new file mode 100644
index 0000000..53a8e3c
--- /dev/null
+++ b/learning-markdown/example/tex_templates/fonts.latex
@@ -0,0 +1,23 @@
+\usepackage{iftex}
+\ifPDFTeX
+  \usepackage[$if(fontenc)$$fontenc$$else$T1$endif$]{fontenc}
+  \usepackage[utf8]{inputenc}
+  \usepackage{textcomp} % provide euro and other symbols
+\else % if luatex or xetex
+$if(mathspec)$
+  \ifXeTeX
+    \usepackage{mathspec} % this also loads fontspec
+  \else
+    \usepackage{unicode-math} % this also loads fontspec
+  \fi
+$else$
+  \usepackage{unicode-math} % this also loads fontspec
+$endif$
+  \defaultfontfeatures{Scale=MatchLowercase}$-- must come before Beamer theme
+  \defaultfontfeatures[\rmfamily]{Ligatures=TeX,Scale=1}
+\fi
+$if(fontfamily)$
+$else$
+$-- Set default font before Beamer theme so the theme can override it
+\usepackage{lmodern}
+$endif$
diff --git a/learning-markdown/example/tex_templates/hypersetup.latex b/learning-markdown/example/tex_templates/hypersetup.latex
new file mode 100644
index 0000000..e3e9f66
--- /dev/null
+++ b/learning-markdown/example/tex_templates/hypersetup.latex
@@ -0,0 +1,35 @@
+\definecolor{default-linkcolor}{HTML}{A50000}
+\definecolor{default-filecolor}{HTML}{A50000}
+\definecolor{default-citecolor}{HTML}{4077C0}
+\definecolor{default-urlcolor}{HTML}{4077C0}
+
+\hypersetup{
+$if(title-meta)$
+  pdftitle={$title-meta$},
+$endif$
+$if(author-meta)$
+  pdfauthor={$author-meta$},
+$endif$
+$if(lang)$
+  pdflang={$lang$},
+$endif$
+$if(subject)$
+  pdfsubject={$subject$},
+$endif$
+$if(keywords)$
+  pdfkeywords={$for(keywords)$$keywords$$sep$, $endfor$},
+$endif$
+$if(colorlinks)$
+  colorlinks=true,
+  linkcolor={$if(linkcolor)$$linkcolor$$else$default-linkcolor$endif$},
+  filecolor={$if(filecolor)$$filecolor$$else$default-filecolor$endif$},
+  citecolor={$if(citecolor)$$citecolor$$else$default-citecolor$endif$},
+  urlcolor={$if(urlcolor)$$urlcolor$$else$default-urlcolor$endif$},
+$else$
+$if(boxlinks)$
+$else$
+  hidelinks,
+$endif$
+$endif$
+  breaklinks=true,
+  pdfcreator={LaTeX via pandoc with the Eisvogel template}}
diff --git a/learning-markdown/example/tex_templates/passoptions.latex b/learning-markdown/example/tex_templates/passoptions.latex
new file mode 100644
index 0000000..84a44ba
--- /dev/null
+++ b/learning-markdown/example/tex_templates/passoptions.latex
@@ -0,0 +1,7 @@
+% Options for packages loaded elsewhere
+\PassOptionsToPackage{unicode$for(hyperrefoptions)$,$hyperrefoptions$$endfor$}{hyperref}
+\PassOptionsToPackage{hyphens}{url}
+\PassOptionsToPackage{dvipsnames,svgnames,x11names,table}{xcolor}
+$if(CJKmainfont)$
+\PassOptionsToPackage{space}{xeCJK}
+$endif$
-- 
GitLab