跳转至

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 prefixdigit_countdigits
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_choicemultiple_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 和数量必须一致。

主观题

主观题代码为 subjectiveanswer_style 可为 linedblankanswer_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 truefalse
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-questionmode: answer_metadata。不得修改其 key 或题型,也不能加入题干、选项、分值或版面字段。

安全限制

以下内容会导致编译失败:

  • 原始 HTML、<script>、事件属性、CSS 或其他可执行标记;
  • Markdown 外部图片、Base64 图片和非本考试资源;
  • YAML 锚点、别名、自定义标签或过深、过大的 YAML 数据;
  • 未知结构指令、重复 key、不闭合的结构区块或公式定界符;
  • 超过 1,000,000 个字符的源码;
  • 超过 50 个题组、500 个题目或说明、每题 6 个选项;
  • 题型不匹配的答案、分值、填空槽或答题区域设置。

Markdown 解析关闭原始 HTML,编译结果还会经过 Examark 的富文本白名单净化。代码块中的 HTML 示例会作为普通文本转义,不会执行。

编译、规范化与并发

  1. 选择 整卷代码本题代码
  2. 修改源码后选择 编译
  3. 编译成功后核对实时预览、题目栏、总分和差异摘要。
  4. 选择 保存试题 才会保存并生成一条历史版本。

编译会返回规范化源码。注释、字段顺序和不影响语义的空行可能被调整,因此不应把源码排版当作长期数据。删题、换题型、修改稳定 key 或丢失图片会要求再次确认。

保存使用草稿 ETag 检查并发修改。发生冲突时系统不会覆盖其他协作者的版本;应先下载本地源码,再重新加载或打开版本管理进行比较。

AI 生成要求

生成式工具应遵循以下顺序:

  1. 固定输出 format: examark-paperversion: 2
  2. 为所有题组、说明和题目分配稳定、唯一、可读的 key,后续修订不随意改 key。
  3. 只使用本规范列出的题型、字段和结构指令。
  4. 保证客观题答案对应真实选项,填空答案对应全部填空槽,各题分值非负且合理。
  5. 为填空、主观题和作文生成结构化评分标准;每一分都应对应可观察标准和答案证据,评分点精确合计题目满分。
  6. 不虚构图片资源 ID;需要图片时使用调用方明确提供的当前考试 asset ID。
  7. 不把资料引用、内部说明或模型推理写入学生可见的题干、选项、答案、评分标准或解析。
  8. 不输出 HTML、CSS、外链图片、Base64、脚本、页面命令或 v2 未支持的表格与强制分页。
  9. 输出后先调用编译校验,根据行列诊断修正,再交给用户预览和保存。

完整结构请从本页顶部下载范例、Schema 和 EBNF。JSON Schema 无法表达“评分点分值精确合计题目满分”等全部跨字段规则,因此生成工具必须同时通过 Examark 编译器。未来能力会通过新版本扩展,v1 源码仍保持可编译。