Universe

Create project in app

简体中文 | English

Typeset Chinese exam papers in Typst, with student and teacher versions from one source. A port of the LaTeX class exam-zh. English README

用 Typst 排版中文试卷,移植自 LaTeX 试卷模板 exam-zh:一份源码同时生成学生版与教师版。本项目为独立移植,并非 exam-zh 官方项目。

学生版 教师版 密封线、A3 双栏
学生版 教师版 A3 密封线试卷
  • 一份源码,两个版本:学生版隐藏答案,教师版显示答案、正确选项和评分点,命令行一个参数切换;
  • 选择题自动分栏:选项按内容宽度排成 4、2 或 1 列;括号自动排到行末;
  • 填空:下划线、括号、圆圈、方框、空白,学生版显示 ▲、编号或空白,长答案自动换行;
  • 解答:评分点引导线画到页边;答案可隐藏、原位显示或集中到文末;
  • 整卷版式:密封线、A3 横向双栏、评分框、草稿纸、多份试卷合集与目录;
  • 各学科:语文的材料、古诗注释、连线题、作文格,英语作文框,数学计算题与教材写法的符号;
  • 熟悉的接口:选项名与 exam-zh 相同,写错键名时直接报错;一次编译完成,不需要 -shell-escape。

快速开始

#import "@preview/exam-zh-next:0.1.0": *

#show: exam.with(title: [2021 年普通高等学校招生全国统一考试], subject: [数学])

#secret()
#make-title()

= 选择题:本题共 8 小题,每小题 5 分,共 40 分。

#question[
  设集合 $A = {x | -1 < x < 4}$,$B = {2, 3, 4, 5}$,则 $A inter B = $ #paren[B]
  #choices(answer: "B")[${2}$][${2, 3}$][${3, 4}$][${2, 3, 4}$]
]

= 填空题:本题共 4 小题,每小题 5 分,共 20 分。

#question[
  已知函数 $f(x) = x^3 (a dot 2^x - 2^(-x))$ 是偶函数,则 $a = $ #fillin[$1$]。
]

= 解答题:本题共 6 小题,共 70 分。

#problem(points: 12)[
  已知函数 $f(x) = x (1 - ln x)$,讨论 $f(x)$ 的单调性。
  #solution[
    $f'(x) = -ln x$,#score(2) 故 $f(x)$ 在 $(0, 1)$ 上递增,在 $(1, +infinity)$ 上递减。#score(4)
  ]
]
typst compile exam.typ                                              # 学生版
typst compile --input exam-mode=teacher exam.typ exam-teacher.pdf   # 教师版

也可以用 typst init @preview/exam-zh-next 生成一份完整的试卷再修改。在 typst.app 上从模板新建项目即可,无需安装字体;本地编译请先安装 Noto CJK 字体,或改用其他字体(见下文)。

文档与示例

入门指南(源码) 快速开始、各种题型、常见场景、FAQ;与 exam-zh 的入门文档逐章对应
API 对照手册(源码) exam-zh 的每个命令和选项 → Typst 写法、说明与效果;章节编号与 exam-zh 完整文档相同
examples/ exam-zh 全部示例的 Typst 版:2021 全国乙卷数学、A3 试卷合集,以及语文、英语、真实考试场景

两份文档本身也用本模板排版;自行编译时在仓库根目录运行 typst compile --root . docs/guide.typ。

设置

所有选项按模块分组,三个入口用同样的键名:

#show: exam.with(choices: (max-columns: 2))  // 整份试卷
#exam-setup(fillin: (type: "paren"))         // 从此处往后
#choices(columns: 2)[A][B][C][D]              // 只作用于这一次

键名写错时编译报错,例如 unknown option `choices.colums` 。全部选项与默认值见 src/config.typ 和 API 对照手册第 4 章。

教师版显示哪些内容由 teacher 决定,默认是 teacher-defaults,可以在其上增改:

#show: exam.with(teacher: teacher-defaults + (solution: (show-solution: "show-move")))
#teacher-only[本题考查函数的单调性。]

字体

font: (preset: ..) 选择一组中文字体,也可以单独指定,例如 font: (kai: "LXGW WenKai"):

preset 宋体 黑体 楷体 仿宋
noto(默认) Noto Serif CJK SC Noto Sans CJK SC (同宋体) (同宋体)
source-han Source Han Serif SC Source Han Sans SC (同宋体) (同宋体)
fandol FandolSong FandolHei FandolKai FandolFang
windows SimSun SimHei KaiTi FangSong
mac Songti SC Heiti SC Kaiti SC STFangsong
founder FZShuSong-Z01 FZHei-B01 FZKai-Z03 FZFangSong-Z02

西文与数学默认使用 Typst 自带的 New Computer Modern。Typst 不会伪造粗体,请选用带粗体字重的中文字体。

从 exam-zh 迁移

大多数命令一一对应,完整对照见 API 对照手册:

exam-zh (LaTeX) Typst
\documentclass{exam-zh}、\examsetup{..} #show: exam.with(..)、#exam-setup(..)
\section{..} = ..
question、problem[points = 12] question[..]、problem(points: 12)[..]
choices 与 \item choices[..][..],answer: "B" 标出正确选项
\paren[B]、\fillin[答案] paren[B]、fillin[答案]
solution、\score{2} solution[..]、score(2)
\draftpaper、\scoringbox、\tableofcontents draftpaper()、scoringbox()、exam-outline()
\ExamPrintAnswerSet 与 -shell-escape --input exam-mode=teacher 与 exam(teacher: ..)

与 exam-zh 不同或暂不支持的地方(文字绕排、更多汉字格)以及后续计划列在 ROADMAP.md。

开发

scripts/check.sh [--font-path DIR]       # 编译全部示例(两个版本)、测试与文档,有警告即失败
scripts/doc-images.sh [--font-path DIR]  # 重新生成文档与 README 中的整页图片和模板缩略图
scripts/package.sh [--font-path DIR]     # 生成提交到 Typst Universe 的目录,并按用户的方式测试

许可与致谢

本项目是 exam-zh 的非官方 Typst 移植。设计、选项命名和示例来自 exam-zh (作者 Zeping Lee,维护者 Kangwei Xia、Lijun Guo),感谢他们的工作。Typst 代码为独立实现。

代码以 MIT 许可发布;template/ 中的初始试卷以 MIT-0 许可发布,用它写出的试卷无需保留任何声明。 文档中引用的 exam-zh 原文与 LaTeX 代码仍属于 exam-zh 作者(LPPL 1.3c),详见 NOTICE.md。