From 58042b5135ddf74bf5945c46eafd3828739e045c Mon Sep 17 00:00:00 2001
From: Jonas Smedegaard <dr@jones.dk>
Date: Mon, 24 Feb 2025 15:00:10 +0100
Subject: initial draft

---
 _extensions/ruc-play/stylish-report/README.md      |  28 ++
 _extensions/ruc-play/stylish-report/TODO.md        |   2 +
 .../ruc-play/stylish-report/_extension.yaml        |  70 ++++
 _extensions/ruc-play/stylish-report/doc-class.tex  |  74 ++++
 .../ruc-play/stylish-report/revealjs-british.scss  |  10 +
 _extensions/ruc-play/stylish-report/revealjs.scss  |   4 +
 .../ruc-play/stylish-report/styles/british.scss    |  10 +
 .../ruc-play/stylish-report/styles/common.scss     |   4 +
 _extensions/ruc-play/stylish-report/template.tex   | 455 ++++++++++++++++++++
 _extensions/ruc-play/stylish-report/title.tex      |  98 +++++
 _extensions/ruc-play/stylish-report/toc.tex        |  28 ++
 _extensions/ruc-play/stylish-report/x/template.tex | 466 +++++++++++++++++++++
 _extensions/ruc-play/stylish-roles/_extension.yaml |   6 +
 .../ruc-play/stylish-roles/stylish-roles.lua       |  54 +++
 14 files changed, 1309 insertions(+)
 create mode 100644 _extensions/ruc-play/stylish-report/README.md
 create mode 100644 _extensions/ruc-play/stylish-report/TODO.md
 create mode 100644 _extensions/ruc-play/stylish-report/_extension.yaml
 create mode 100644 _extensions/ruc-play/stylish-report/doc-class.tex
 create mode 100644 _extensions/ruc-play/stylish-report/revealjs-british.scss
 create mode 100644 _extensions/ruc-play/stylish-report/revealjs.scss
 create mode 100644 _extensions/ruc-play/stylish-report/styles/british.scss
 create mode 100644 _extensions/ruc-play/stylish-report/styles/common.scss
 create mode 100644 _extensions/ruc-play/stylish-report/template.tex
 create mode 100644 _extensions/ruc-play/stylish-report/title.tex
 create mode 100644 _extensions/ruc-play/stylish-report/toc.tex
 create mode 100644 _extensions/ruc-play/stylish-report/x/template.tex
 create mode 100644 _extensions/ruc-play/stylish-roles/_extension.yaml
 create mode 100644 _extensions/ruc-play/stylish-roles/stylish-roles.lua

(limited to '_extensions/ruc-play')

