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  **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) - {#fig1} +~~~md +{#fig1} Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. +~~~ {#fig1} @@ -199,14 +204,14 @@ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor i See [Fig. 2](#figattrs). - {#figattrs width=40%} +~~~md +{#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)). {#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. - {width=60%} +{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