Examark Markdown 试卷格式¶
Examark Markdown 是 Examark 的试卷源码格式。它用于批量编辑整张试卷、编译单题,以及让生成式工具按稳定结构产出可检查、可预览、可打印的试卷草稿。
当前规范版本为 v2,文件扩展名为 .examark.md,编码必须为 UTF-8。v2 新增结构化评分标准;已有 v1 源码仍可完整编译。
结构数据仍是权威数据
源码只有在 编译成功 后才会更新浏览器中的当前草稿,之后仍需选择 保存试题 才会写入系统。编译错误不会覆盖当前草稿。
下载规范文件¶
JSON Schema 描述编译后的语义结构;EBNF 描述源码的结构指令。生成工具应同时遵守本页约束。
基本结构¶
整卷源码由 YAML 文件头和一个或多个题组组成:
---
format: examark-paper
version: 2
paper:
title: 期中测试
print:
show_page_numbers: true
---
@group
key: objective
title: 一、选择题
allowed_types: [single_choice]
default_scores:
single_choice: 4
@question
key: q1
type: single_choice
score: 4
answer: [A]
@stem
下列选项正确的是( )。
@endstem
@option A
选项 A
@endoption
@option B
选项 B
@endoption
@explanation
答案为 A。
@endexplanation
@endquestion
@endgroup
结构指令必须使用英文并独占一行;题目、说明、答案和解析可以使用中文。
YAML 文件头¶
| 字段 | 必填 | 说明 |
|---|---|---|
format |
是 | 固定为 examark-paper |
version |
是 | 当前版本固定为整数 2;整数 1 按旧规范编译 |
paper.title |
是 | 试卷标题,最长 200 个字符 |
print |
是 | 试卷显示配置;未知字段会在规范化时移除 |
print 支持以下字段:
| 字段 | 类型 | 说明 |
|---|---|---|
paper_main_title |
string | 试卷大标题 |
show_student_info |
boolean | 显示学生信息栏 |
show_instructions |
boolean | 显示考试须知 |
show_exam_time / exam_time |
boolean / string | 显示考试时间及文本 |
show_exam_location / exam_location |
boolean / string | 显示考试地点及文本 |
show_exam_duration / exam_duration |
boolean / string | 显示考试时长及文本 |
show_manual_grading_table |
boolean | 显示人工登分表 |
show_page_numbers |
boolean | 显示页码 |
show_question_count |
boolean | 显示题目数 |
show_total_score |
boolean | 显示总分 |
body_font_size_pt |
number | 正文字号,范围为 9 至 14 pt |
instructions |
string | 考试须知,多行文本使用 YAML | |
student_no_config |
object | prefix、digit_count、digits |
answer_sheet_config |
object | enhanced_scanning |
A3/A4、单双面和空白页策略属于预印版本配置,不写入试卷作者源码。
题组和说明¶
题组使用 @group 和 @endgroup。每个题组必须有稳定且唯一的 key:
@group
key: written
title: 二、主观题
allowed_types: [fill_blank, subjective]
default_scores:
fill_blank: 6
subjective: 12
@instruction
key: written_note
@content
请写出必要步骤。
@endinstruction
@endgroup
key 只能包含字母、数字、点、下划线、冒号和连字符,最长 128 个字符。已有试卷生成源码时,系统会由现有 ID 派生稳定 key。删除或修改已有 key 会被视为结构性变更。
共享材料应写在题组说明中,后续题目按顺序引用;v2 不建立独立复合小题模型。
题目¶
题目使用 @question、@stem 和 @endquestion。通用元数据如下:
| 字段 | 说明 |
|---|---|
key |
稳定且唯一的题目 key |
type |
题型代码 |
score |
本题分值;填空题总分由各空分值相加 |
group_key |
可选;整卷编译时通常由所在题组确定 |
单选题和多选题¶
题型代码分别为 single_choice 和 multiple_choice。答案写在元数据的 answer 数组中,每个选项使用独立的 @option:
@question
key: q_choice
type: multiple_choice
score: 6
answer: [A, C]
@stem
选择所有正确项。
@endstem
@option A
第一项
@endoption
@option B
第二项
@endoption
@option C
第三项
@endoption
@explanation
A、C 正确。
@endexplanation
@endquestion
每题最多 6 个选项。答案标签必须与选项标签一致;单选题只能有一个答案,多选题至少有一个答案。
判断题¶
判断题代码为 true_false,使用 T 表示正确、F 表示错误。规范化源码会包含 T/F 两个选项。
填空题¶
填空题代码为 fill_blank。题干中的每个填空使用 {{blank:key}},元数据中的 blanks 必须逐一提供答案和分值:
@question
key: q_blank
type: fill_blank
score: 6
blanks:
- key: b1
score: 3
answers: [H2O, H₂O]
- key: b2
score: 3
answers: [氧气]
@stem
水的化学式是 {{blank:b1}},支持燃烧的气体是 {{blank:b2}}。
@endstem
@rubric
version: 1
criteria:
- key: formula
title: 化学式
points: 3
observable: 正确写出水的化学式
evidence: 第一空为 H2O 或 H₂O
levels:
- score: 0
description: 错误或未作答
- score: 3
description: 答案正确
- key: gas
title: 气体名称
points: 3
observable: 正确写出支持燃烧的气体
evidence: 第二空为氧气
levels:
- score: 0
description: 错误或未作答
- score: 3
description: 答案正确
@endrubric
@explanation
逐空核对标准答案。
@endexplanation
@endquestion
同一空的 answers 表示可接受的多个答案。源码中的空位 key、答案 key 和数量必须一致。
主观题¶
主观题代码为 subjective。answer_style 可为 lined 或 blank,answer_lines 是正整数:
key: q_subjective
type: subjective
score: 12
answer_style: lined
answer_lines: 6
作文¶
作文代码为 composition,使用 composition_rows 设置作文格行数。答案区域由打印模板生成,不在源码中写 HTML 或 CSS。
内容格式¶
题干、选项、说明和解析支持 Markdown 段落、1 至 6 级标题、无序和有序列表、引用、粗体、斜体、行内代码与代码块。扩展语法如下:
| 语法 | 用途 |
|---|---|
++重点++ |
下划线 |
\(x^2+y^2\) |
行内 LaTeX 公式 |
\[\frac{a}{b}\] |
块级 LaTeX 公式 |
{{blank:b1}} |
填空槽 |
{{pinyin "hua4 xue2"}} |
数字声调拼音,编译为 huà xué |
{align=left} / {align=center} / {align=right} |
对齐紧邻的段落,写在该段末行 |
{{image asset="..." width=100 x=0 y=0 border=false}} |
系统图片资源 |
%% 注释 |
源码注释;代码块外独占一行,规范化后移除 |
图片参数:
| 参数 | 规则 |
|---|---|
asset |
必须是当前组织、当前考试下已验证的 JPG/PNG 题目资源 ID |
width |
10 至 120,表示相对宽度百分比 |
x / y |
-20 至 20,表示毫米偏移 |
border |
true 或 false |
caption |
可选说明文字,最长 200 个字符 |
应先在代码编辑器中选择 插入图片,由系统上传并插入正确的资源 ID。Markdown 外部图片 URL、Base64 图片和 HTML <img> 均不允许。
评分标准和解析¶
- 非客观题使用
@rubric ... @endrubric保存评分标准。v2 的内容是安全加载的 YAML,不是 Markdown 或 HTML。 - 所有题型都可以使用
@explanation ... @endexplanation保存解析。 - 预印锁定后,整卷源码只读;选择 仅编辑答案 后,本题代码只包含当前题目的答案、评分标准和解析。
结构化评分标准固定使用 version: 1,包含一个或多个评分点:
| 字段 | 规则 |
|---|---|
criteria[].key |
稳定且唯一,最长 64 个字符 |
criteria[].title |
评分点名称 |
criteria[].points |
该评分点满分,必须大于 0 |
criteria[].observable |
阅卷时可以直接观察和判断的标准 |
criteria[].evidence |
学生答案中能够支持得分的具体证据 |
criteria[].levels |
可选分档;填写时必须同时包含 0 分和该评分点满分,可增加部分得分条件 |
所有 criteria[].points 必须精确合计为题目 score。评分点最多 30 个,每个评分点最多 10 个分档;分档分值不能重复,也不能超过该评分点满分。系统会由结构化内容生成兼容的评分标准文本。
旧试卷的自由文本评分标准仍然有效。v2 规范化源码会将其表示为:
@rubric
legacy_text: 按关键步骤分点给分。
@endrubric
答案模式源码使用 format: examark-question 和 mode: answer_metadata。不得修改其 key 或题型,也不能加入题干、选项、分值或版面字段。
安全限制¶
以下内容会导致编译失败:
- 原始 HTML、
<script>、事件属性、CSS 或其他可执行标记; - Markdown 外部图片、Base64 图片和非本考试资源;
- YAML 锚点、别名、自定义标签或过深、过大的 YAML 数据;
- 未知结构指令、重复 key、不闭合的结构区块或公式定界符;
- 超过 1,000,000 个字符的源码;
- 超过 50 个题组、500 个题目或说明、每题 6 个选项;
- 题型不匹配的答案、分值、填空槽或答题区域设置。
Markdown 解析关闭原始 HTML,编译结果还会经过 Examark 的富文本白名单净化。代码块中的 HTML 示例会作为普通文本转义,不会执行。
编译、规范化与并发¶
- 选择 整卷代码 或 本题代码。
- 修改源码后选择 编译。
- 编译成功后核对实时预览、题目栏、总分和差异摘要。
- 选择 保存试题 才会保存并生成一条历史版本。
编译会返回规范化源码。注释、字段顺序和不影响语义的空行可能被调整,因此不应把源码排版当作长期数据。删题、换题型、修改稳定 key 或丢失图片会要求再次确认。
保存使用草稿 ETag 检查并发修改。发生冲突时系统不会覆盖其他协作者的版本;应先下载本地源码,再重新加载或打开版本管理进行比较。
AI 生成要求¶
生成式工具应遵循以下顺序:
- 固定输出
format: examark-paper和version: 2。 - 为所有题组、说明和题目分配稳定、唯一、可读的 key,后续修订不随意改 key。
- 只使用本规范列出的题型、字段和结构指令。
- 保证客观题答案对应真实选项,填空答案对应全部填空槽,各题分值非负且合理。
- 为填空、主观题和作文生成结构化评分标准;每一分都应对应可观察标准和答案证据,评分点精确合计题目满分。
- 不虚构图片资源 ID;需要图片时使用调用方明确提供的当前考试 asset ID。
- 不把资料引用、内部说明或模型推理写入学生可见的题干、选项、答案、评分标准或解析。
- 不输出 HTML、CSS、外链图片、Base64、脚本、页面命令或 v2 未支持的表格与强制分页。
- 输出后先调用编译校验,根据行列诊断修正,再交给用户预览和保存。
完整结构请从本页顶部下载范例、Schema 和 EBNF。JSON Schema 无法表达“评分点分值精确合计题目满分”等全部跨字段规则,因此生成工具必须同时通过 Examark 编译器。未来能力会通过新版本扩展,v1 源码仍保持可编译。