diff --git a/_extensions/ruc-play/stylish-report/README.md b/_extensions/ruc-play/stylish-report/README.md
new file mode 100644
index 0000000..d9ee44d
--- /dev/null
+++ b/_extensions/ruc-play/stylish-report/README.md
@@ -0,0 +1,28 @@
+# Template customizations
+
+This directory contains Pandoc template files
+derived from Quarto version 1.6.40.
+
+## Tagged PDF/A
+
+The PDF workflow is tweaked to embed semantically structured metadata,
+a.k.a. [tagged PDF] files,
+which conforms to the [PDF/A-2b] standard,
+using experimental LaTeX hint
+[`\DocumentMetadata` declaration][DocumentMetadata].
+
+PDF/A comes in multiple flavors.
+[Some guidelines] advice to use the 2b flavor,
+so that is what is currently done.
+
+[tagged PDF]: https://taggedpdf.com/
+  "tagged PDF - PDF containing semantically structured metadata"
+
+[PDF/A-2b]: https://pdfa.org/pdfa-faq/
+  "PDF/A - PDF standards for archiving and long-term preservation"
+
+[DocumentMetadata]: https://ctan.org/pkg/latex-lab
+  "DocumentMetadata - LaTeX hint for generating modern tagged PDF"
+
+[Some guidelines] https://www.aalto.fi/en/services/creating-a-pdfa-compliant-file-of-your-thesis
+  "Aalto guide to creating a PDF/A -compliant file of your thesis"
diff --git a/_extensions/ruc-play/stylish-report/TODO.md b/_extensions/ruc-play/stylish-report/TODO.md
new file mode 100644
index 0000000..6e2de22
--- /dev/null
+++ b/_extensions/ruc-play/stylish-report/TODO.md
@@ -0,0 +1,2 @@
+  * Move `revealjs.scss` below `styles/`
+    when Quarto can resolve font paths for RevealJS from subdir
diff --git a/_extensions/ruc-play/stylish-report/_extension.yaml b/_extensions/ruc-play/stylish-report/_extension.yaml
new file mode 100644
index 0000000..507eeaa
--- /dev/null
+++ b/_extensions/ruc-play/stylish-report/_extension.yaml
@@ -0,0 +1,70 @@
+name: Stylish-report
+author: Jonas Smedegaard
+version: 0.0.3
+contributes:
+ formats:
+  common:
+  pdf:
+    number-sections: true
+    toc: true
+    default-image-extension: tex
+    colorlinks: true
+    hyperrefoptions:
+    - linktoc=all
+    pdf-engine: lualatex
+    documentclass: scrbook
+    classoption:
+    - DIV=calc
+    - twoside=false
+    csquotes: true
+    papersize: a4
+    fontsize: 12pt
+    template: template.tex
+    template-partials:
+      - doc-class.tex
+      - title.tex
+      - toc.tex
+
+    include-in-header:
+# declare license
+    - text: |
+        \usepackage{hyperref}
+        \usepackage[type={CC}, modifier={by-sa}, version={4.0}]{doclicense}
+        \publishers{\vspace*{\fill}\small\par\doclicenseThis}
+# recalculate page margins, since mainfont was set after documentclass
+    - text: |
+        \KOMAoptions{DIV=last}
+# avoid widow or orphan lines
+    - text: |
+        \usepackage[defaultlines=4,all]{nowidow}
+# implement \abstract
+    - text: |
+        \newenvironment{abstract}
+          {\cleardoublepage\chapter*{Abstract}\thispagestyle{empty}}
+          {\cleardoublepage}
+# use page numbers A1, A2, A3, B1, B2 etc. for appendices
+    - text: |
+        \let\oldchapter\chapter
+        \newcommand*{\appendixmore}{%
+          \setcounter{secnumdepth}{\chapternumdepth}
+          \setcounter{chapter}{0}%
+          \setcounter{section}{0}%
+          \renewcommand{\thechapter}{\Alph{chapter}}%
+          \renewcommand{\theHchapter}{\thechapter}%
+          \renewcommand{\thesection}{\thechapter\arabic{section}}%
+          \renewcommand{\thepage}{\thechapter\arabic{page}}%
+          \renewcommand{\chapter}[1]{%
+            \oldchapter{##1}%
+            \setcounter{page}{1}%
+          }%
+        }
+
+  html:
+    html-q-tags: true
+    theme:
+      light: [flatly, styles/british.scss]
+      dark: [darkly, styles/british.scss]
+
+  revealjs:
+    html-q-tags: true
+    theme: [default, revealjs-british.ccss]
diff --git a/_extensions/ruc-play/stylish-report/doc-class.tex b/_extensions/ruc-play/stylish-report/doc-class.tex
new file mode 100644
index 0000000..8eff486
--- /dev/null
+++ b/_extensions/ruc-play/stylish-report/doc-class.tex
@@ -0,0 +1,74 @@
+\DocumentMetadata{
+% modern PDF rendering: <https://tex.stackexchange.com/a/686905/309738>
+$if(lang)$
+  lang={$lang$},
+$endif$
+$if(pdfversion)$
+  pdfversion=$pdfversion$,
+$endif$
+$for(pdfstandard)$
+  pdfstandard=$pdfstandard$,
+$endfor$
+$if(pdftestphase)$
+testphase=
+  {
+$for(pdftestphase)$
+    $pdftestphase$,
+$endfor$
+  },
+$endif$
+$if(pdfdebug)$
+debug=
+  {
+$for(pdfdebug)$
+    $pdfdebug$,
+$endfor$
+  },
+$endif$
+$if(pdfdebugfirstaidoff)$
+debug=
+  {
+firstaidoff=
+    {
+$for(pdfdebugfirstaidoff)$
+      $pdfdebugfirstaidoff$,
+$endfor$
+    },
+  },
+$endif$
+}
+$if(copyright)$
+% flag as rights protected <https://tex.stackexchange.com/a/712443/309738>
+\ExplSyntaxOn
+\pdfmeta_xmp_add:n{<xmpRights:Marked>True</xmpRights:Marked>}
+\ExplSyntaxOff
+$endif$
+$if(pdftestphasestrict)$
+% fatalize tagging warnings
+\ExplSyntaxOn
+ \msg_redirect_module:nnn { tag } { warning } { error }
+\ExplSyntaxOff
+$endif$
+\documentclass[
+$if(fontsize)$
+  $fontsize$,
+$endif$
+$if(papersize)$
+  $papersize$paper,
+$endif$
+$if(beamer)$
+  ignorenonframetext,
+$if(handout)$
+  handout,
+$endif$
+$if(aspectratio)$
+  aspectratio=$aspectratio$,
+$endif$
+$if(babel-lang)$
+  $babel-lang$,
+$endif$
+$endif$
+$for(classoption)$
+  $classoption$$sep$,
+$endfor$
+]{$documentclass$}
diff --git a/_extensions/ruc-play/stylish-report/revealjs-british.scss b/_extensions/ruc-play/stylish-report/revealjs-british.scss
new file mode 100644
index 0000000..4d41fb3
--- /dev/null
+++ b/_extensions/ruc-play/stylish-report/revealjs-british.scss
@@ -0,0 +1,10 @@
+/*-- scss:mixins --*/
+
+scss @import 'revealjs';
+
+/*-- scss:rules --*/
+
+// use british style quotation
+q {
+	quotes: "‘" "’" "“" "”";
+}
diff --git a/_extensions/ruc-play/stylish-report/revealjs.scss b/_extensions/ruc-play/stylish-report/revealjs.scss
new file mode 100644
index 0000000..2c7c1c8
--- /dev/null
+++ b/_extensions/ruc-play/stylish-report/revealjs.scss
@@ -0,0 +1,4 @@
+/*-- scss:defaults --*/
+
+// avoid web-loading internally declared default Bootswatch font
+$web-font-path: "";
diff --git a/_extensions/ruc-play/stylish-report/styles/british.scss b/_extensions/ruc-play/stylish-report/styles/british.scss
new file mode 100644
index 0000000..613dd3f
--- /dev/null
+++ b/_extensions/ruc-play/stylish-report/styles/british.scss
@@ -0,0 +1,10 @@
+/*-- scss:mixins --*/
+
+scss @import 'common';
+
+/*-- scss:rules --*/
+
+// use british style quotation
+q {
+	quotes: "‘" "’" "“" "”";
+}
diff --git a/_extensions/ruc-play/stylish-report/styles/common.scss b/_extensions/ruc-play/stylish-report/styles/common.scss
new file mode 100644
index 0000000..2c7c1c8
--- /dev/null
+++ b/_extensions/ruc-play/stylish-report/styles/common.scss
@@ -0,0 +1,4 @@
+/*-- scss:defaults --*/
+
+// avoid web-loading internally declared default Bootswatch font
+$web-font-path: "";
diff --git a/_extensions/ruc-play/stylish-report/template.tex b/_extensions/ruc-play/stylish-report/template.tex
new file mode 100644
index 0000000..26d8fe6
--- /dev/null
+++ b/_extensions/ruc-play/stylish-report/template.tex
@@ -0,0 +1,455 @@
+% Options for packages loaded elsewhere
+\PassOptionsToPackage{unicode$for(hyperrefoptions)$,$hyperrefoptions$$endfor$}{hyperref}
+\PassOptionsToPackage{hyphens}{url}
+$if(colorlinks)$
+\PassOptionsToPackage{dvipsnames,svgnames,x11names}{xcolor}
+$endif$
+$if(CJKmainfont)$
+\PassOptionsToPackage{space}{xeCJK}
+$endif$
+%
+$doc-class.tex()$
+
+$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]{section title}
+    \usebeamerfont{section title}\insertsection\par
+  \end{beamercolorbox}
+}
+\setbeamertemplate{subsection page}{
+  \centering
+  \begin{beamercolorbox}[sep=8pt,center]{subsection title}
+    \usebeamerfont{subsection title}\insertsubsection\par
+  \end{beamercolorbox}
+}
+\AtBeginPart{
+  \frame{\partpage}
+}
+\AtBeginSection{
+  \ifbibliography
+  \else
+    \frame{\sectionpage}
+  \fi
+}
+\AtBeginSubsection{
+  \frame{\subsectionpage}
+}
+$endif$
+$endif$
+$if(beamerarticle)$
+\usepackage{beamerarticle} % needs to be loaded first
+$endif$
+
+\usepackage{amsmath,amssymb}
+$if(linestretch)$
+\usepackage{setspace}
+$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}
+$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)$
+  $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
+}{}
+$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}
+$if(geometry)$
+$if(beamer)$
+\geometry{$for(geometry)$$geometry$$sep$,$endfor$}
+$else$
+\usepackage[$for(geometry)$$geometry$$sep$,$endfor$]{geometry}
+$endif$
+$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(lhs)$
+\lstnewenvironment{code}{\lstset{language=Haskell,basicstyle=\small\ttfamily}}{}
+$endif$
+$if(svg)$
+\usepackage{svg}
+$endif$
+$if(strikeout)$
+$-- also used for underline
+\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$
+\setlength{\emergencystretch}{3em} % prevent overfull lines
+$if(numbersections)$
+\setcounter{secnumdepth}{$if(secnumdepth)$$secnumdepth$$else$5$endif$}
+$else$
+\setcounter{secnumdepth}{-\maxdimen} % remove section numbering
+$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$
+$if(pagestyle)$
+\pagestyle{$pagestyle$}
+$endif$
+$pandoc.tex()$
+
+$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$
+$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(biblio-config)$
+$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$
+$endif$
+$if(nocite-ids)$
+\nocite{$for(nocite-ids)$$it$$sep$, $endfor$}
+$endif$
+$if(csquotes)$
+\usepackage{csquotes}
+$endif$
+\usepackage{bookmark}
+
+\IfFileExists{xurl.sty}{\usepackage{xurl}}{} % add URL line breaks if available
+\urlstyle{same} % disable monospaced font for URLs
+$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={$for(by-author)$$if(it.metadata.credit.supervision)$$else$$it.name.literal$$endif$$sep$,$endfor$},
+$endif$
+$if(lang)$
+  pdflang={$lang$},
+$endif$
+$if(subject)$
+  pdfsubject={$subject$},
+$endif$
+$if(keywords)$
+  pdfkeywords={$for(keywords)$$keywords$$sep$, $endfor$},
+$endif$
+$if(colorlinks)$
+  colorlinks=true,
+  $if(linkcolor)$linkcolor={$linkcolor$}$endif$,
+  $if(filecolor)$filecolor={$filecolor$}$endif$,
+  $if(citecolor)$citecolor={$citecolor$}$endif$,
+  $if(urlcolor)$urlcolor={$urlcolor$}$endif$,
+$else$
+$if(boxlinks)$
+$else$
+  hidelinks,
+$endif$
+$endif$
+  pdfcreator={LaTeX via pandoc}}
+
+$before-title.tex()$
+
+$title.tex()$
+
+\begin{document}
+$before-body.tex()$
+
+$for(include-before)$
+$include-before$
+
+$endfor$
+$toc.tex()$
+
+$if(linestretch)$
+\setstretch{$linestretch$}
+$endif$
+$if(has-frontmatter)$
+\mainmatter
+$endif$
+$body$
+
+$before-bib.tex()$
+
+$if(has-frontmatter)$
+\backmatter
+$endif$
+$biblio.tex()$
+
+$for(include-after)$
+$include-after$
+
+$endfor$
+$after-body.tex()$
+
+\end{document}
diff --git a/_extensions/ruc-play/stylish-report/title.tex b/_extensions/ruc-play/stylish-report/title.tex
new file mode 100644
index 0000000..8fda033
--- /dev/null
+++ b/_extensions/ruc-play/stylish-report/title.tex
@@ -0,0 +1,98 @@
+$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$
+\usepackage{marvosym}
+\usepackage{authblk,academicons}
+%\renewcommand*{\Authand}{ og }
+%\renewcommand*{\Authands}{ og }
+\renewcommand*{\Authsep}{\authorcr}
+\renewcommand*{\Authand}{\authorcr}
+\renewcommand*{\Authands}{\newline} %%new line after each author
+\renewcommand{\Affilfont}{\small}
+\newcommand*{\orcid}[1]{\href{https://orcid.org/#1}{\textcolor[HTML]{A6CE39}{\aiOrcid}}}
+\newcommand*{\rorid}[1]{\href{https://ror.org/#1}{\aiROR}}
+$for(by-author)$
+$if(it.metadata.credit.supervision)$
+$else$
+\author[$for(it.affiliations)$$it.number$$endfor$$if(it.attributes.equal-contributor)$,\YinYang$endif$$if(it.attributes.corresponding)$,∗$endif$]{%
+  $if(it.url)$%
+  \href{$it.url$}{%
+  $endif$%
+  $it.name.literal$%
+  $if(it.metadata.alternate)$%
+    \ ($for(it.metadata.alternate)$$it$$sep$,$endfor$)%
+  $endif$%
+  $if(it.url)$%
+  }%
+  $endif$%
+  $if(it.orcid)$%
+    \,\orcid{$it.orcid$}%
+  $endif$%
+}
+$endif$
+$endfor$
+$for(by-author)$
+$if(it.metadata.credit.supervision)$
+\author[$for(it.affiliations)$$it.number$$endfor$]{%
+  \vspace{1em}
+  Supervisor:
+  $if(it.url)$%
+  \href{$it.url$}{%
+  $endif$%
+  $it.name.literal$%
+  $if(it.metadata.alternate)$%
+    \ ($for(it.metadata.alternate)$$it$$sep$,$endfor$)%
+  $endif$%
+  $if(it.url)$%
+  }%
+  $endif$%
+  $if(it.orcid)$%
+    \,\orcid{$it.orcid$}%
+  $endif$%
+}
+$endif$
+$endfor$
+$for(by-affiliation)$
+\affil[$it.number$]{%
+  $it.name$%
+  $if(it.department)$%
+    \\$it.department$%
+  $endif$%
+  $if(it.ror)$%
+    \,\rorid{$it.ror$}%
+  $endif$%
+}
+$endfor$
+$if(some-author-has.attributes.equal-contributor)$
+\affil[\YinYang]{These authors contributed equally to this work.}
+$endif$
+$if(some-author-has.attributes.corresponding)$
+$for(by-author)$
+$if(it.attributes.corresponding)$%
+\affil[∗]{Corresponding author: \href{mailto:$it.email$}{$it.email$}}
+$endif$
+$endfor$
+$endif$
+\date{$date$}
+$if(beamer)$
+$if(institute)$
+\institute{$for(institute)$$institute$$sep$ \and $endfor$}
+$endif$
+$if(titlegraphic)$
+\titlegraphic{\includegraphics$if(titlegraphicoptions)$[$for(titlegraphicoptions)$$titlegraphicoptions$$sep$, $endfor$]$endif${$titlegraphic$}}$endif$
+$if(logo)$
+\logo{\includegraphics{$logo$}}
+$endif$
+$endif$
diff --git a/_extensions/ruc-play/stylish-report/toc.tex b/_extensions/ruc-play/stylish-report/toc.tex
new file mode 100644
index 0000000..95cffff
--- /dev/null
+++ b/_extensions/ruc-play/stylish-report/toc.tex
@@ -0,0 +1,28 @@
+$if(toc)$
+$if(toc-title)$
+\renewcommand*\contentsname{$toc-title$}
+$endif$
+$if(beamer)$
+\begin{frame}[allowframebreaks]
+$if(toc-title)$
+  \frametitle{$toc-title$}
+$endif$
+  \setcounter{tocdepth}{$toc-depth$}
+  \tableofcontents
+\end{frame}
+$else$
+{
+$if(colorlinks)$
+\hypersetup{$if(toccolor)$linkcolor=$toccolor$$endif$}
+$endif$
+\setcounter{tocdepth}{$toc-depth$}
+\tableofcontents
+}
+$endif$
+$endif$
+$if(lof)$
+\listoffigures
+$endif$
+$if(lot)$
+\listoftables
+$endif$
\ No newline at end of file
diff --git a/_extensions/ruc-play/stylish-report/x/template.tex b/_extensions/ruc-play/stylish-report/x/template.tex
new file mode 100644
index 0000000..f5c5055
--- /dev/null
+++ b/_extensions/ruc-play/stylish-report/x/template.tex
@@ -0,0 +1,466 @@
+% Options for packages loaded elsewhere
+\PassOptionsToPackage{unicode$for(hyperrefoptions)$,$hyperrefoptions$$endfor$}{hyperref}
+\PassOptionsToPackage{hyphens}{url}
+$if(colorlinks)$
+\PassOptionsToPackage{dvipsnames,svgnames,x11names}{xcolor}
+$endif$
+$if(CJKmainfont)$
+\PassOptionsToPackage{space}{xeCJK}
+$endif$
+%
+$doc-class.tex()$
+
+$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]{section title}
+    \usebeamerfont{section title}\insertsection\par
+  \end{beamercolorbox}
+}
+\setbeamertemplate{subsection page}{
+  \centering
+  \begin{beamercolorbox}[sep=8pt,center]{subsection title}
+    \usebeamerfont{subsection title}\insertsubsection\par
+  \end{beamercolorbox}
+}
+\AtBeginPart{
+  \frame{\partpage}
+}
+\AtBeginSection{
+  \ifbibliography
+  \else
+    \frame{\sectionpage}
+  \fi
+}
+\AtBeginSubsection{
+  \frame{\subsectionpage}
+}
+$endif$
+$endif$
+$if(beamerarticle)$
+\usepackage{beamerarticle} % needs to be loaded first
+$endif$
+
+\usepackage{amsmath,amssymb}
+$if(linestretch)$
+\usepackage{setspace}
+$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}
+$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)$
+  $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
+}{}
+$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}
+$if(geometry)$
+$if(beamer)$
+\geometry{$for(geometry)$$geometry$$sep$,$endfor$}
+$else$
+\usepackage[$for(geometry)$$geometry$$sep$,$endfor$]{geometry}
+$endif$
+$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(lhs)$
+\lstnewenvironment{code}{\lstset{language=Haskell,basicstyle=\small\ttfamily}}{}
+$endif$
+$if(svg)$
+\usepackage{svg}
+$endif$
+$if(strikeout)$
+$-- also used for underline
+\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$
+\setlength{\emergencystretch}{3em} % prevent overfull lines
+$if(numbersections)$
+\setcounter{secnumdepth}{$if(secnumdepth)$$secnumdepth$$else$5$endif$}
+$else$
+\setcounter{secnumdepth}{-\maxdimen} % remove section numbering
+$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$
+$if(pagestyle)$
+\pagestyle{$pagestyle$}
+$endif$
+$pandoc.tex()$
+
+$if(lang)$
+\ifLuaTeX
+$if(babel-lang)$
+% use classic babel syntax: <https://github.com/jgm/pandoc/issues/8283>
+\usepackage[main=$babel-lang$,$for(babel-otherlangs)$$babel-otherlangs$$sep$,$endfor$,provide=*,bidi=basic]{babel}
+$else$
+\usepackage[bidi=basic]{babel}
+$endif$
+\else
+\usepackage[bidi=default]{babel}
+\fi
+$if(babel-lang)$
+\ifLuaTeX
+\else
+\babelprovide[main,import]{$babel-lang$}
+\fi
+$if(mainfont)$
+\ifPDFTeX
+\else
+\babelfont{rm}[$for(mainfontoptions)$$mainfontoptions$$sep$,$endfor$$if(mainfontfallback)$,RawFeature={fallback=mainfontfallback}$endif$]{$mainfont$}
+\fi
+$endif$
+$endif$
+\ifLuaTeX
+\else
+$for(babel-otherlangs)$
+\babelprovide[import]{$babel-otherlangs$}
+\fi
+$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$
+$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(biblio-config)$
+$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$
+$endif$
+$if(nocite-ids)$
+\nocite{$for(nocite-ids)$$it$$sep$, $endfor$}
+$endif$
+$if(csquotes)$
+\usepackage{csquotes}
+$endif$
+\usepackage{bookmark}
+
+\IfFileExists{xurl.sty}{\usepackage{xurl}}{} % add URL line breaks if available
+\urlstyle{same} % disable monospaced font for URLs
+$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={$for(by-author)$$if(it.metadata.credit.supervision)$$else$$it.name.literal$$endif$$sep$,$endfor$},
+$endif$
+$if(lang)$
+  pdflang={$lang$},
+$endif$
+$if(subject)$
+  pdfsubject={$subject$},
+$endif$
+$if(keywords)$
+  pdfkeywords={$for(keywords)$$keywords$$sep$, $endfor$},
+$endif$
+$if(colorlinks)$
+  colorlinks=true,
+  $if(linkcolor)$linkcolor={$linkcolor$}$endif$,
+  $if(filecolor)$filecolor={$filecolor$}$endif$,
+  $if(citecolor)$citecolor={$citecolor$}$endif$,
+  $if(urlcolor)$urlcolor={$urlcolor$}$endif$,
+$else$
+$if(boxlinks)$
+$else$
+  hidelinks,
+$endif$
+$endif$
+  pdfcreator={LaTeX via pandoc}}
+
+$before-title.tex()$
+
+$title.tex()$
+
+\begin{document}
+$before-body.tex()$
+
+$for(include-before)$
+$include-before$
+
+$endfor$
+$toc.tex()$
+
+$if(linestretch)$
+\setstretch{$linestretch$}
+$endif$
+$if(has-frontmatter)$
+\mainmatter
+$endif$
+$body$
+
+$before-bib.tex()$
+
+$if(has-frontmatter)$
+\backmatter
+$endif$
+$biblio.tex()$
+
+$for(include-after)$
+$include-after$
+
+$endfor$
+$after-body.tex()$
+
+\end{document}
diff --git a/_extensions/ruc-play/stylish-roles/_extension.yaml b/_extensions/ruc-play/stylish-roles/_extension.yaml
new file mode 100644
index 0000000..190c698
--- /dev/null
+++ b/_extensions/ruc-play/stylish-roles/_extension.yaml
@@ -0,0 +1,6 @@
+name: stylish-roles
+author: Jonas Smedegaard
+version: 0.0.1
+contributes:
+  filters:
+    - stylish-roles.lua
diff --git a/_extensions/ruc-play/stylish-roles/stylish-roles.lua b/_extensions/ruc-play/stylish-roles/stylish-roles.lua
new file mode 100644
index 0000000..50caf71
--- /dev/null
+++ b/_extensions/ruc-play/stylish-roles/stylish-roles.lua
@@ -0,0 +1,54 @@
+--[[
+stylish-roles - provide existence hints for attributes and CrediT roles
+as authors[*].metadata.credit[role], by-author[*].metadata.credit[role],
+some-author-has[*].credit[role] and some-author-has.attributes[attribute].
+
+Copyright: © 2024 Jonas Smedegaard <dr@jones.dk
+License:   MIT – see LICENSE file for details
+]]
+function Meta(meta)
+    local attributes = {"corresponding", "equal-contributor"}
+
+    for _, author in ipairs(meta.authors) do
+        if author.roles then
+            local _by = meta["by-author"][tonumber(author.number)]
+            local _some = meta["some-author-has"]
+
+            for _, role in ipairs(author.roles) do
+                if role["vocab-term"] then
+
+                    -- create if missing
+                    author.metadata.credit = author.metadata.credit or {}
+                    _by.metadata.credit = _by.metadata.credit or {}
+                    meta["some-author-has"] = meta["some-author-has"] or {}
+                    meta["some-author-has"].credit = meta["some-author-has"].credit or {}
+
+                    author.metadata.credit[role["vocab-term"]] = true
+                    _by.metadata.credit[role["vocab-term"]] = true
+                    meta["some-author-has"].credit[role["vocab-term"]] = true
+
+                    -- debugging aid
+                    --error(pandoc.utils.stringify(author.name.literal)
+                    --    .. " does " .. role["vocab-term"] .. ".")
+                end
+            end
+
+            for _, attr in ipairs(attributes) do
+                if author.attributes and author.attributes[attr] then
+                    -- create if missing
+                    meta["some-author-has"].attributes = meta["some-author-has"].attributes or {}
+
+                    meta["some-author-has"].attributes[attr] = true
+                end
+            end
+        end
+    end
+
+    -- debugging aid
+    --quarto.utils.dump(meta)
+    --quarto.utils.dump(meta["authors"])
+    --quarto.utils.dump(meta["by-author"])
+    --quarto.utils.dump(meta["some-author-has"])
+
+    return meta
+end
-- 
cgit v1.2.3