diff options
Diffstat (limited to '_extensions')
-rw-r--r-- | _extensions/js/graphics-noindent/_extension.yml | 6 | ||||
-rw-r--r-- | _extensions/js/graphics-noindent/graphics-noindent.lua | 15 | ||||
-rw-r--r-- | _extensions/js/ingress/_extension.yml | 6 | ||||
-rw-r--r-- | _extensions/js/ingress/ingress.lua | 29 | ||||
-rw-r--r-- | _extensions/js/multicol-nohead/_extension.yml | 6 | ||||
-rw-r--r-- | _extensions/js/multicol-nohead/multicol-nohead.lua | 166 | ||||
-rw-r--r-- | _extensions/js/stylish-issue/_extension.yaml | 197 | ||||
-rw-r--r-- | _extensions/js/stylish-issue/doc-class.tex | 68 |
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$} |