From 1385bc7ea1c4f54eb178d6831185e8e820e82671 Mon Sep 17 00:00:00 2001
From: gbchu <57310768+gbchu@users.noreply.github.com>
Date: Tue, 23 Sep 2025 15:21:57 +0800
Subject: [PATCH 01/37] [Typship] Add ezexam.typ
---
packages/preview/ezexam/0.1.9/ezexam.typ | 255 +++++++++++++++++++++++
1 file changed, 255 insertions(+)
create mode 100644 packages/preview/ezexam/0.1.9/ezexam.typ
diff --git a/packages/preview/ezexam/0.1.9/ezexam.typ b/packages/preview/ezexam/0.1.9/ezexam.typ
new file mode 100644
index 0000000000..3db96cf5fa
--- /dev/null
+++ b/packages/preview/ezexam/0.1.9/ezexam.typ
@@ -0,0 +1,255 @@
+#import "lib/tools.typ": *
+#import "lib/outline.typ": *
+#import "lib/choice.typ": *
+#import "lib/question.typ": answer, fillin, fillinn, paren, parenn, question, score, solution, text-figure
+
+#let setup(
+ mode: HANDOUTS,
+ paper: a4,
+ page-numbering: auto,
+ page-align: center,
+ gap: 1in,
+ show-gap-line: false,
+ footer-is-separate: true,
+ outline-page-numbering: "⚜ I ⚜",
+ font-size: 11pt,
+ font: source-han,
+ font-math: source-han,
+ line-height: 2em,
+ par-spacing: 2em,
+ first-line-indent: 0em,
+ heading-numbering: auto,
+ heading-hanging-indent: auto,
+ h1-size: auto,
+ heading-font: hei-ti,
+ heading-color: luma(0%),
+ heading-top: 10pt,
+ heading-bottom: 15pt,
+ enum-numbering: "(1.i.a)",
+ enum-spacing: 2em,
+ enum-indent: 0pt,
+ watermark: none,
+ watermark-color: rgb("#f666"),
+ watermark-font: source-han,
+ watermark-size: 88pt,
+ watermark-rotate: -45deg,
+ show-answer: false,
+ answer-color: blue,
+ show-seal-line: true,
+ seal-line-student-info: (
+ 姓名: underline[~~~~~~~~~~~~~],
+ 准考证号: table(
+ columns: 14,
+ inset: .8em,
+ [],
+ ),
+ 考场号: table(
+ columns: 2,
+ inset: .8em,
+ [],
+ ),
+ 座位号: table(
+ columns: 2,
+ inset: .8em,
+ [],
+ ),
+ ),
+ seal-line-type: "dashed",
+ seal-line-supplement: "弥封线内不得答题",
+ doc,
+) = {
+ assert(mode in (HANDOUTS, EXAM, SOLUTION), message: "mode must be HANDOUTS or EXAM or SOLUTION")
+ mode-state.update(mode)
+ let _footer(label) = context {
+ assert(
+ type(label) in (str, function, none) or label == auto,
+ message: "expected str or function or none or auto, found " + str(type(label)),
+ )
+ if label == none { return }
+ let _label = label
+ if label == auto {
+ if mode == HANDOUTS {
+ _label = "1 ✏ 1"
+ } else {
+ let _prefix = [#subject-state.get()试题#if mode == SOLUTION [答案]]
+ _label = zh-arabic(prefix: _prefix)
+ }
+ }
+ // 如果传进来的label包含两个1,两个1中间不能是连续空格、包含数字
+ // 支持双:阿拉伯数字、小写、大写罗马,带圈数字页码
+ let reg-1 = "^[\D]*1[\D]*[^\d\s]+[\D]*1[\D]*$"
+ let reg-i = reg-1.replace("1", "i")
+ let reg-I = reg-1.replace("1", "I")
+ let reg-circled-number = reg-1.replace("1", "①")
+ let reg-circled-number2 = reg-1.replace("1", "⓵")
+ let reg = reg-1 + "|" + reg-i + "|" + reg-I + "|" + reg-circled-number + "|" + reg-circled-number2
+
+ let current = counter(page).get()
+ if (type(_label) == str and regex(reg) in _label) or (type(_label) == function) {
+ current += counter(page).final()
+ }
+
+ let _numbering = numbering(_label, ..current)
+
+ // 处于分栏下且左右页脚分离
+ if page.columns == 2 and footer-is-separate {
+ current.at(0) += 1
+ grid(
+ columns: (1fr, 1fr),
+ align: center + horizon,
+ // 左页码
+ _numbering,
+ // 右页码
+ numbering(_label, ..current),
+ )
+ counter(page).step()
+ return
+ }
+
+ // 页面的页脚是未分离, 则让奇数页在右侧,偶数页在左侧
+ let position = page-align
+ if not footer-is-separate {
+ if calc.odd(current.first()) {
+ position = right
+ } else {
+ position = left
+ }
+ }
+ align(position, _numbering)
+ }
+ let _header(
+ student-info: seal-line-student-info,
+ line-type: seal-line-type,
+ supplement: seal-line-supplement,
+ ) = context {
+ if mode != EXAM or not show-seal-line { return }
+ // 根据页码决定是否显示弥封线
+ // 如果当前页面有
,则显示弥封线,并在该章节最后一页的右侧也设置弥封线
+ let chapter-location = for value in query() {
+ counter(page).at(value.location())
+ }
+
+ if chapter-location == none or chapter-location.len() == 0 { return }
+ let current = counter(page).get().first()
+ let last = counter(page).final()
+
+ // 获取上一章最后一页的页码,给最后一页加上弥封线
+ let chapter-last-page-location = chapter-location.map(item => item - 1) + last
+ if page.columns == 2 and footer-is-separate {
+ chapter-last-page-location = chapter-location.map(item => item - 2) + (last.first() - 1,)
+ }
+
+ // 去除第一章,因为第一章前面没有章节了
+ let _ = chapter-last-page-location.remove(0)
+
+ let _margin-y = page.margin * 2
+ let _width = page.height - _margin-y
+ if page.flipped { _width = page.width - _margin-y }
+ block(width: _width)[
+ // 判断当前是在当前章节第一页还是章节最后一页
+ //当前章节第一页弥封线
+ #if chapter-location.contains(current) {
+ place(
+ dx: -_width - 1em,
+ dy: -2em,
+ )[
+ #rotate(-90deg, origin: right + bottom)[
+ #_create-seal(dash: line-type, info: student-info, supplement: supplement)
+ ]
+ ]
+ return
+ }
+
+ #if (chapter-last-page-location).contains(current) {
+ _width = if page.flipped {
+ page.height
+ } else { page.width }
+ // 章节最后页的弥封线
+ place(dx: _width - page.margin - 2em, dy: 2em)[
+ #rotate(90deg, origin: left + top, _create-seal(dash: line-type, supplement: supplement))
+ ]
+ }
+ ]
+ }
+ let _background() = {
+ if paper.columns == 2 and show-gap-line {
+ line(angle: 90deg, length: 100% - paper.margin * 2, stroke: .5pt)
+ }
+ }
+ let _foreground() = {
+ if watermark == none { return }
+ set text(size: watermark-size, watermark-color)
+ set par(leading: .5em)
+ place(horizon)[
+ #grid(
+ columns: paper.columns * (1fr,),
+ ..paper.columns * (rotate(watermark-rotate, watermark),),
+ )
+ ]
+ }
+ set page(
+ ..paper,
+ header: _header(),
+ footer: _footer(page-numbering),
+ background: _background(),
+ foreground: _foreground(),
+ )
+ set columns(gutter: gap)
+
+ set outline(
+ target: if mode == EXAM { } else { heading },
+ title: text(size: 15pt)[目#h(1em)录],
+ )
+ show outline: it => {
+ set page(header: none, footer: _footer(outline-page-numbering))
+ align(center, it)
+ pagebreak(weak: true)
+ counter(page).update(1) // 正文页码从1开始
+ }
+
+ set par(leading: line-height, spacing: par-spacing, first-line-indent: (amount: first-line-indent, all: true))
+ set text(font: font, size: font-size)
+
+ if heading-numbering == auto {
+ if mode in (EXAM, SOLUTION) {
+ heading-numbering = "一、"
+ heading-hanging-indent = 2.3em
+ } else { heading-numbering = "1.1.1" }
+ }
+ set heading(numbering: heading-numbering, hanging-indent: heading-hanging-indent)
+ show heading: it => {
+ v(heading-top)
+ text(heading-color, font: heading-font, it)
+ v(heading-bottom)
+ }
+
+ show heading.where(level: 1): it => {
+ let size = h1-size
+ if size == auto {
+ if mode == HANDOUTS { size = text.size } else { size = 10.5pt }
+ }
+ text(size: size, it)
+ }
+ set enum(numbering: enum-numbering, spacing: enum-spacing, indent: enum-indent)
+ set table(stroke: .5pt, align: center)
+ set table.cell(align: horizon)
+
+ // 分段函数样式
+ set math.cases(gap: 1em)
+ // 显示方程编号
+ set math.equation(numbering: "(1)", supplement: [Eq -]) if mode == HANDOUTS
+ show math.equation: it => {
+ // features: 一些特殊符号的设置,如空集符号设置更加漂亮
+ set text(font: font-math, features: ("cv01",))
+ // 1. 行内样式默认块级显示样式; 2. 添加数学符号和中文之间间距
+ let space = h(.25em, weak: true)
+ space + math.display(it) + space
+ }
+
+ if show-answer {
+ answer-state.update(true)
+ answer-color-state.update(answer-color)
+ }
+
+ doc
+}
From ac55222d3c0fc03dff6ace4608962e436b89676c Mon Sep 17 00:00:00 2001
From: gbchu <57310768+gbchu@users.noreply.github.com>
Date: Tue, 23 Sep 2025 15:21:59 +0800
Subject: [PATCH 02/37] [Typship] Add lib\choice.typ
---
packages/preview/ezexam/0.1.9/lib/choice.typ | 74 ++++++++++++++++++++
1 file changed, 74 insertions(+)
create mode 100644 packages/preview/ezexam/0.1.9/lib/choice.typ
diff --git a/packages/preview/ezexam/0.1.9/lib/choice.typ b/packages/preview/ezexam/0.1.9/lib/choice.typ
new file mode 100644
index 0000000000..42b4150fc1
--- /dev/null
+++ b/packages/preview/ezexam/0.1.9/lib/choice.typ
@@ -0,0 +1,74 @@
+#let choices(
+ columns: auto,
+ c-gap: 0pt,
+ r-gap: 25pt,
+ indent: 0pt,
+ body-indent: 5pt,
+ top: 0pt,
+ bottom: 0pt,
+ label: "A.",
+ ..options,
+) = layout(container => {
+ // 使用layout获取当前父元素的宽度
+ let args-named = options.named()
+ assert(args-named.len() == 0, message: "choices no " + repr(args-named) + " parameters")
+
+ let arr = options.pos()
+ let choice-number = arr.len()
+ assert(choice-number > 0, message: "choices must have at least one option")
+
+ let max-width = 0pt
+ // 拼接选项并添加标签和间距;获取选项中最长的宽度
+ for index in range(choice-number) {
+ // 加[] 是为了将内容转为content,有可能在使用时直接传入整数
+ let choice = [#arr.at(index)]
+ let _choice-width = 0pt
+ // 选项为图片、表格的处理
+ if choice.func() in (image, table) {
+ // 当选项为图片时,设置百分比宽度使用mesure获取宽度时为0pt, 设置百分比宽度的处理
+ if choice.has("width") and choice.width.length == 0pt {
+ _choice-width = choice.width.ratio * container.width
+ }
+ arr.at(index) = grid(
+ columns: 2,
+ pad(left: indent, numbering(label, index + 1)), pad(left: body-indent, choice),
+ )
+ } else {
+ arr.at(index) = par(
+ hanging-indent: 1.5em,
+ h(indent) + numbering(label, index + 1) + h(body-indent) + choice,
+ )
+ }
+
+ if columns != auto { continue }
+ _choice-width += measure(arr.at(index)).width
+ max-width = calc.max(max-width, _choice-width)
+ }
+
+ let _columns = columns
+ // 如果未指定列数,则自动排列,默认4列
+ if columns == auto {
+ _columns = 4
+ let actual-occupied-width = max-width + c-gap
+ // 排成1行,选项之间的间距
+ let choice-gap = container.width / choice-number - actual-occupied-width
+ let min-gap = 0.15in
+ if choice-gap < min-gap {
+ _columns = 2
+ // 排成2行,选项之间的间距
+ choice-gap = choice-gap * 2 + actual-occupied-width
+ if choice-gap < min-gap { _columns = 1 }
+ }
+ }
+
+ v(top)
+ grid(
+ columns: _columns * (1fr,),
+ column-gutter: c-gap,
+ row-gutter: r-gap,
+ align: horizon,
+ ..arr
+ )
+ v(bottom)
+})
+
From 6c8776613362edbf91ba82a751b65b4ccf75d12f Mon Sep 17 00:00:00 2001
From: gbchu <57310768+gbchu@users.noreply.github.com>
Date: Tue, 23 Sep 2025 15:22:00 +0800
Subject: [PATCH 03/37] [Typship] Add lib\const-state.typ
---
.../preview/ezexam/0.1.9/lib/const-state.typ | 27 +++++++++++++++++++
1 file changed, 27 insertions(+)
create mode 100644 packages/preview/ezexam/0.1.9/lib/const-state.typ
diff --git a/packages/preview/ezexam/0.1.9/lib/const-state.typ b/packages/preview/ezexam/0.1.9/lib/const-state.typ
new file mode 100644
index 0000000000..cf465d70c7
--- /dev/null
+++ b/packages/preview/ezexam/0.1.9/lib/const-state.typ
@@ -0,0 +1,27 @@
+#let a3 = (
+ paper: "a3",
+ margin: 1in,
+ columns: 2,
+ flipped: true,
+)
+#let a4 = (
+ paper: "a4",
+ margin: 1in,
+ columns: 1,
+ flipped: false,
+)
+
+#let NCMM = "New Computer Modern Math"
+#let source-han = (NCMM, "Source Han Serif", "SimSun")
+#let hei-ti = (NCMM, "SimHei")
+#let kai-ti = (NCMM, "KaiTi")
+
+//"exam": 试卷模式; "handouts": 讲义模式(默认);"solution":解析模式
+#let EXAM = "exam"
+#let HANDOUTS = "handouts"
+#let SOLUTION = "solution"
+
+#let mode-state = state("mode", HANDOUTS)
+#let answer-state = state("answer", false)
+#let answer-color-state = state("answer-color", blue)
+#let subject-state = state("subject", "")
\ No newline at end of file
From 32d72b0a6742fbc6c43897d78f2350faa047cc7a Mon Sep 17 00:00:00 2001
From: gbchu <57310768+gbchu@users.noreply.github.com>
Date: Tue, 23 Sep 2025 15:22:01 +0800
Subject: [PATCH 04/37] [Typship] Add lib\outline.typ
---
packages/preview/ezexam/0.1.9/lib/outline.typ | 132 ++++++++++++++++++
1 file changed, 132 insertions(+)
create mode 100644 packages/preview/ezexam/0.1.9/lib/outline.typ
diff --git a/packages/preview/ezexam/0.1.9/lib/outline.typ b/packages/preview/ezexam/0.1.9/lib/outline.typ
new file mode 100644
index 0000000000..c05e6eaf94
--- /dev/null
+++ b/packages/preview/ezexam/0.1.9/lib/outline.typ
@@ -0,0 +1,132 @@
+#import "const-state.typ": *
+
+#let chapter(body) = {
+ pagebreak(weak: true)
+ counter("chapter").step()
+ set heading(numbering: _ => counter("chapter").display("一、"))
+ place(top, hide[= #body ])
+}
+
+#let title(
+ body,
+ size: 15pt,
+ weight: "bold",
+ font: source-han,
+ color: black,
+ position: center,
+ top: 0pt,
+ bottom: 18pt,
+) = {
+ v(top)
+ align(position, text(font: font, size, weight: weight, color)[#body ])
+ v(bottom)
+ counter(heading).update(0)
+ counter("question").update(0)
+}
+
+#let subject(body, size: 21.5pt, spacing: 1em, font: hei-ti, top: -20pt, bottom: 0pt) = {
+ v(top)
+ align(center, text(
+ font: font,
+ size: size,
+ body.text.split("").slice(1, -1).join(h(spacing)),
+ ))
+ v(bottom)
+ subject-state.update(body.text)
+}
+
+#let secret(body: [绝密★启用前]) = place(top, float: true, clearance: 20pt, text(font: "SimHei", body))
+
+#let exam-type(type, prefix: "试卷类型: ") = place(top + right, text(
+ font: hei-ti,
+)[#prefix#type])
+
+#let exam-info(
+ info: (
+ 时间: "120分钟",
+ 满分: "150分",
+ ),
+ weight: 500,
+ font: hei-ti,
+ size: 11pt,
+ gap: 2em,
+ top: 0pt,
+ bottom: 0pt,
+) = {
+ assert(info.len() > 0, message: "info cannot be empty")
+ set align(center)
+ grid(
+ columns: info.len(),
+ gutter: gap,
+ inset: (top: top, bottom: bottom),
+ align: center + horizon,
+ ..for (key, value) in info {
+ (text(size: size, font: font, weight: weight)[#key: #value],)
+ }
+ )
+}
+
+#let scoring-box(x: 0pt, y: 0pt) = place(dx: x, dy: y, right + top)[
+ #table(
+ columns: (auto, 1.6cm),
+ inset: 8pt,
+ )[得分][][阅卷人]
+]
+
+#let score-box(x: 0pt, y: 0pt) = place(dx: x, dy: y, right + top)[
+ #table(
+ rows: (auto, 1.2cm),
+ inset: 8pt,
+ )[得分][#h(3em)]
+]
+
+#let notice(format: "1.", indent: 2em, hanging-indent: auto, ..children) = context {
+ text(font: hei-ti)[注意事项:]
+ set enum(numbering: format, indent: indent)
+ set par(hanging-indent: if hanging-indent == auto {
+ -indent - enum.body-indent - measure(format).width
+ } else { hanging-indent })
+ for value in children.pos() [+ #par(value)]
+}
+
+#let _create-seal(
+ dash: "dashed",
+ supplement: "",
+ info: (:),
+) = {
+ assert(type(info) == dictionary, message: "expected dictionary, found " + str(type(info)))
+ set par(spacing: 10pt)
+ set text(font: hei-ti, size: 12pt)
+ set align(center)
+ set grid(columns: 2, align: horizon, gutter: .5em)
+ if supplement != "" { text(tracking: .8in, supplement) }
+ grid(
+ columns: if info.len() == 0 { 1 } else { info.len() },
+ gutter: 1em,
+ ..for (key, value) in info {
+ (
+ grid(
+ key,
+ value,
+ ),
+ )
+ }
+ )
+ line(length: 100%, stroke: (dash: dash))
+}
+
+#let draft(
+ name: "草稿纸",
+ student-info: (
+ 姓名: underline[~~~~~~~~~~~~~],
+ 准考证号: underline[~~~~~~~~~~~~~~~~~~~~~~~~~~],
+ 考场号: underline[~~~~~~~],
+ 座位号: underline[~~~~~~~],
+ ),
+ dash: "solid",
+ supplement: "",
+) = {
+ set page(margin: .5in, header: none, footer: none)
+ title(name.split("").join(h(1em)), bottom: 0pt)
+ _create-seal(dash: dash, supplement: supplement, info: student-info)
+}
From 80479b516490065d4192a9e441afa749542dae11 Mon Sep 17 00:00:00 2001
From: gbchu <57310768+gbchu@users.noreply.github.com>
Date: Tue, 23 Sep 2025 15:22:01 +0800
Subject: [PATCH 05/37] [Typship] Add lib\question.typ
---
.../preview/ezexam/0.1.9/lib/question.typ | 208 ++++++++++++++++++
1 file changed, 208 insertions(+)
create mode 100644 packages/preview/ezexam/0.1.9/lib/question.typ
diff --git a/packages/preview/ezexam/0.1.9/lib/question.typ b/packages/preview/ezexam/0.1.9/lib/question.typ
new file mode 100644
index 0000000000..f47b2effaf
--- /dev/null
+++ b/packages/preview/ezexam/0.1.9/lib/question.typ
@@ -0,0 +1,208 @@
+#import "const-state.typ": HANDOUTS, answer-color-state, answer-state, mode-state
+
+#let question(
+ body,
+ body-indent: .7em,
+ indent: 0pt,
+ label: auto,
+ label-color: black,
+ label-weight: "regular",
+ with-heading-label: false,
+ points: none,
+ points-separate: true,
+ points-prefix: "(",
+ points-suffix: "分)",
+ top: 0pt,
+ bottom: 0pt,
+ padding-top: 0pt,
+ padding-bottom: 0pt,
+) = {
+ // 分数设置
+ assert(type(points) == int or points == none, message: "points must be a int or none")
+ if points != none {
+ body = [#points-prefix#points#points-suffix #if points-separate [ \ ] #body]
+ }
+
+ // 格式化题号
+ counter("question").step()
+ let _format = context counter("question").display(num => {
+ let _label = label
+ if label == auto {
+ if mode-state.get() == HANDOUTS {
+ _label = "【1.1.1.1.1.1】"
+ } else {
+ _label = "1."
+ }
+ }
+
+ let _counter = counter("placeholder")
+ if _counter.get().first() < num {
+ _counter.step()
+ }
+
+ let arr = (num,)
+ if with-heading-label {
+ // 去除heading label数组中的0
+ arr = counter(heading).get().filter(item => item != 0) + arr
+ }
+ text(
+ label-color,
+ weight: label-weight,
+ box(
+ align(right, numbering(_label, ..arr)),
+ width: 1.45em,
+ ),
+ )
+ })
+
+ v(top - padding-top)
+ list(
+ marker: _format,
+ body-indent: body-indent,
+ indent: indent,
+ pad(top: padding-top, bottom: padding-bottom, body),
+ )
+ v(bottom)
+}
+
+#let _get-answer(body, placeholder, with-number, update) = context {
+ if answer-state.get() {
+ return text(answer-color-state.get(), body)
+ }
+
+ if not with-number { return placeholder }
+
+ counter("placeholder").step()
+ context counter("placeholder").display()
+ if update { counter("question").step() }
+}
+
+// 选项的括号
+#let paren(
+ body,
+ justify: false,
+ placeholder: "▴",
+ with-number: false,
+ update: false,
+) = {
+ let body = _get-answer(body, placeholder, with-number, update)
+ [#if justify { h(1fr) } (~~#upper(body)~~)]
+}
+
+// 填空的横线
+#let fillin(
+ body,
+ length: 1em,
+ placeholder: "▴",
+ with-number: false,
+ update: false,
+) = {
+ let body = _get-answer(body, placeholder, with-number, update)
+ let space = h(length)
+ $underline(#space#body#space)$
+}
+
+// 类似英文中的7选5题型专用语法糖
+#let parenn = paren.with(with-number: true, update: true)
+#let fillinn = fillin.with(with-number: true, update: true)
+
+// 图文混排(左文右图)
+#let text-figure(
+ figure: none,
+ figure-x: 0pt,
+ figure-y: 0pt,
+ style: "tf",
+ top: 0pt,
+ bottom: 0pt,
+ text,
+) = {
+ assert(figure.func() in (image, table), message: "figure must be a image or table")
+ assert(style == "tf" or style == "ft", message: "style must be 'tf' or 'ft'")
+
+ let body = (text, move(dx: figure-x, dy: figure-y)[#figure])
+ if style == "ft" { body = body.rev() }
+ grid(
+ columns: 2,
+ align: horizon,
+ inset: (
+ top: top,
+ bottom: bottom,
+ ),
+ ..body,
+ )
+}
+
+#let solution(
+ body,
+ title: none,
+ title-size: 12pt,
+ title-weight: "bold",
+ title-color: luma(100%),
+ title-bg-color: maroon,
+ title-radius: 5pt,
+ title-align: top + center,
+ title-x: 0pt,
+ title-y: 0pt,
+ border-style: "dashed",
+ border-width: .5pt,
+ border-color: maroon,
+ color: blue,
+ radius: 5pt,
+ bg-color: luma(100%),
+ breakable: true,
+ top: 0pt,
+ bottom: 0pt,
+ padding-top: 0pt,
+ padding-bottom: 0pt,
+ inset: (rest: 10pt, top: 20pt, bottom: 20pt),
+ show-number: true,
+) = context {
+ if not answer-state.get() { return }
+ assert(type(inset) == dictionary, message: "inset must be a dictionary")
+ let _inset = (rest: 10pt, top: 20pt, bottom: 20pt) + inset
+ v(top)
+ block(
+ width: 100%,
+ breakable: breakable,
+ inset: _inset,
+ radius: radius,
+ stroke: (thickness: border-width, paint: border-color, dash: border-style),
+ fill: bg-color,
+ )[
+ // 标题
+ #if title != none {
+ let title-box = box(fill: title-bg-color, inset: 6pt, radius: title-radius, text(
+ size: title-size,
+ weight: title-weight,
+ tracking: 3pt,
+ title-color,
+ title,
+ ))
+ let _title-height = measure(title-box).height
+ place(
+ title-align,
+ dx: title-x,
+ dy: -_inset.top - _title-height / 2 + title-y,
+ )[#title-box]
+ }
+
+ // 解析题号的格式化
+ #counter("explain").step()
+ #let format(..item) = context () => {
+ numbering("1.", ..counter("explain").get())
+ }
+
+ #list(
+ marker: if show-number { format } else { none },
+ pad(top: padding-top, bottom: padding-bottom, text(color, body)),
+ )
+ ]
+ v(bottom)
+}
+
+// 解析的分值
+#let score(points, color: maroon, score-prefix: "", score-suffix: "分") = text(color)[
+ #box(width: 1fr, repeat($dot$))#score-prefix#points#score-suffix
+]
+
+#let answer(body, color: maroon) = par(text(weight: 700, color)[答案: #body])
From 3033164490ecbb1736be405e1e08a0e38c5a1103 Mon Sep 17 00:00:00 2001
From: gbchu <57310768+gbchu@users.noreply.github.com>
Date: Tue, 23 Sep 2025 15:22:02 +0800
Subject: [PATCH 06/37] [Typship] Add lib\tools.typ
---
packages/preview/ezexam/0.1.9/lib/tools.typ | 23 +++++++++++++++++++++
1 file changed, 23 insertions(+)
create mode 100644 packages/preview/ezexam/0.1.9/lib/tools.typ
diff --git a/packages/preview/ezexam/0.1.9/lib/tools.typ b/packages/preview/ezexam/0.1.9/lib/tools.typ
new file mode 100644
index 0000000000..5fd754bb9d
--- /dev/null
+++ b/packages/preview/ezexam/0.1.9/lib/tools.typ
@@ -0,0 +1,23 @@
+#import "const-state.typ": subject-state, kai-ti
+// 一种页码格式: "第x页(共xx页)
+#let zh-arabic(prefix: "", suffix: "") = (..nums) => {
+ let arr = nums.pos()
+ [#prefix 第#str(arr.at(0))页(共#str(arr.at(-1))页)#suffix]
+}
+
+#let multi = text(maroon)[(多选)]
+
+#let color-box(body, color: blue, dash: "dotted", radius: 3pt) = {
+ box(
+ outset: .35em,
+ radius: radius,
+ stroke: (
+ thickness: .5pt,
+ dash: dash,
+ paint: color,
+ ),
+ text(font: kai-ti, color, body),
+ )
+ h(.8em)
+}
+
From da8634ac1b1d8dd4b7914fde35ba42b19f75b192 Mon Sep 17 00:00:00 2001
From: gbchu <57310768+gbchu@users.noreply.github.com>
Date: Tue, 23 Sep 2025 15:22:03 +0800
Subject: [PATCH 07/37] [Typship] Add LICENSE
---
packages/preview/ezexam/0.1.9/LICENSE | 21 +++++++++++++++++++++
1 file changed, 21 insertions(+)
create mode 100644 packages/preview/ezexam/0.1.9/LICENSE
diff --git a/packages/preview/ezexam/0.1.9/LICENSE b/packages/preview/ezexam/0.1.9/LICENSE
new file mode 100644
index 0000000000..aa8cb8bfc4
--- /dev/null
+++ b/packages/preview/ezexam/0.1.9/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2025 gbchu
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
From ae22763c5f261ec767272b2c32c1c971dc655edf Mon Sep 17 00:00:00 2001
From: gbchu <57310768+gbchu@users.noreply.github.com>
Date: Tue, 23 Sep 2025 15:22:05 +0800
Subject: [PATCH 08/37] [Typship] Add README.md
---
packages/preview/ezexam/0.1.9/README.md | 59 +++++++++++++++++++++++++
1 file changed, 59 insertions(+)
create mode 100644 packages/preview/ezexam/0.1.9/README.md
diff --git a/packages/preview/ezexam/0.1.9/README.md b/packages/preview/ezexam/0.1.9/README.md
new file mode 100644
index 0000000000..d49ec3c71c
--- /dev/null
+++ b/packages/preview/ezexam/0.1.9/README.md
@@ -0,0 +1,59 @@
+# `ezexam`
+## 简介
+此模板可方便中国的小学、初中、高中教师或学生排版试卷或讲义
+
+[在线文档](https://ezexam.pages.dev/)
+
+
+## 更新日志
+### 0 . 1 . 0
++ 初版发布
+
+### 0 . 1 . 1
++ 修复 `choices` 方法中,若选项为图片时,设置宽度为百分比时,图片宽度无效的问题
+
+### 0 . 1 . 2
++ 将 `secret` 修改为方法,可以自定义显示内容
++ 优化 `choices` 方法,当选项过长时,选项从第二行开始进行缩进。修复选项中既有文字又有图表时,标签和内容对不齐的问题
++ 将 `question` 方法的参数 `with-heading-label` 的默认值修改为 `false`
++ `explain` 方法新增参数 `show-number` 、修改参数 `title` 的默认值为 `none`,默认不显示
++ `setup` 方法新增参数 `enum-numbering`
+
+### 0 . 1 . 3
++ 优化 `choices` 方法
++ 将 `question` 方法的参数名 `points-separate-par` 修改为 `points-separate`
++ 增加英文完型填空、7选5题型的支持,让 `paren` 和 `fillin` 方法可以使用题号作为占位符。使用详情查看 [`paren`](https://ezexam.pages.dev/paren) 和 [`fillin`](https://ezexam.pages.dev/fillin) 方法
++ `setup` 方法新增参数 `heading-numbering`,`heading-hanging-indent`,`enum-spacing`,`enum-indent` 提供更多自定义设置
++ 修复 `question` 个数超过9个时,内容对不齐的问题
+
+### 0 . 1 . 4
++ 将 `LECTURE` 修改为 `HANDOUTS`,更加符合语义
++ 将 `explain` 方法名修改为 `solution`,更加符合语义
++ 修复当修改弥封线类型时,试卷最后一页没有更改的 `bug`
++ 添加水印功能,`setup` 方法新增参数 `watermark`,`watermark-size`,`watermark-color`,`watermark-font`,`watermark-rotate`
+
+### 0 . 1 . 5
++ 修复水印被图片遮挡的 `bug`
+
+### 0 . 1 . 6
++ 修复有序列表,内容带有 `box` 时,编号和内容对不齐的 `bug`
++ 新增化学方程式的单线桥、双线桥的支持;原子、离子结构示意图的支持。使用详情查看 [`化学相关`](https://ezexam.pages.dev/chem)
+
+### 0 . 1 . 7
++ 优化代码,确保 `heading-size` 只修改一级标题;并将其更名为 `h1-size`
++ 为 `title` 方法新增参数 `color`
++ 修复 `solution` 方法,当启用 `title` 时,如果解析内容过多,一页放不下,标题会跑到下一页的 `bug`;并将其参数 `above` 更名为 `top`;参数 `below` 更名为 `bottom`;统一参数名;添加参数 `padding-top`、`padding-bottom`
++ 去除 `question` 方法参数 `line-height`;该参数会影响题干之间的距离;该参数原本用于设置题目内容的行高,当题目中的公式比较高时,题号和题目内容会错位,这时可以通过该参数来微调。但是会造成内容每一行与行之间的间隔变大。可参考 [使用技巧](https://ezexam.pages.dev/tips) 代替;添加参数 `padding-top`、`padding-bottom`
++ 修复 `choices` 方法,调整其上下外边距导致选项之间的距离会跟着影响的 `bug`
+
+### 0 . 1 . 8
++ 为 `mode` 添加新值 `SOLUTION`,当答案解析独立于试题存在时,使用此值可快速统一格式
++ 优化 `choices` 方法;将其参数 `column` 更名为 `columns`,做到和官方的 `columns` 参数一致
++ 废弃 `inline-square` 方法,推荐使用内置的 `table` 方法
++ 修复 `color-box` 方法报错的 `bug`
++ 优化 `secret` 、`zh-arabic` 方法
++ 优化 `question` 的编号实现方式;修改 `setup` 方法的参数 `enum-numbering` 的默认值为 `(1.i.a)`
++ 优化 `notice` 方法;新增参数 `indent` 、`hanging-indent`
+
+### 0 . 1 . 9
++ 优化 `text-figure` 方法;考虑到文本内容较多,为了书写方便,将参数 `text` 修改为位置参数;新增参数 `figure` 、`style`
From a02be8eaab73bcb646bb63c5f92b5b9ced72ce99 Mon Sep 17 00:00:00 2001
From: gbchu <57310768+gbchu@users.noreply.github.com>
Date: Tue, 23 Sep 2025 15:22:06 +0800
Subject: [PATCH 09/37] [Typship] Add template\17.png
---
packages/preview/ezexam/0.1.9/template/17.png | Bin 0 -> 17940 bytes
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 packages/preview/ezexam/0.1.9/template/17.png
diff --git a/packages/preview/ezexam/0.1.9/template/17.png b/packages/preview/ezexam/0.1.9/template/17.png
new file mode 100644
index 0000000000000000000000000000000000000000..c8482216f174c1891df62707a49ff9c21d323502
GIT binary patch
literal 17940
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%0DV>>a#_An2FDL)!V4Se>}yu
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
Date: Tue, 23 Sep 2025 15:22:07 +0800
Subject: [PATCH 10/37] [Typship] Add template\6.png
---
packages/preview/ezexam/0.1.9/template/6.png | Bin 0 -> 23840 bytes
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 packages/preview/ezexam/0.1.9/template/6.png
diff --git a/packages/preview/ezexam/0.1.9/template/6.png b/packages/preview/ezexam/0.1.9/template/6.png
new file mode 100644
index 0000000000000000000000000000000000000000..b5cfd3c8f68c84da1abe3e977afeab30f5ea6baa
GIT binary patch
literal 23840
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
Date: Tue, 23 Sep 2025 15:22:08 +0800
Subject: [PATCH 11/37] [Typship] Add template\main.typ
---
.../preview/ezexam/0.1.9/template/main.typ | 171 ++++++++++++++++++
1 file changed, 171 insertions(+)
create mode 100644 packages/preview/ezexam/0.1.9/template/main.typ
diff --git a/packages/preview/ezexam/0.1.9/template/main.typ b/packages/preview/ezexam/0.1.9/template/main.typ
new file mode 100644
index 0000000000..f75e2f0691
--- /dev/null
+++ b/packages/preview/ezexam/0.1.9/template/main.typ
@@ -0,0 +1,171 @@
+#import "@preview/ezexam:0.1.9": *
+
+#show: setup.with(
+ // paper: a3,
+ mode: EXAM,
+)
+
+#outline()
+#chapter[2025新高考I卷]
+#title[2025新高考I卷]
+#subject[数学]
+#secret()
+
+#notice(
+ [答题前,请务必将自已的姓名、准考证号用0.5毫米黑色墨水的签字笔填写在试卷及答题卡的规定位置.],
+ [请认真核对监考员在答题卡上所粘贴的条形码上的姓名、准考证号与本人是否相符.],
+ [作答选择题必须用2B铅笔将答题卡上对应选项的方框涂满、涂黑;如需改动,请用橡皮擦干净后,再选涂其他答案.作答非选择题,必须用0.5毫米黑色墨水的签字笔在答题卡上的指定位置作答,在其他位置作答一律无效.],
+ [本试卷共4页,满分150分,考试时间为120分钟.考试结束后,请将本试卷和答题卡一并交回.],
+)
+
+= 单选题:本题共 8 小题,每小题 5 分,共 40 分.在每小题给出的四个选项中,只有一项是符合题目要求的.
+#question[
+ $(1 + 5i)i$ 的虚部为 #paren[]
+ #choices([$-1$], [$0$], [$1$], [$6$])
+]
+
+#question[
+ 集合 $U = {x | x "为小于9的正整数" }$, $A = {1,3,5}$, 则 $complement_U A$ 中的元素个数为 #paren[]
+ #choices([$0$], [$3$], [$5$], [$8$])
+]
+
+#question[
+ 若双曲线 $C$ 的虚轴长为实轴长的 $sqrt(7)$ 倍,则 $C$ 的离心率为 #paren[]
+ #choices([$sqrt(2)$], [$2$], [$sqrt(7)$], [$2sqrt(2)$])
+]
+
+#question[
+ 若点 $(a,0) (a > 0)$ 是函数 $y = 2tan(x - pi / 3)$ 的图象的一个对称中心,则 $a$ 的最小值为 #paren[]
+ #choices([$30°$], [$60°$], [$90°$], [$135°$])
+]
+
+#question[
+ 设 $f(x)$ 是定义在 $RR$ 上且周期为 2 的偶函数,当 $2 lt.eq.slant x lt.eq.slant 3$ 时,$f(x) = 5 - 2x$,则
+ $f(-3 / 4 ) =$ #paren[]
+ #choices([$-1 / 2$], [$-1 / 4$], [$1 / 4$], [$1 / 2$])
+]
+
+#question[
+ 已知视风速是真风速和船风速的和向量,船风速与船行驶速度大小相等,方向相反.则真风速等级是 #paren[]
+ #text-figure(
+ figure: image("6.png", width: 50%), // 替换自己的图片
+ )[#choices(
+ columns: 1,
+ [轻风 (1.6$~$3.3 m/s)],
+ [微风 (3.4$~$5.4 m/s)],
+ [和风 (5.5$~$7.8 m/s)],
+ [劲风 (8.0$~$10.7 m/s)],
+ )]
+]
+
+#question[
+ 若圆 $x^2 + (y + 2)^2 = r^2 (r > 0)$ 上到直线 $y = sqrt(3)x + 2$ 的距离为 1 的点有且仅有 2 个,则 $r$ 的取值范围是
+ #paren[]
+ #choices([(0, 1)], [(1, 3)], [(3, +∞)], [(0, +∞)])
+]
+
+#question[
+ 若实数 $x, y, z$ 满足 $2 + log_2 x = 3 + log_3y = 5 + log_5 z$,则 $x, y, z$ 的大小关系不可能是 #paren[]
+ #choices([$x > y > z$], [$x > z > y$], [$y > x > z$], [$y > z > x$])
+]
+
+= 多选题:本题共 3 小题,每小题 6 分,共 18 分.在每小题给出的选项中,有多项符合题目要求.全部选对的得 6 分,部分选对的得部分分,有选错的得 0 分.
+#question[
+ 在正三棱柱 $A B C-A_1B_1C_1$ 中,$D$ 为 $B C$ 中点,则 #paren[]
+ #choices([$A D perp A_1C$], [$B_1C perp "平面" A A_1D$], [$C C_1 parallel "平面" A A_1D$], [$A D parallel A_1B_1$])
+]
+
+#question[
+ 设抛物线 $C: y^2 = 6x$ 的焦点为 $F$,过 $F$ 的直线交 $C$ 于$A、B$,过 $F$ 且垂直于 $A B$的直线交准线 $l$:
+ $y = -3 / 2x$ 于 $E$,过点$A$作准线的垂线,垂足为$D$,则 #paren[]
+ #choices([$|A D| = |A F|$], [$|A E| = |A B|$], [$|A B| gt.eq.slant 6$], [$|A E| dot |B E| gt.eq.slant 18$])
+]
+
+#question[
+ 已知 $triangle A B C$ 的面积为 $1 / 4$,若 $cos 2A + cos 2B + cos 2C = 2,cos A cos B sin C = 1 / 4$,则 #paren[]
+ #choices([$sin C = sin^2 A + sin^2 B$], [$A B = sqrt(2)$], [$sin A + sin B = sqrt(6) / 2$], [$A C^2 + B C^2 = 3$])
+]
+
+= 填空题:本题共 3 小题,每小题 5 分,共 15 分.
+#question[
+ 若直线 $y = 2x + 5$ 是曲线 $y = e^x + x + a$ 的切线,则 $a =$#fillin[].
+]
+
+#question[
+ 若一个正项等比数列的前 4 项和为 4,前 8 项和为 68,则该等比数列的公比为 #fillin[].
+]
+
+#question[
+ 一个箱子里有 5 个球,分别以 1$~$5 标号,若有放回取三次,记至少取出一次的球的个数 $X$,则 $E(X) =$#fillin[].
+]
+
+= 解答题:本题共 5 小题,共 77 分.解答应写出文字说明、证明过程或演算步骤.
+#question(points: 13, bottom: 2in)[
+ 为研究某疾病与超声波检查结果的关系,从做过超声波检查的人群中随机调查了1000人,得到如下的列联表:
+ #align(center)[
+ #table(
+ columns: 4,
+ [], [正常], [不正常], [合计],
+ [患该疾病], [20], [180], [200],
+ [未患该疾病], [780], [20], [800],
+ [合计], [800], [200], [1000],
+ )
+ ]
+ + 记超声波检查结果不正常者患有该疾病的概率为$p$,求$p$的估计值;
+ + 根据小概率值$alpha=0.001$的独立性检验,分析超声波检查结果是否与患该疾病有关.
+
+ #text-figure(
+ figure-x: 1in,
+ figure: table(
+ columns: 4,
+ [$P(chi^2 gt.eq.slant k)$], [0.005], [0.010], [0.001],
+ [$k$], [3.841], [6.635], [10.828],
+ ))[附:$chi^2 = n(a d - b c)^2 / ((a + b)(c + d)(a + c)(b + d))$.]
+]
+
+#question(points: 15, bottom: 1in)[
+ 设数列 ${a_n}$ 满足 $a_1 = 3", "a_(n+1) / n = a_n / (n+1) + 1 / (n(n+1))$.
+ + 证明:${n a_n}$ 为等差数列;
+ + 设 $f(x) = a_1x + a_2x^2 + dots.c + a_m x^m,求 f'(-2)$.
+]
+
+#question(points: 15, bottom: 2in)[
+ 如图所示的四棱锥 $P - A B C D$ 中,$P A perp "平面" A B C D, B C parallel A D, A B perp A D$.
+ #image("17.png", width: 30%) // 替换自己的图片
+ + 证明:平面 $P A B perp "平面" P A D$
+ + 若 $P A = A B = sqrt(2), A D = sqrt(3) + 1, B C = 2$,$P, B, C, D$ 在同一个球面上,设该球面的球心为 $O$.
+ + 证明:$O$ 在平面 $A B C D$上;
+ + 求直线 $A C$ 与直线 $P O$ 所成角的余弦值.
+
+]
+
+#question(points: 17, bottom: 2in)[
+ 设椭圆 $C: x^2 / a^2 + y^2 / b^2 = 1 (a > b > 0)$,记 $A$为椭圆下端点,$B$ 为右端点,$|A B| = sqrt(10)$,且椭圆 $C$
+ 的离心率为 $(2sqrt(2)) / 3$.
+ + 求椭圆的标准方程;
+ + 设点 $P(m, n)$.
+ + 若 $P$ 不在 $y$ 轴上,设 $R$ 是射线 $A P$ 上一点,$|A R| dot |A P| = 3$,用 $m, n$ 表示点 $RR$ 的坐标;
+ + 设直线$O Q$ 的斜率为 $k_1$,直线 $O P$ 的斜率为 $k_2$,若 $k_1 = 3k_2$,$M$为椭圆上一点,求 $|P M|$ 的最大值.
+]
+
+#question(points: 17, bottom: 2in)[
+ 设函数 $f(x) = 5cos x - cos 5x$.
+ + 求 $f(x)$ 在 $[0, pi / 4]$ 的最大值;
+ + 给定 $theta in (0, pi),a$ 为实数,证明:存在 $y in [a - theta, a + theta]$,使得 $cos y lt.eq.slant cos theta$;
+ + 若存在 $phi$,使得对任意 $x$,都有 $5cos x - cos(5x + phi) lt.eq.slant b$,求 $b$ 的最小值.
+]
+
+
+#show: setup.with(mode: SOLUTION, show-answer: true)
+
+#title[参考答案]
+
+#solution(title: "解析")[
+ #answer[A]
+ 解: #lorem(6)#score(6)
+]
+
+#solution[
+ #answer[B]
+ 解:
+]
\ No newline at end of file
From 420308d6d7c32e6b02fb0bb2b6cb8d9c8be95e61 Mon Sep 17 00:00:00 2001
From: gbchu <57310768+gbchu@users.noreply.github.com>
Date: Tue, 23 Sep 2025 15:22:09 +0800
Subject: [PATCH 12/37] [Typship] Add thumnail.png
---
packages/preview/ezexam/0.1.9/thumnail.png | Bin 0 -> 190242 bytes
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 packages/preview/ezexam/0.1.9/thumnail.png
diff --git a/packages/preview/ezexam/0.1.9/thumnail.png b/packages/preview/ezexam/0.1.9/thumnail.png
new file mode 100644
index 0000000000000000000000000000000000000000..6354f674ec7444c821bcaaa73f872216a989aac1
GIT binary patch
literal 190242
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