summaryrefslogtreecommitdiff
path: root/_extensions/js
diff options
context:
space:
mode:
Diffstat (limited to '_extensions/js')
-rw-r--r--_extensions/js/graphics-noindent/_extension.yml6
-rw-r--r--_extensions/js/graphics-noindent/graphics-noindent.lua15
-rw-r--r--_extensions/js/ingress/_extension.yml6
-rw-r--r--_extensions/js/ingress/ingress.lua29
-rw-r--r--_extensions/js/multicol-nohead/_extension.yml6
-rw-r--r--_extensions/js/multicol-nohead/multicol-nohead.lua166
-rw-r--r--_extensions/js/stylish-issue/_extension.yaml197
-rw-r--r--_extensions/js/stylish-issue/doc-class.tex68
8 files changed, 469 insertions, 24 deletions
diff --git a/_extensions/js/graphics-noindent/_extension.yml b/_extensions/js/graphics-noindent/_extension.yml
new file mode 100644
index 0000000..81c5276
--- /dev/null
+++ b/_extensions/js/graphics-noindent/_extension.yml
@@ -0,0 +1,6 @@
+title: Graphics-NoIndent
+author: Jonas Smedegaard
+version: 0.0.1
+contributes:
+ filters:
+ - graphics-noindent.lua
diff --git a/_extensions/js/graphics-noindent/graphics-noindent.lua b/_extensions/js/graphics-noindent/graphics-noindent.lua
new file mode 100644
index 0000000..2f3a140
--- /dev/null
+++ b/_extensions/js/graphics-noindent/graphics-noindent.lua
@@ -0,0 +1,15 @@
+-- Disable indentation when a paragraph exclusively contains an image
+
+local noindent = pandoc.RawInline('latex', [[
+\noindent
+]])
+
+function Para(elem)
+ if FORMAT:match 'latex' then
+ if elem.content[1].t == 'Image' then
+ new_elem = elem
+ new_elem.content:insert(1, noindent)
+ return new_elem
+ end
+ end
+end
diff --git a/_extensions/js/ingress/_extension.yml b/_extensions/js/ingress/_extension.yml
new file mode 100644
index 0000000..4655adc
--- /dev/null
+++ b/_extensions/js/ingress/_extension.yml
@@ -0,0 +1,6 @@
+title: Ingress
+author: Jonas Smedegaard
+version: 0.0.1
+contributes:
+ filters:
+ - ingress.lua
diff --git a/_extensions/js/ingress/ingress.lua b/_extensions/js/ingress/ingress.lua
new file mode 100644
index 0000000..3c2c429
--- /dev/null
+++ b/_extensions/js/ingress/ingress.lua
@@ -0,0 +1,29 @@
+-- Translate div class .lead to custo LaTeX environment \ingress{}
+
+local function escape_latex(str)
+ local replacements = {
+ ["\\"] = "\\textbackslash{}",
+ ["{"] = "\\{",
+ ["}"] = "\\}",
+ ["$"] = "\\$",
+ ["&"] = "\\&",
+ ["#"] = "\\#",
+ ["_"] = "\\_",
+ ["%"] = "\\%",
+ ["^"] = "\\textasciicircum{}",
+ ["~"] = "\\textasciitilde{}"
+ }
+ return (str:gsub(".", function(c)
+ return replacements[c] or c
+ end))
+end
+
+function Div(el)
+ if FORMAT:match 'latex' then
+ if el.classes:includes('lead') then
+ local content = pandoc.utils.stringify(el.content)
+ local escaped_content = escape_latex(content)
+ return pandoc.RawBlock('latex', '\\ingress{' .. escaped_content .. '}')
+ end
+ end
+end
diff --git a/_extensions/js/multicol-nohead/_extension.yml b/_extensions/js/multicol-nohead/_extension.yml
new file mode 100644
index 0000000..104f8ab
--- /dev/null
+++ b/_extensions/js/multicol-nohead/_extension.yml
@@ -0,0 +1,6 @@
+title: Multicol-NoHead
+author: Jonas Smedegaard
+version: 0.0.1
+contributes:
+ filters:
+ - multicol-nohead.lua
diff --git a/_extensions/js/multicol-nohead/multicol-nohead.lua b/_extensions/js/multicol-nohead/multicol-nohead.lua
new file mode 100644
index 0000000..f190db8
--- /dev/null
+++ b/_extensions/js/multicol-nohead/multicol-nohead.lua
@@ -0,0 +1,166 @@
+-- Render content below header in three columns
+
+local multicol_begin = pandoc.RawBlock('latex', [[
+\begin{multicols}{3}\raggedcolumns
+]])
+local multicol_end = pandoc.RawBlock('latex', [[
+\end{multicols}
+]])
+
+local ad_template = [[
+\begin{minipage}[%s][%s\textheight][c]{\textwidth}
+\centering
+\includegraphics[width=\linewidth,height=%s\textheight,keepaspectratio]{%s}
+\end{minipage}
+]]
+
+local function has_class(elem, class)
+ local classes = elem.classes
+ if not classes then
+ return false
+ end
+ for _, c in ipairs(classes) do
+ if c == class then
+ return true
+ end
+ end
+ return false
+end
+
+local function is_columnar_header(elem)
+ return elem.t == "Header" and elem.level == 1
+end
+
+local function is_multicols_begin(elem)
+ return elem.t == "RawBlock" and elem.text == "\\begin{multicols}{3}\\raggedcolumns"
+end
+
+local function is_multicols_end(elem)
+ return elem.t == "RawBlock" and elem.text == "\\end{multicols}"
+end
+
+-- a standalone image with optional caption that has class .wide
+-- TODO: detect pre-quarto-filter pattern too
+local function is_wide(elem)
+ return ((elem.t == "Para" and has_class(elem.content[1], "wide"))
+ or (elem.t == "Figure" and has_class(elem.content[1].content[1], "wide")))
+end
+
+-- TODO: detect pre-quarto-filter pattern too
+local function is_newpage_command(elem)
+ return (elem.t == "RawBlock" and elem.text == "\\newpage{}")
+ or (elem.t == "Para" and #elem.content == 5 and elem.content[3] == "pagebreak")
+end
+
+-- a paragraph where initial element has class .ad is an advertising
+local function is_advertising(elem)
+ if elem.t == "Para" then
+ local elem1 = elem.content[1]
+ if elem1.t == "Image" and has_class(elem1, "ad") then
+ return true
+ end
+ end
+ return false
+end
+
+-- wrap images with class .ad to span half or full page
+local function ad(elem)
+ local amount = #elem.content
+
+ -- 1 ad, spanning full page except with class .top or .bottom
+ if amount == 1 then
+ local elem1 = elem.content[1]
+ if elem1.t ~= "Image" or not elem1.src then
+ error("failed to parse advertisement")
+ return elem
+ end
+ if has_class(elem1, "top") then
+ return pandoc.RawBlock('latex', "\\noindent\n"
+ .. string.format(ad_template, "t", "0.5", "0.5", elem1.src))
+ elseif has_class(elem1, "bottom") then
+ return pandoc.RawBlock('latex', "\\vspace*{\\fill}\\noindent\n"
+ .. string.format(ad_template, "b", "0.5", "0.5", elem1.src))
+ end
+ return pandoc.RawBlock('latex',"\\noindent\n"
+ .. string.format(ad_template, "t", "1", "1", elem1.src))
+ end
+
+ -- 2 ads spanning full page
+ if amount == 3 then
+ local elem1 = elem.content[1]
+ local elem2 = elem.content[3]
+ if elem1.t ~= "Image" or not elem1.src
+ or elem2.t ~= "Image" or not elem2.src
+ then
+ error("failed to parse 2-element advertisement")
+ return elem
+ end
+ return pandoc.RawBlock('latex', "\\noindent\n"
+ .. string.format(ad_template, "t", "0.5", "0.5", elem1.src)
+ .. string.format(ad_template, "b", "0.5", "0.5", elem2.src))
+ end
+
+ error("failed to parse advertisement, wrong amount of elements: "
+ .. amount)
+ return elem
+end
+
+function Pandoc(doc)
+ if FORMAT:match 'latex' then
+
+ -- locate topmost-only elements where multicol state should change
+ local multicol_now = false
+ local multicol_places = {}
+ for i, elem in ipairs(doc.blocks) do
+ if is_columnar_header(elem) then
+ multicol_places[i] = multicol_now and "renew" or "begin"
+ multicol_now = true
+ elseif is_wide(elem) then
+ if multicol_now then
+ multicol_places[i] = "renew"
+ end
+ elseif is_advertising(elem) then
+ doc.blocks[i] = ad(elem)
+ if multicol_now then
+ multicol_places[i] = "renew"
+ end
+ elseif is_newpage_command(elem) then
+ if multicol_now then
+ multicol_places[i] = "end"
+ multicol_now = false
+ end
+ elseif elem.t == "HorizontalRule" then
+ if multicol_now then
+ multicol_places[i] = "end"
+ multicol_now = false
+ end
+ elseif is_multicols_begin(elem) then
+ multicol_now = true
+ elseif is_multicols_end(elem) then
+ multicol_now = false
+ end
+ end
+ if multicol_now then
+ multicol_places[#doc.blocks] = "end"
+ end
+
+ -- apply multicol, in reverse order since it shifts later indices
+ for i = #doc.blocks, 1, -1 do
+ local state = multicol_places[i]
+ if state ~= nil then
+ if state == "begin" then
+ doc.blocks:insert(i + 1, multicol_begin)
+ elseif state == "renew" then
+ doc.blocks:insert(i + 1, multicol_begin)
+ doc.blocks:insert(i, multicol_end)
+ elseif state == "end" then
+ doc.blocks:insert(i, multicol_end)
+ end
+ end
+ end
+
+ if #multicol_places >= 1 then
+ return doc
+ end
+ end
+end
diff --git a/_extensions/js/stylish-issue/_extension.yaml b/_extensions/js/stylish-issue/_extension.yaml
index 4b02876..153adfa 100644
--- a/_extensions/js/stylish-issue/_extension.yaml
+++ b/_extensions/js/stylish-issue/_extension.yaml
@@ -4,30 +4,44 @@ version: 0.0.1
contributes:
formats:
pdf:
+# fontsize: 11pt
+ indent: true
# links-as-notes: true
colorlinks: false
pdf-engine: lualatex
documentclass: scrartcl
+ classoption:
+ - headings=big
csquotes: true
papersize: a4
# extract-media: img
template-partials:
- before-title.tex
+ - doc-class.tex
include-in-header:
+# borrow microtype tunings from somewhat similar EB Garamond
+ - text: |
+ \DeclareMicrotypeAlias{ETbb}{EB Garamond}
+# larger section font
+ - text: |
+ \RedeclareSectionCommand[font=\Huge]{section}
# support multiple tagged columns (class option twocolumn is not tagged)
+# * disable all drivers, as recommended in CTAN package crop
- text: |
- \usepackage[a4paper, margin=0.5in, bottom=1in]{geometry} % Set all margins to zero
+ \usepackage[dvips=false,pdftex=false,vtex=false]{geometry}
+ \geometry{a4paper, margin=0.5in, bottom=1in}
\usepackage{multicol}
- \setlength{\columnsep}{20pt} % Adjust space between columns
- \setlength{\columnwidth}{0.45\textwidth} % Set column width (optional)
+ \setlength{\multicolsep}{0pt}
+ \setlength{\columnsep}{1.5em}
+ \setlength{\columnseprule}{0.4pt}
# avoid widow headline or definition description
- text: |
\usepackage{needspace}
\let\oldsection\section
\renewcommand{\section}[1]{%
- \needspace{6\baselineskip}
+ \needspace{7\baselineskip}
\oldsection{#1}%
}
\let\olddesc\description
@@ -38,33 +52,168 @@ contributes:
# avoid widow or orphan lines
- text: |
\usepackage[defaultlines=3,all]{nowidow}
-# reduce vertical space after headlines
- - text: |
- \RedeclareSectionCommands[
- runin=false,
- beforeskip=.5\baselineskip,
- afterskip=-1ex]{section,subsection}
-# add newline between definition list description and items
+# tighten lists styling
+# * add newline between definition list description and items
+# * reduce unnumbered list item indentation
- text: |
\usepackage{enumitem}
- \setlist[description]{style=nextline}
+ \setlist[description]{leftmargin=0em,style=nextline}
+ \setlist[itemize]{leftmargin=*,labelsep=0.5em}
+# tighten blockquote styling to reduce margins
+ - text: |
+ \renewenvironment{quote}
+ {\list{}{\leftmargin=1em \rightmargin=1em}\item[]}
+ {\endlist}
# set page footer to danish page count "side X af Y"
- text: |
\usepackage{lastpage}
\usepackage{scrlayer-scrpage}
- \cfoot{side \thepage\ af \pageref{LastPage}}
-# suppress figure label
+ \cfoot*{side \thepage\ af \pageref{LastPage}}
+# suppress figure label, and adjust styling
- text: |
- \usepackage[labelformat=empty]{caption}
-
- include-before-body:
+ \usepackage[labelformat=empty,font={sf,small},skip=0.5ex]{caption}
+# newspaper styling of title header; omit page number on front page
- text: |
-# enable multiple tagged columns
+ \usepackage[useregional,showdow]{datetime2}
+ \makeatletter
+ \renewcommand{\maketitle}{
+ {
+ \rightline{\@subtitle, \DTMdate{\@date}}
+ \centerline{\resizebox{\linewidth+18pt}{!}{\textsc{\@title}}}
+ \thispagestyle{empty}
+ }
+ }
+ \makeatother
+# define format for ingress text
- text: |
- \begin{multicols}{2}
- \raggedcolumns
-
- include-after-body:
-# conclude multiple tagged columns
+ \makeatletter
+ \newcommand{\ingress}[1]{%
+ {\Large #1}\par
+ \@afterindentfalse
+ \@afterheading
+ \vspace{.5\baselineskip}%
+ }
+ \makeatother
+# support unusual space characters like   and  
- text: |
- \end{multicols}
+ \usepackage{uspace}
+# refine hyphenation
+ - text: |
+ \usepackage{lua-check-hyphen}
+ \LuaCheckHyphen{whitelist={hyph_ok_danish.txt}]{lua-check-hyphen}}
+ %\LuaCheckHyphen{whitelist={file1.txt,file2.txt,file3.txt}}
+ \babelhyphenation[danish]{
+ af-fald-et % affal-det
+ an-er-kend-el-sen % anerken-delsen
+ an-hæng-er-en % anhæn-geren
+ ar-bejds-dag-e-ne % arbejdsda-gene
+ be-slut-ning-er % beslutnin-ger
+ be-søg-ende % besø-gende
+ bord-ene % bor-dene
+ bo-ring-en % borin-gen
+ bris-ter % bri-ster
+ brugs-for-e-ning-ens % brugsforenin-gens
+ by-bjerg % byb-jerg
+ bå-de-laug-ets % bådelau-gets
+ del-stræk-ning-er-ne % delstræknin-gerne
+ del-tag-en-de % delta-gende
+ ener-gi-klas-se % energik-lasse
+ e-ner-gi-re-no-ve-ring-er % energirenoverin-ger
+ er-fa-ring-en % erfarin-gen
+ es-bjerg % esb-jerg
+ fjord-en % fjor-den
+ fol-ke-ting-ets % folketin-gets
+ fond-en % fon-den
+ for-bind-el-se % forbin-delse
+ for-e-ning-en % forenin-gen
+ for-e-ning-er % forenin-ger
+ for-hand-ling-er-ne % forhandlin-gerne
+ for-sam-lings-hu-set % forsamlingshu-set
+ for-sam-lings-hu-sets % forsam-lingshu-sets
+ for-æl-dre-for-e-ning-ens % forældreforenin-gens
+ for-år-et % forå-ret
+ frem-skriv-ning-er % fremskrivnin-ger
+ fri-lufts-laug % fril-uftslaug
+ fri-lufts-råd-et % fril-uftsrådet
+ fund-et % fun-det
+ fæl-les-mail-en % fællesmai-len
+ grønt-sags-la-sag-ne % grøntsag-slasagne
+ ho-ved-byg-ning-en % hovedbygnin-gen
+ hon-ning-en % honnin-gen
+ hus-hold-nings-for-e-ning-er % husholdningsforenin-ger
+ hyg-ge-land-brug-et % hyggelandbru-get
+ høj-sæ-son-en % højsæso-nen
+ ind-flyt-ning-en % indflytnin-gen
+ in-fra-struk-tur-en % infrastruktu-ren
+ in-ter-es-se-for-e-ning-er % interesseforenin-ger
+ ka-jak-ro-ning % kaja-kroning
+ klat-rede % kla-trede
+ kom-mu-nist-er % kommuni-ster
+ kon-cen-tra-ti-ons-lejr-en % koncentrationslej-ren
+ krea-ting % kreat-ing
+ krig-en % kri-gen
+ kul-tur-be-hol-der-en % kulturbeholde-ren
+ kul-tur-for-e-ning-er % kulturforenin-ger
+ kva-li-tet-en % kva-lite-ten
+ kvarts-fa-mi-li-en % kvart-sfamilien
+ kvæl-stof-ud-led-ning-en % kvælstofudlednin-gen
+ land-mand-en % landman-den
+ lej-lig-hed-er % lejlighe-der
+ lejr-at-mos-fæ-re % lej-ratmosfære
+ lejr-sko-le % lej-rskole
+ ler-lag-et % lerla-get
+ lig-hed-er % lighe-der
+ løs-ning-er % løs-nin-ger
+ men-nes-ker % menne-sker
+ mi-nis-tre % mini-stre
+ mær-kat-er-ne % mærka-terne
+ må-ned-er % måne-der
+ na-tur-op-le-vel-ser % natu-roplevelser
+ ok-se-mør-brad-en % oksemørbra-den
+ orø-post-en % orøpo-sten
+ per-son-er % perso-ner
+ pin-se-lop-pe-mar-ked % pin-sel-oppemarked
+ pin-se-lop-pe-mar-ked-et % pinsel-oppemar-ke-det
+ prang-en-de % pran-gende
+ proviant-en % provian-ten
+ re-dak-tion-en % redaktio-nen
+ rick-shaw % ricks-haw
+ rick-shaw-for-e-ning-en % rickshawforenin-gen
+ sam-virk-en-de % samvir-kende
+ schreib-eis % schrei-beis
+ se-nio-r-er % seni-orer
+ skov-en % sko-ven
+ skulp-tur-er % skul-pturer
+ skulp-tør % skul-ptør
+ sky-de-gla-de % skydeg-lade
+ smuk-ke-ste % smukkes-te
+ so-cia-le % soci-ale
+ som-mer-en % somme-ren
+ som-mer-hus-eje-re % sommerhuse-jere
+ som-mer-hus-grund-ejer-for-e-ning % sommerhusgrunde-jerforening
+ som-mer-hus-gæst-er % sommerhusgæs-ter
+ spe-cia-le % speci-ale
+ sports-plads-en % sport-spladsen
+ spænd-en-de % spæn-dende
+ stab-en % sta-ben
+ sten-e-ne % ste-nene
+ sten-sli-be-re % stens-libere
+ sving-ende % svin-gende
+ tal-lerk-ner % taller-kner
+ thors-lev % thor-slev
+ tryk-sag-er % tryksa-ger
+ tråd-te % trå-dte
+ ud-for-dring-er % udfordrin-ger
+ ud-stil-ling-er % udstillin-ger
+ ud-vik-ling-en % udviklin-gen
+ und-tag-el-se % undta-gelse
+ vand-ak-ti-vi-tet-er % van-daktiviteter
+ vand-et % van-det
+ vand-ets % van-dets
+ vind-ud-sat % vin-dudsat
+ vok-sen-bib-li-o-tek-et % voksenbi-blio-teket
+ væ-ve-a-te-lier-et % væveateli-eret
+ week-end-en % weeken-den
+ work-shops % wor-kshops
+ øn-ske-lis-te % ønskeli-ste
+ }
diff --git a/_extensions/js/stylish-issue/doc-class.tex b/_extensions/js/stylish-issue/doc-class.tex
new file mode 100644
index 0000000..a9dbfaa
--- /dev/null
+++ b/_extensions/js/stylish-issue/doc-class.tex
@@ -0,0 +1,68 @@
+\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[
+$for(babel-otherlangs)$
+ $babel-otherlangs$,
+$endfor$
+$if(babel-lang)$
+ $babel-lang$,
+$endif$
+$if(fontsize)$
+ $fontsize$,
+$endif$
+$if(papersize)$
+ $papersize$paper,
+$endif$
+$for(classoption)$
+ $classoption$$sep$,
+$endfor$
+]{$documentclass$}