#let page-numbering(n) = { let chars = ("ก", "ข", "ค", "ง", "จ", "ฉ", "ช") if n <= chars.len() { chars.at(n - 1) } else { str(n - chars.len()) // fallback to numbers if exceeds available characters } } #let thai-numbering(n) = { let chars = ("ก", "ข", "ค", "ง", "จ", "ฉ", "ช", "ซ", "ฌ", "ญ") if n <= chars.len() { chars.at(n - 1) } else { str(n - chars.len()) // fallback to numbers if exceeds available characters } [)] } #let chapter-page(doc) = { set page( paper: "a4", margin: ( top: 2in, left: 1.5in, right: 1in, bottom: 1in, ), header: none, ) doc } /// Sane indentation #let i = h(3em) /// Insane shit forced upon by my teacher /// For indenting in 3rd level subheadings #let iii = h(4.1em) /// For indenting in 4th level subheadings #let iiii = h(7.55em) #let iiiii = h(13em) #let iiiiii = h(16.85em) #let listy( numbering: "1)", indent: 1em, hanging-indent: 0em, body-spacing: .3em, ..items, ) = context { let nums = range(1, items.pos().len() + 1) let fnums = nums.map(std.numbering.with(numbering)) let numwidth = calc.max(..fnums.map(it => measure(it).width)) for (num, item) in fnums.zip(items.pos()) { block(inset: (left: hanging-indent), { h(indent - hanging-indent) box(width: numwidth + body-spacing, stroke: none, num) item }) v(1em, weak: true) } } #let page-theme(doc, has-header: true) = { set page( paper: "a4", margin: ( top: 1.5in, left: 1.5in, right: 1in, bottom: 1in, ), header: if has-header { context [ #h(1fr) #counter(page).display(page-numbering) ] }, ) set text( lang: "th", font: "Laksaman", size: 10.5pt, ) set par( justify: true, justification-limits: ( tracking: (min: -1pt, max: 3pt), ), leading: 1em, ) set list(indent: 1em) show raw.where(block: false): set text(font: "Laksaman", size: 10.5pt) show raw.where(block: true): set block( fill: rgb("#282A36"), stroke: black + 2pt, inset: 1.5em, ) show raw.where(block: true): set raw(theme: "Dracula.tmTheme") show raw.where(block: true): set text( fill: rgb("#F8F8F2"), font: "Cascadia Code", size: 10pt, ) show heading: set text(size: 10.5pt, weight: "regular") show heading: set block(below: 1em) show heading.where(level: 1): set text(size: 12pt, weight: "bold") show heading.where(level: 1): set align(center) show heading.where(level: 1): set block(below: 2em) show heading.where(level: 2): set block(above: 2em) show heading.where(level: 2): set text(weight: "bold") show math.equation: set text(font: "Laksaman") show table.cell.where(y: 0): strong show figure.where(kind: "i-figured-table"): set align(start) show figure.where(kind: table): set figure.caption(position: top) show figure.where(kind: table): t => { show figure.caption: it => { it.supplement " " it.counter.display(it.numbering) " " it.body } it } show figure.where(kind: "i-figured-image"): i => { show figure.caption: it => { place( center, [ #text(weight: "bold")[ #it.supplement #it.counter.display(it.numbering) ] #it.body ], dy: 2em, ) } show image: it => { block(stroke: black + 2pt, it) } i } set figure.caption(separator: " ") show figure.where(kind: image): set block(below: 2.5em) set enum(number-align: start + top) show enum.item: it => context { if (it.number == auto) { return it } let spacing = enum.indent if spacing == auto { if enum.tight { spacing = par.leading } else { spacing = par.spacing } } ( h(spacing) + [#{ str(it.number) + ")" }] + h(enum.body-indent) + it.body + linebreak() ) } set ref(supplement: "หัวข้อ") doc } #let fake-h1(body) = { align(center, text(body, weight: "bold", size: 12pt)) } #let sane-theme(doc) = { set page( paper: "a4", margin: ( top: 1.5in, left: 1.5in, right: 1in, bottom: 1in, ), header: context [ #h(1fr) #counter(page).display(page-numbering) ], ) set text( lang: "th", font: "Laksaman", size: 10.5pt, ) set par( justify: true, justification-limits: ( tracking: (min: -1pt, max: 3pt), ), leading: 1em, ) set list(indent: 1em) show raw: set text(font: "Cascadia Code") show heading: set text(size: 10.5pt) show heading: set block(below: 1em) show heading.where(level: 1): set text(size: 12pt, weight: "bold") show heading.where(level: 2): set text(weight: "bold") show math.equation: set text(font: "Laksaman") show table.cell.where(y: 0): strong show figure.caption: it => { text(weight: "bold")[ #it.supplement #it.counter.display(it.numbering) #it.separator ] it.body } set figure.caption(separator: "") set enum(number-align: start + top) set ref(supplement: "หัวข้อ") doc } // Figure with attribution information #let afigure( body, attr: none, ..args, ) = [ #figure(body, ..args) #box( hide(attr), width: 0pt, height: 0pt, ) ] #let jb = linebreak(justify: true)