Files
enok/typst/stil.typ
T
blandClaude Opus 5 bef3bb1090
test / test (pull_request) Successful in 2m22s
Vis prosjektversjonen i et internkontrollfelt på forsiden
Rapporten bar enok-versjonen og datoen i bunnteksten på hver side, men ikke hvilken versjon
av prosjektet den var laget fra. Det er den opplysningen som knytter rapporten til en bestemt
utgivelse av bygningsmodellen, og den hører hjemme ett sted, tydelig plassert.

Forsiden har nå et internkontrollfelt med prosjekt, prosjektversjon, oppdragsgiver,
energirådgiver, dato og enok-versjon. Bunnteksten gjentar ikke lenger versjon og dato.

Versjonen settes med «rapport.versjon» eller «--versjon», slik at byggeserveren kan sende
taggen på utgivelsen uten at noen fil endres.

Lukker #1

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015GeH3y8fwTaTudaD88P57o
2026-10-05 19:57:21 +02:00

165 lines
4.8 KiB
Typst

// 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]
}
// Internkontrollfelt på forsiden: hvilket prosjekt, hvilken versjon og når.
#let internkontroll(rader) = context {
block(
width: 100%,
inset: 9pt,
radius: 4pt,
fill: lys,
stroke: 0.4pt + kantlinje,
stack(
spacing: 6pt,
text(
font: overskriftsskrift(),
size: 7.5pt,
fill: aksent-valgt.get(),
tracking: 0.8pt,
)[INTERNKONTROLL],
..rader.map(rad => grid(
columns: (3.8cm, 1fr),
gutter: 6pt,
text(size: 8.5pt, fill: mid)[#rad.at(0)],
text(size: 8.5pt)[#rad.at(1)],
)),
),
)
}
// 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],
)