Files
liteauthdocs/PageTemplate.typ
T
2026-02-27 10:55:24 +07:00

241 lines
5.3 KiB
Typst

#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,
) <afig>
]
#let jb = linebreak(justify: true)