87 lines
1.9 KiB
Typst
87 lines
1.9 KiB
Typst
#let cnfont = ("Noto Sans CJK SC", "Noto Sans SC", "Source Han Sans CN")
|
|
#let cnmainfont = ("Noto Serif CJK SC", "Source Han Serif CN")
|
|
|
|
#let mtext(body) = text(font: cnmainfont, weight: "regular", body)
|
|
|
|
#let tab = h(2em)
|
|
#let halftab = h(1em)
|
|
|
|
#let footer_title = state("footer_title", "")
|
|
#let skip_footer = state("skip_footer", false)
|
|
|
|
#let thispage_number(loc) = {
|
|
let numberstarter = query(<PageNumberingStated>, before: loc)
|
|
if numberstarter == () {
|
|
none
|
|
} else {
|
|
loc.page() - numberstarter.first().location().page() + 1
|
|
}
|
|
}
|
|
|
|
#let problem_id = counter("pid")
|
|
|
|
#let project(title: "", logo: none, body) = {
|
|
set document(title: title)
|
|
set text(font: cnmainfont, lang: "zh")
|
|
set page(
|
|
width: 195mm,
|
|
height: 270mm,
|
|
margin: (top: 20mm)
|
|
)
|
|
|
|
show par: set block(above: 1.2em, below: 1.2em)
|
|
show heading: set text(font: cnfont, weight: "semibold")
|
|
set list(marker: (sym.square.filled.small, [--]), indent: .5em)
|
|
set ref(supplement: it => {
|
|
if it.func() == math.equation {
|
|
"式"
|
|
} else {
|
|
auto
|
|
}
|
|
})
|
|
|
|
set par(leading: 0.75em)
|
|
|
|
v(0.6fr)
|
|
if logo != none {
|
|
align(right, image(logo, width: 26%))
|
|
}
|
|
v(9.6fr)
|
|
|
|
text(4em, weight: "light", font: cnfont, title)
|
|
v(2.4fr)
|
|
|
|
pagebreak()
|
|
pagebreak()
|
|
|
|
outline(depth: 1)
|
|
[
|
|
#counter(page).update(1)
|
|
<PageNumberingStated>
|
|
#set page(footer: locate(loc => {
|
|
if skip_footer.at(loc) {
|
|
return
|
|
}
|
|
|
|
let thispage = thispage_number(loc)
|
|
let is_mainpart = query(<MainStarted>, before: loc) != ()
|
|
let is_mainpart = true
|
|
let footer_content = if is_mainpart {
|
|
[\##problem_id.at(loc).first() #footer_title.at(loc)]
|
|
}
|
|
|
|
let isleft = calc.even(thispage)
|
|
set align(left) if isleft
|
|
set align(right) if not isleft
|
|
if isleft { [#thispage] }
|
|
[ #halftab #underline(offset: 2pt, footer_content) #halftab ]
|
|
if not isleft { [#thispage] }
|
|
}))
|
|
|
|
// Main body.
|
|
#set par(justify: true)
|
|
#set text(15pt)
|
|
|
|
#body
|
|
]
|
|
} |