#import "@preview/showybox:2.0.4": showybox
#import "@preview/wordometer:0.1.5": total-words, word-count
#import "@preview/nerd-icons:0.2.0": nf-icon
#import "@preview/itemize:0.2.0" as el
#let qst-counter = counter("qst")
#let theme-color = rgb("#dadada")
#let def-style(body) = {
show: el.default-enum-list
qst-counter.update(1)
show heading.where(depth: 1): it => {
set align(center)
set text(15pt)
strong(it)
v(0.5em)
}
set text(font: ("Latin Modern Roman 9", "FZFangSong-Z02S"), 11pt)
set par(first-line-indent: (all: true, amount: 1em), justify: true)
body
}
#let mean(body) = {
h(0.1em)
text(0.9em)[(#body)]
h(0.1em)
}
#let psg(head, body, time: [8 min], level: "medium", bar: true) = {
let lables(icon, name, body) = {
[#box(pad(icon, bottom: 0.05em)) #text(font: "FZHei-B01S", name) #body]
}
show: word-count.with(exclude: (heading.where(level: 1), mean))
word-count(total => [
#heading(depth: 1, head)
#if bar == true {
showybox(
frame: (
border-color: theme-color,
body-color: theme-color,
radius: 1pt,
inset: (x: 0.5em, y: 0.3em),
),
{
h(0.5fr)
lables(nf-icon("fountain_pen"), [词数:], total.words)
h(1fr)
lables(nf-icon("clock_time_two_outline"), [建议用时:], time)
h(1fr)
lables(nf-icon("line_chart"), [难度:], level)
h(0.5fr)
},
)
}
#body
])
}
#let qst(Q, A, B, C, D) = {
set par(first-line-indent: 0em, spacing: 1em)
text(11.5pt)[#text(font: "Latin Modern Sans 8", [#context qst-counter.display().])#h(0.5em)#Q]
layout(size => [
#let get-width(body) = {
return measure(height: size.height, body+ "D. ").width // "D" means any *l*etter
}
#let get-layout() = {
let wa=get-width(A)
let wb=get-width(B)
let wc=get-width(C)
let wd=get-width(D)
let one-em = measure(height: size.height, h(1em)).width
for w in (wa,wb,wc,wd) {
if w >= ((size.width - one-em) / 6) {
break
} else { return "T1" /* Type 1 */ }
}
if wa+wb+one-em <= size.width and wc+wd+one-em <= size.width {
return "T2"
} else { return "T3" }
}
#let l = get-layout()
#if l == "T1" {
table(
[], "A. "+A , "B. "+B , "C. "+C , "D. "+D,
columns: (1em,1fr,1fr,1fr,1fr),
stroke: none, inset: 0pt,
column-gutter: 0pt,
align: left
)
} else if l== "T2" {
pad(
table(
columns: 3,
inset: 0em,
[A. #A], [B. #B], [],
[C. #C], [D. #D], [],
stroke: none,
column-gutter: 1fr,
row-gutter: 1em,
),
left: 1em,
)
} else if l=="T3" [
#set par(first-line-indent: (all: true, amount: 1em))
A. #A
B. #B
C. #C
D. #D
]
])
qst-counter.step()
}
使用:
- 使用psg(title, body)来排版文章主体,使用bar: false可以关闭文章标题下方的的信息栏;使用qst(question, opt1,opt2,opt3,opt4)排版一个题目,题目序号会自动累加,如有需要可手动使qst-counter归零。
- 在英语单词后使用mean函数来注明这个单词的意思,如不使用该函数其文本会计入字数统计。
- 使用#show: def-style来使用默认样式。