make entire template usable & finish dijkstra project

This commit is contained in:
2026-08-23 23:53:07 +09:00
parent 1f64dc54e2
commit de2484754e
58 changed files with 767 additions and 22 deletions
+174 -22
View File
@@ -7,7 +7,7 @@
#let font-display = ("Source Serif 4 Display", "Source Han Serif K")
#let font-subhead = ("Source Serif 4 Subhead", "Source Han Serif K")
#let font-caption = ("Source Serif 4 Caption", "Source Han Serif K")
// #let font-code =
#let font-code = ("Source Code Pro", "Pretendard")
#let color-surface = white
#let color-ink = color.oklch(22%, 0.01, 250deg)
@@ -52,12 +52,14 @@
),
)
#let evidence-data = state("evidence-data", none)
// ==================================================
// Util functions
// ==================================================
#let pad-zeros(num, width) = {
#let pad_zeros(num, width) = {
let s = str(num)
"0" * calc.max(0, width - s.len()) + s
}
@@ -77,17 +79,33 @@
}
#let heading_text(it) = {
if it.has("text") {
if type(it) == str {
it
} else if it == linebreak() {
" "
} else if it.has("text") {
it.text
} else if it.has("children") {
it.children.map(heading_text).join("")
} else if it == linebreak() {
" "
} else {
""
}
}
// Must be called from inside a context block.
#let cur_activity() = {
let m = meta.get()
let level1s = query(heading.where(level: 1, outlined: true))
let n = counter(heading).get().at(0)
let cur = level1s.at(n - 1)
let prefix = str(m.cur_domain) + "." + str(n) + ". "
(
prefix: prefix,
name: heading_text(cur.body),
location: cur.location(),
)
}
// ==================================================
// Body components
@@ -115,7 +133,8 @@
block(
width: 100%,
inset: (x: 12pt, y: 18pt),
radius: 4pt,
spacing: 1.6em,
// radius: 4pt,
fill: bg_c,
stroke: (paint: border_c),
)[
@@ -149,7 +168,7 @@
stroke: (
paint: c,
thickness: line-width,
cap: "round",
// cap: "round",
),
angle: 90deg,
length: body-size.height + 15pt,
@@ -202,20 +221,43 @@
)
}
#let block_equation(content) = {
#let block_equation(title: "", description: "", content) = context {
let cp = color-palette.get()
callout()[
#set par(
spacing: 1em,
)
#if title != "" {
kicker(color: cp.accent)[#title]
}
#content
#if description != "" {
set text(
size: 9pt,
fill: color-ink-helper,
)
align(right)[#description]
}
]
}
#let stack(layers) = context {
#let u_link(url, content) = link(url)[
#underline(
content,
)
]
#let stack(..layers) = context {
let cp = color-palette.get()
let radius = 12pt
let gutter = 12pt
let gap = 24pt
let indent = radius + gutter
for (idx, (title, body)) in layers.enumerate() {
for (idx, (title, body)) in layers.pos().enumerate() {
let is_last = idx == layers.len() - 1
block(
@@ -274,6 +316,38 @@
}
}
#let ref_evidence() = {
let ca = cur_activity()
set ref(
supplement: "증빙 자료.",
)
align(bottom)[
#hl[]
*활동 증빙 자료:*
#underline[#ref(label("Evidence) " + ca.name))]
]
}
#let add_evidence(activity_ref: none, ..content) = context {
let name = str(activity_ref.target)
let data = (
(
name,
content.pos().flatten(),
),
).to-dict()
evidence-data.update(old => {
if old == none {
data
} else {
old + data
}
})
}
#let header_template(dark: false, font_color: none, show_activity: false) = place(
top + left,
dy: 1cm,
@@ -293,13 +367,10 @@
link((page: 1, x: 0pt, y: 0pt))[#m.cur_domain. #m.domain_name]
h(1fr)
if show_activity {
let level1s = query(heading.where(level: 1, outlined: true))
let n = counter(heading).get().at(0)
let cur = level1s.at(n - 1)
let prefix = str(m.cur_domain) + "." + str(n) + ". "
let ca = cur_activity()
link(
cur.location(),
prefix + cur.body,
ca.location,
ca.prefix + ca.name,
)
}
}
@@ -345,7 +416,7 @@
)
#text(font: font-caption)[
#pad-zeros(m.cur_domain, 2) / #pad-zeros(m.total_domain, 2)
#pad_zeros(m.cur_domain, 2) / #pad_zeros(m.total_domain, 2)
]
#v(12pt)
@@ -410,6 +481,7 @@
#heading(level: 1)[
#name
]
#label(heading_text(name))
#block_quote()[
#hook
@@ -451,7 +523,7 @@
header: header_template(show_activity: true),
footer: footer_template(),
)[
#kicker("결")
#kicker("결")
#heading(level: 2)[
#title
@@ -460,6 +532,51 @@
#content
]
#let evidence() = context {
let cp = color-palette.get()
let ed = evidence-data.get()
page(
header: header_template(),
footer: footer_template(),
)[
#set heading(numbering: (..nums) => {
numbering("A", nums.at(1))
})
#show heading.where(level: 2): it => {
let num = counter(heading).display(
(..nums) => numbering("A", nums.at(1)),
)
block[
#num. #it.body
]
}
#show table.cell.where(x: 0): set text(
weight: 700,
fill: cp.accent,
)
#heading(level: 1, numbering: none)[
증빙 자료
]
#let cnt = ed.len()
#for (name, data) in ed [
#heading(level: 2, supplement: "evidence")[#name]
#label("Evidence) " + name)
#table(
columns: (10em, 1fr),
..data,
)
#{ cnt -= 1 }
#if cnt > 0 { pagebreak() }
]
]
}
// ==================================================
// Style Settings
@@ -515,11 +632,19 @@
set par(
leading: 1.2em,
spacing: 2.4em,
spacing: 1.8em,
)
show raw: set text(font: font-code)
show strong: set text(fill: cp.accent)
// underline config
set underline(
offset: 2pt,
stroke: (paint: cp.accent, thickness: 1pt),
)
// list config
show list: set par(leading: 0.8em)
set list(
@@ -536,6 +661,31 @@
spacing: 0.8em,
)
// image config
show image: set align(center)
show image: set par(
spacing: 1.6em,
)
// figure config
show figure: set text(
fill: color-ink-helper,
size: 10pt,
)
show figure.caption: it => {
"[ " + it.body + " ]"
}
// table config
show table: set text(size: 10pt)
set table(
inset: 0.8em,
align: left + top,
stroke: (paint: cp.rule),
)
// heading config
show heading.where(level: 1): set heading(numbering: (..nums) => (
str(cur_domain) + "." + nums.pos().map(str).join(".") + "."
@@ -595,9 +745,11 @@
fill: color-ink-secondary,
)
block(above: 20pt)[
#it
]
if it.element.supplement.text != "evidence" {
block(above: 20pt)[
#it
]
}
}
// render content