Files
enok/typst/stil.typ
T

139 lines
4.2 KiB
Typst
Raw Normal View History

// Stilark for enok-energirapporten. Kopieres til utdatakatalogen og kan tilpasses fritt.
#let aksent = rgb("#8c2f1f")
#let aksent-lys = rgb("#b9633f")
#let moerk = rgb("#1a1a1a")
#let mid = rgb("#555555")
#let lys = rgb("#f4f1ee")
#let kantlinje = rgb("#ddd4cc")
// Aksentfarge og overskriftsskrift kan settes av rapporten, slik at den kan følge
// firmaets øvrige dokumenter. Verdiene under er enoks egne.
#let aksent-valgt = state("aksent-valgt", aksent)
#let skrift-valgt = state("skrift-valgt", none)
#let font-heading = ("Libertinus Serif", "DejaVu Serif", "Noto Serif")
#let font-body = ("Libertinus Serif", "DejaVu Serif", "Noto Serif")
#let font-tall = ("DejaVu Sans Mono", "Liberation Mono")
/// Skriften rapporten har bedt om, ellers enoks egen.
#let overskriftsskrift() = {
let valgt = skrift-valgt.get()
if valgt == none { font-heading } else { (valgt,) + font-heading }
}
#let oppsett(
tittel: "",
undertittel: "",
bunntekst: "",
avsender: "",
farge: none,
skrift: none,
doc,
) = {
aksent-valgt.update(if farge == none { aksent } else { farge })
skrift-valgt.update(skrift)
set page(
paper: "a4",
margin: (top: 2.4cm, bottom: 2.4cm, left: 2.2cm, right: 2.2cm),
header: context {
if counter(page).get().first() > 1 {
grid(
columns: (1fr, auto),
align: (left + horizon, right + horizon),
text(font: overskriftsskrift(), size: 8pt, fill: mid)[#tittel],
text(font: font-body, size: 8pt, fill: mid)[#counter(page).display()],
)
line(length: 100%, stroke: 0.4pt + kantlinje)
}
},
footer: context {
if counter(page).get().first() > 1 and (bunntekst != "" or avsender != "") {
line(length: 100%, stroke: 0.4pt + kantlinje)
v(3pt)
if avsender != "" {
text(font: font-body, size: 7.5pt, fill: mid)[#avsender]
linebreak()
}
text(font: font-body, size: 7.5pt, fill: mid)[#bunntekst]
}
},
)
set text(font: font-body, size: 10pt, fill: moerk, lang: "nb")
set par(justify: true, leading: 0.62em)
show heading: it => context {
set text(font: overskriftsskrift(), fill: aksent-valgt.get())
block(above: 1.2em, below: 0.6em, it)
}
show heading.where(level: 1): it => context {
set text(size: 15pt, weight: "bold")
block(above: 1.6em, below: 0.7em)[
#it.body
#v(-0.45em)
#line(length: 100%, stroke: 1pt + aksent-valgt.get())
]
}
show heading.where(level: 2): set text(size: 11.5pt, weight: "bold")
set table(stroke: none, inset: (x: 6pt, y: 4pt))
show table.cell.where(y: 0): set text(weight: "bold", size: 9pt)
doc
}
// Tabell med stripete rader og linje under overskriften.
#let tabell(kolonner: (), overskrift: (), rader: (), justering: none, sum-rader: ()) = context {
let aksent = aksent-valgt.get()
let j = if justering == none { kolonner.map(_ => right) } else { justering }
block(breakable: true, table(
columns: kolonner,
align: (x, y) => if y == 0 { center + bottom } else { j.at(x) + horizon },
fill: (x, y) => if y == 0 { lys }
else if sum-rader.contains(y - 1) { rgb("#efe9e4") }
else if calc.rem(y, 2) == 0 { rgb("#fbfaf9") } else { white },
stroke: (x, y) => (
bottom: if y == 0 { 0.8pt + aksent } else { 0.3pt + kantlinje },
),
..overskrift.map(h => [#h]),
..rader.flatten(),
))
}
// Tittelen på forsiden, i samme skrift og farge som overskriftene.
#let forsidetittel(tekst) = context {
text(
font: overskriftsskrift(),
size: 26pt,
weight: "bold",
fill: aksent-valgt.get(),
)[#tekst]
}
// Stor karakterrute på forsiden.
#let karakterrute(bokstav, verdi, farge) = {
box(
fill: farge,
radius: 6pt,
inset: (x: 16pt, y: 12pt),
stack(
spacing: 3pt,
align(center, text(size: 46pt, weight: "bold", fill: white)[#bokstav]),
align(center, text(size: 9pt, fill: white)[#verdi kWh/(m²·år)]),
),
)
}
#let faktaboks(innhold) = block(
fill: lys,
radius: 4pt,
inset: 9pt,
width: 100%,
stroke: 0.4pt + kantlinje,
innhold,
)
#let merknad(innhold) = block(
inset: (left: 9pt),
stroke: (left: 2pt + aksent-lys),
text(size: 9pt)[#innhold],
)