跳转至

墨墨记忆卡(Markji)制卡语法关键指南

更新时间:2026-08-26

1. 这份指南解决什么问题

这份指南面向希望让 AI 协助制作墨墨记忆卡(Markji)内容的用户,综合整理墨墨开放 API 的官方制卡指南与已经通过真实卡片、导入脚本或实际写回验证的制卡语法。

其中,行内公式、公式选择题和公式挖空根据论坛中的真实卡片样本与渲染结果补充。该样本反映当前版本的实际能力;墨墨开放 API 文档中的旧嵌套表尚未同步这三项新能力。

本文只讲卡片内容怎么写,不介绍登录、接口、上传流程或批量写回方法。没有在本文出现的标签,不应让 AI 自行猜测或编造。

2. 最重要的核心原则

2.1 content 是一整段语法文本

一张卡片的内容不是“标题、答案、图片”等彼此独立的字段,而是一整段 Markji 专用语法文本。生成或修改卡片时,必须把标题、答案线、正文、媒体和样式放在同一段完整内容中考虑。

不要只替换某个看起来像正文的片段,也不要把现有标签全部删掉后重新拼接。修改旧卡时,应先保留原有语法骨架,再做局部变更。

2.2 真实换行属于语法

换行会影响段落、答案线、选择题选项和媒体的位置,不能在处理中随意删除。

正确:内容中保存真实换行。

[P#H1,center#[T#B#标题]]
---
正文

错误:把换行保存成两个普通字符 \n

[P#H1,center#[T#B#标题]]\n---\n正文

错误:为了“压缩文本”而把整张卡拼成一行。

[P#H1,center#[T#B#标题]]---正文

2.3 --- 是答案线,不是装饰分隔符

独占一行的 --- 用于划分卡片的提问面与回答面。它不能被删除、改成其他横线、替换为 HTML,也不要在其前后追加其他文字。

推荐写法:

问题或标题
---
答案或正文

一张卡可以根据设计使用第二条答案线。例如,已经验证过的带图知识卡结构可以让标题、图片和正文依次揭示:

标题
---
[Pic#ID/<imageFileId>#]
---
正文

第二条答案线不是所有带图卡片的强制要求,只有在确实需要额外划分显示层次时才使用。如果答案线位于卡片末尾,仍应保留它后面的真实换行。

2.4 常用扩展语法速查

需要让 AI 生成以下内容时,可以直接给出这些硬性规则:

内容 已验证语法 必须填入的值
网页链接 [T#link/"<URL>"#<显示文字>] 完整且正确编码的 URL
卡片引用 [Card#ID/<root_id>#<显示文字>] 目标卡片真实的 root_id
挖空 [F#<正整数编号>#<隐藏内容>] 1 开始的正整数分组编号
LaTeX 公式 [E##<LaTeX 公式内容>] KaTeX 支持的 LaTeX 内容
图片遮罩 [Pic#ID/<imageFileId>,MID/<maskFileId>#] 原图和遮罩文件各自真实的 file.id

尖括号中的文字都只是占位符,正式制卡前必须替换,不能让 AI 原样写入卡片。

四项合用时,可以按下面的完整结构生成;示例中的所有占位符都必须替换:

[P#H1,center#[T#B#<标题>]]
[T#link/"https://example.com/reference"#参考网页]
[Card#ID/<root_id>#参见相关卡片]
---
[E##E_k=\frac{1}{2}mv^2]
[Pic#ID/<imageFileId>,MID/<maskFileId>#]

2.5 通用结构、位置与嵌套规则

Markji 语法通常使用下面的结构:

[名称#参数1,参数2#内容]

通用规则如下:

  • 标签名和参数区分大小写,必须使用规定的 TPFChoicePicAudioCardE 等形式。
  • 第一个 # 分隔名称与参数,第二个 # 分隔参数与内容;没有参数时也要保留两个 #,例如 [E##x+y][Choice##...]
  • 多个参数使用半角逗号分隔;标签名、参数和结构分隔符之间不要加入空格。
  • 每个标签都必须用未转义的 ] 正确闭合,不要依赖错误语法被自动修复。
  • P 段落、选择题、图片、独立公式和答案线属于块级语法,必须从新一行的第一个字符开始。
  • 普通段落不需要写成 [P##内容],直接输入文字即可。

嵌套时按下面的范围处理:

容器 可以放入的语法
普通段落 TFAudioCard、行内 E
P 段落 TFAudioCard
Choice 选项 TE
TF 的内容 不放其他标签
AudioCard 的显示文字 不放其他语法
Pic 内容必须为空
E 公式内容 KaTeX 内容;制作公式挖空时可放 F

Choice 选项中的 EE 公式中的 F 这两种已验证组合外,不要让行内语法互相嵌套。PChoicePic、独立 E--- 不要放进其他语法内部,也不要把两种例外继续组合成未经验证的多层嵌套。

3. 转义与特殊字符

在普通文字或标签的内容区中,需要显示半角中括号本身时,用反斜杠转义:

想显示 应输入
[ \[
] \]

例如:

数学中的闭区间可以写作 \[0,1\]。
[T#B#请阅读第 \[3\] 章]

只转义作为普通文字显示的中括号,真正的语法外层括号不要转义。内容区中的 # 和半角逗号通常可以直接写;参数区中的 #、半角逗号和换行具有结构含义,不能当普通字符使用。

反斜杠只有紧挨中括号时才用于这里的转义。公式中的 LaTeX 反斜杠应按公式原样书写。全角 []# 会改变实际字符,只在确实需要展示全角字符时使用,不再作为默认转义方案。

4. 段落与标题语法

4.1 段落标签

已验证的基本形式是:

[P#段落样式#段落内容]

常用样式:

用途 写法 说明
一级居中标题 [P#H1,center#内容] H1center 组合使用
普通居中段落 [P#center#内容] 常用于副标题或外文标题
列表段落 [P#L#内容] 用于无序列表项
缩进 [P#I2#内容] I<n> 中的 n 使用正整数
左对齐 [P#left#内容] 一段只能选择一种对齐方式
右对齐 [P#right#内容] 一段只能选择一种对齐方式

段落中可以嵌套文本样式标签:

[P#H1,center#[T#B#幸存者偏差]]
[P#center#Survivorship Bias]

注意外层 [P#...#...] 和内层 [T#...#...] 必须各自正确闭合。上例结尾出现两个 ] 是正常的,分别关闭文本标签和段落标签。

标题只使用 H1,不要生成其他标题级别。当前只使用 L 表示无序列表,不要自行生成有序列表、折叠或行内代码等未列出的参数。

分级无序列表可以把 LI<n> 组合,并在段落内容中使用挖空:

[P#L#一级主题]
[P#L,I2#二级主题]
[P#L,I3#[F#1#需要回忆的三级主题]]
[P#L,I4#[F#2#更深一层的内容]]

整个 P 标签尽量写在同一行。P 的内容可以包含 TFAudioCard,但这些行内语法之间不要互相嵌套。

4.2 标题只是排版,不代替答案线

标题标签只控制显示方式,不会自动建立卡片正反面。即使已经使用标题标签,仍需显式写出 ---

[P#H1,center#[T#B#幸存者偏差]]
[P#center#Survivorship Bias]
---
我们只看到了活下来的赢家,却忽略了死掉的沉默大多数。

5. 富文本语法

5.1 文本标签

已验证的基本形式是:

[T#文本样式#文本内容]

已确认的文本样式:

样式 含义 示例
B 加粗 [T#B#重点]
U 下划线 [T#U#重点]
I 斜体 [T#I#重点]
D 删除线 [T#D#旧表述]
up 上标 x[T#up#2]
down 下标 H[T#down#2]O
!rrggbb 文字颜色 [T#!ff2600#红色文字]
!!rrggbb 背景颜色 [T#!!fff2cc#高亮文字]
link/"URL" 网页链接 [T#link/"https://example.com"#查看网页]

颜色值使用不带 # 的六位小写十六进制 RGB,例如红色写成 !ff0000,而不是 !#ff0000 或包含大写字母的颜色值。

5.2 多种样式合并到同一个标签

同一段文字需要多种样式时,用英文逗号把样式合并到同一个 [T#...#...] 标签中:

[T#B,U,!ff2600#需要特别记忆的内容]

推荐的样式顺序是:

B,U,I,D,up,down,!文字颜色,!!背景颜色,link/"URL"

没有使用到的样式直接省略。updown 不要同时使用;同一种参数不要重复,多个颜色或多个对齐方式也不要冲突。不要为了叠加样式生成多层不必要的嵌套标签,也不要在 T 的内容中放入其他语法。

5.3 HTML 不能直接当作 Markji 富文本

不要把下面这样的 HTML 原样写入卡片:

<b><u><span style="color: #ff2600">重点</span></u></b>

应先转换成 Markji 语法:

[T#B,U,!ff2600#重点]

已经验证的基础转换关系如下:

HTML 表达 Markji 样式
<b><strong> B
<u><ins> U
<i><em> I
<s><strike><del> D
<sup> up
<sub> down
color !rrggbb
background-color !!rrggbb
<div><p><li><br> 真实换行或相应段落

5.4 挖空语法

挖空使用下面的格式:

[F#编号#要隐藏的内容]

例如:

光合作用主要发生在[F#1#叶绿体]中。

编号表示挖空分组:

  • 使用从 1 开始的正整数,不要使用 0、负数、小数或文字编号。
  • 相同编号属于同一组,会一起显示或隐藏;不同编号属于不同组。
  • 编号不能省略。
  • 普通挖空的内容中不要嵌套其他标签;需要样式时,把样式放在挖空外部或改写内容。

公式挖空是一个明确的例外,但嵌套方向与“把公式放进挖空”相反:应把 F 放进 E,写成 [E##公式前段[F#编号#被挖空的 LaTeX]公式后段]。不要写成 [F#编号#[E##公式]],完整示例见 8.4 节。

6. 图片、遮罩与音频语法

6.1 图片

图片引用格式:

[Pic#ID/<fileId>#]

示例:

[Pic#ID/1kIBX#]

图片标签必须从新一行开头开始,内容区必须为空,因此结尾是 #]。相邻且没有空格或换行的多张图片会组成同一个画廊:

[Pic#ID/image1#][Pic#ID/image2,MID/mask2#]

分别放在两行会形成两个独立的图片区块:

[Pic#ID/image1#]
[Pic#ID/image2#]

6.2 图片遮罩

需要在图片上应用已经创建的遮罩时,格式是:

[Pic#ID/<imageFileId>,MID/<maskFileId>#]

真实样本:

[Pic#ID/1pCtz,MID/1pCtA#]

其中:

  • ID/<imageFileId> 填原图真实的 Markji file.id
  • MID/<maskFileId> 填遮罩文件真实的 Markji file.id
  • 参数顺序固定为原图 ID 在前、遮罩 MID 在后;
  • 两项之间只能使用半角逗号,不能插入空格;
  • 两个 ID 都大小写敏感,必须分别从可靠的上传结果或 manifest 中读取;
  • 原图 ID 和遮罩 ID 是两个不同值,不能交换,也不能默认二者相同。

没有遮罩时,不要保留空的 MID 参数,直接使用普通图片语法:

[Pic#ID/<imageFileId>#]

错误:交换原图和遮罩,或给 MID 留空。

[Pic#MID/<maskFileId>,ID/<imageFileId>#]
[Pic#ID/<imageFileId>,MID/#]

6.3 遮罩文件如何制作

Markji 图片遮罩通常不是另一张 PNG 或 JPG 图片,而是一份描述遮挡区域的 .msk1 JSON 文件。每个遮挡区域记录一个矩形的位置、大小和顺序。

6.3.1 第一步:确定最终原图

必须先确定最终写入卡片的原图,并记录它的像素宽度 W 和高度 H。后续所有遮罩坐标都以这张原图为基准。

不要在生成遮罩之后继续裁剪、缩放或旋转原图。原图尺寸或内容一旦变化,旧遮罩就可能错位,必须按新图重新计算。

6.3.2 第二步:框选需要遮挡的区域

对每个需要隐藏的答案区域,记录像素坐标:

左上角:(x1, y1)
右下角:(x2, y2)

坐标原点位于图片左上角,向右为 x 增大,向下为 y 增大。

6.3.3 第三步:换算成 Markji 坐标

.msk1 中不直接保存像素值,而是把坐标归一化到 0~10000。换算公式为:

left   = round(x1 / W × 10000)
top    = round(y1 / H × 10000)
width  = round((x2 - x1) / W × 10000)
height = round((y2 - y1) / H × 10000)

例如,原图尺寸是 1000 × 800,需要遮挡的矩形是 (100, 200)~(400, 300),换算结果为:

left   = 1000
top    = 2500
width  = 3000
height = 1250

6.3.4 第四步:生成 .msk1 文件

单个矩形遮罩的完整文件内容如下:

[
  {
    "width": 3000,
    "height": 1250,
    "top": 2500,
    "left": 1000,
    "index": 1,
    "type": "rect"
  }
]

多个遮挡区域写在同一个 JSON 数组中,index1 开始依次增加:

[
  {
    "width": 3000,
    "height": 1250,
    "top": 2500,
    "left": 1000,
    "index": 1,
    "type": "rect"
  },
  {
    "width": 2000,
    "height": 1000,
    "top": 5000,
    "left": 6000,
    "index": 2,
    "type": "rect"
  }
]

文件应以 UTF-8 编码保存,建议使用 .msk1 扩展名。当前已验证的矩形类型是:

"type": "rect"

不要让 AI 自行发明圆形、多边形或其他未经验证的 type

6.3.5 第五步:取得遮罩 ID 并写入卡片

原图和 .msk1 遮罩文件需要分别取得各自真实的 Markji file.id。遮罩文件在 Markji 中的媒体类型是 markji/mask。最后把两个 ID 写进同一个图片标签:

[Pic#ID/<原图file.id>,MID/<遮罩file.id>#]

其中 ID 始终对应原图,MID 始终对应 .msk1 遮罩文件。

6.3.6 预览图只用于检查

制作遮罩时,可以额外生成一张预览图,把半透明矩形覆盖到原图上,用于人工检查遮挡范围、编号和错位问题。

预览图不是真正的遮罩文件,不能把预览 PNG 或 JPG 的 file.id 填入 MID。正式的 MID 必须指向 .msk1 遮罩文件。

6.4 音频

音频引用格式:

[Audio#ID/<fileId>#<显示文字>]

常用参数:

参数 含义
ID/<fileId> 指定已有音频
M 手动播放
A 自动播放;不写 M 时也按自动播放处理
D 播放行为跟随用户设置

示例:

[Audio#M,ID/1kIC9#点击播放发音]
[Audio#ID/1kIC9,D#单词发音]
[Audio#A,ID/1kIC9#]

音频可以嵌入标题段落中:

[P#H1,center#[T#B#幸存者偏差][Audio#A,ID/1kIC9#]]

MA 不要同时使用。需要手动播放时写 M;需要自动播放时可以省略 A。显示文字可以为空,但仍要保留第二个 #,且显示文字中不要嵌套其他语法。

6.5 媒体引用的硬性规则

  • <fileId><imageFileId><maskFileId> 都只是文档占位符,实际制卡时必须替换为对应媒体上传后得到的真实 Markji file.id
  • 卡片语法中不能写本地路径、原始文件名、Anki media member、下载 URL 或 AI 临时编造的 ID。
  • 不要把图片或音频的 URL 填进 ID/...;这里需要的是 Markji 文件对象的 ID。
  • 图片和音频必须先得到真实 file.id,然后才能生成最终卡片语法。

6.6 file.id 大小写敏感

Markji 的 file.id 必须逐字符原样保留,包括大小写。例如:

1lVnm
1lVNM

这两个 ID 可能指向两张完全不同的图片,不能互换,也不能为了统一格式而全部转成小写或大写。

Windows 文件系统通常不区分文件名大小写。如果直接用裸 file.id 保存本地媒体,不同 ID 可能落到同一个路径。批量制卡时应:

  • 使用“稳定序号+原始 ID”的安全文件名,例如 0549-1lVnm.jpg
  • 用 manifest 记录源文件、上传结果和准确的 file.id
  • 回填时从 manifest 读取 ID,不要根据本地裸文件名猜测;
  • 写回前逐字符比对 ID,禁止大小写归一化。

7. 网页链接与卡片引用

网页链接和卡片引用是两种不同能力:网页链接跳转到外部 URL,卡片引用跳转到 Markji 中已有的卡片。不要混用两者的 ID 或地址。

7.1 网页链接

网页链接是 [T#...#...] 文本标签中的一种样式参数,基本格式是:

[T#link/"<URL>"#<显示文字>]

例如:

[T#link/"https://example.com"#查看资料来源]

链接也可以与加粗、颜色、上标等文本样式合并:

[T#B,!90959b,link/"https://example.com"#查看资料来源]

也可以放进段落标签:

[P#center#[T#!90959b,up,link/"https://example.com"#参考网页]]

网页链接的关键规则:

  • URL 两侧的英文双引号属于语法,不能省略。
  • 建议使用带完整协议的 https:// URL,不要只写域名。
  • URL 中的空格、中文、双引号、#、逗号等特殊字符应进行标准 URL 编码。
  • 特别注意:半角 # 会和 Markji 标签分隔符冲突,应编码为 %23;半角逗号会和样式参数分隔符冲突,应编码为 %2C
  • ?&= 等查询参数可以保留,但参数值中的特殊字符仍应正确编码。
  • 显示文字只是用户看到并点击的文本,不应把整段 URL 同时复制进显示文字,除非确实需要展示网址。

错误:URL 没有双引号。

[T#link/https://example.com#查看网页]

错误:URL 中包含未编码的片段井号。

[T#link/"https://example.com/page#section"#查看章节]

正确:

[T#link/"https://example.com/page%23section"#查看章节]

7.2 卡片引用

卡片引用的基本格式是:

[Card#ID/<root_id>#<显示文字>]

例如:

[Card#ID/4wJYw#参见相关卡片]

这里的 ID 必须是被引用卡片的 root_id,不是:

  • 当前牌组中的 card.id
  • deck_id
  • 图片或音频的 file.id
  • 卡片标题、序号或 AI 自行生成的字符串。

一个引用可以关联多张卡片。多个 root_id 使用半角短横线 - 连接:

[Card#ID/4wJYw-4wJYx#参见两张相关卡片]

卡片引用的关键规则:

  • Markji 当前编辑器最多允许一个引用关联 5 张卡片。
  • 多个 root_id 之间只能使用短横线连接,不能使用逗号、空格或换行。
  • 每个 root_id 都应从真实卡片数据中取得,并逐字符原样保留。
  • 不要从卡片 URL、标题或普通 card.id 猜测 root_id
  • 显示文字位于第二个 # 与结尾 ] 之间,用来告诉用户将跳转到什么内容。
  • 引用目标被删除、失效或无权访问时,引用可能无法正常打开;生成后应实际点击验证。

错误:误用 card.id 或其他长 ID。

[Card#ID/6a27f000c802d47fa569bc1d#参见相关卡片]

正确:使用目标卡片真实的 root_id

[Card#ID/4wJYw#参见相关卡片]

7.3 两种链接不要混淆

目标 语法 填入的标识
外部网页 [T#link/"<URL>"#显示文字] 完整、正确编码的 URL
Markji 卡片 [Card#ID/<root_id>#显示文字] 目标卡片的 root_id

网页链接不能写成 [Card#...],卡片引用也不能把 Markji 编辑页 URL 填入 link/"..." 来代替。两者在界面中的行为和引用关系不同。

8. 公式语法

8.1 给 AI 的硬性要求

公式必须使用下面的 Markji 公式标签:

[E##<LaTeX 公式内容>]

也可以直接告诉 AI:

公式要用 [E##LaTeX 公式内容],公式内容由 KaTeX 渲染,必须使用 KaTeX 支持的 LaTeX 语法。

Markji 使用 KaTeX 渲染公式,因此这里所说的 LaTeX,实际边界以 KaTeX 的函数支持表为准。

8.2 行内公式

E 可以和普通文字写在同一段中。行内公式不要求从行首开始,公式结束后也可以继续写普通文字:

速度 [E##v] 是位移变化量 [E##\Delta x] 与时间变化量 [E##\Delta t] 的比值。

8.3 独立公式

分式、根式和上下标可以各自作为独立公式:

[E##v=\frac{\Delta x}{\Delta t}]
[E##E_k=\frac{1}{2}mv^2]
[E##x=\frac{-b\pm\sqrt{b^2-4ac}}{2a}]

一张完整公式知识卡可以写成:

[P#H1,center#[T#B#动能公式]]
---
[E##E_k=\frac{1}{2}mv^2]

其中 [E##E_k] 表示动能,[E##m] 表示质量,[E##v] 表示速度。

独立公式的 [E## 必须从新一行开头开始,结束的 ] 后不要在同一行追加普通文字。公式内容可以换行:

[E##\begin{aligned}
a^2+b^2&=c^2
\end{aligned}]

行首限制只适用于独立公式,不适用于 8.2 节中的行内公式。

8.4 公式挖空

需要隐藏公式中的一部分时,把 F 标签放在 E 标签内部,并让 F 的内容直接写被隐藏的 LaTeX 片段:

斜率公式是 [E##k=[F#1#\frac{\Delta y}{\Delta x}]]。

上例中,第一个 ] 关闭 F,第二个 ] 关闭 E。挖空编号仍使用从 1 开始的正整数;相同编号仍表示同一组。

正确的嵌套方向是:

[E##公式前段[F#1#被挖空的 LaTeX]公式后段]

不要反向写成:

[F#1#[E##LaTeX 公式]]

目前只把 E 内嵌 F 作为已经验证的公式挖空写法,不据此推断其他标签也能放进 EF

如果旧版本或个别设备不能正常显示行内公式、公式选择题或公式挖空,请先把 Markji 升级到最新版本;升级后仍异常时,可暂时改用普通文字或图片,并通过页面底部入口反馈。

8.5 公式内容的规则

  • E 标签的两个 # 是固定语法,不能删减或改成一个 #
  • 第二个 # 后直接写公式内容,统一写成 [E##\frac{a}{b}]
  • 除 8.4 节中用于公式挖空的 F 外,标签内部只写 KaTeX 支持的 LaTeX 内容;不要把说明文字、题号或整段中文强行塞进公式。
  • 一个完整公式尽量放在一个 E 标签中,不要无意义地拆成多个相邻标签。
  • 题号、解释文字和括号说明通常放在 E 标签外,例如 (1) [E##v=v_0+at]
  • 常用写法包括分式 \frac{a}{b}、根式 \sqrt{x}、希腊字母 \Delta、函数 \sin、下标 _、上标 ^ 和花括号分组 {...}
  • 最终 Markji 内容必须保留 LaTeX 命令中的真实反斜杠,例如 \frac\Delta,不能在处理纯文本时丢失。
  • 不要编造 KaTeX 不支持的命令,也不要依赖额外 LaTeX 宏包;不确定时查阅 KaTeX 官方支持表。

8.6 不要再套其他公式定界符

[E##...] 已经是 Markji 的公式边界,内部不要再添加 Markdown 或普通 LaTeX 的公式定界符。

错误:

[E##$E=mc^2$]
[E##$$E=mc^2$$]
[E##\(E=mc^2\)]
[E##\[E=mc^2\]]

正确:

[E##E=mc^2]

9. 选择题语法

9.1 单选题

单选题使用 [Choice## 开始选择块。正确选项以 * 开头,错误选项以 - 开头,选择块最后必须用独占一行的 ] 关闭。

[T#B#001Q 真题卡片]
下列哪一项是正确的?
[Choice##
* 正确选项
- 错误选项一
- 错误选项二
- 错误选项三
]
---
这里填写答案解析。

单选块必须且只能有一个 * 正确选项。

9.2 多选题

正确选项超过一个时,必须使用 [Choice#multi#

[T#B#002Q 真题卡片]
下列哪些说法是正确的?
[Choice#multi#
* 正确选项一
- 错误选项
* 正确选项二
- 错误选项二
]
---
正确选项为第一项和第三项。这里填写详细解析。

不要在多个正确答案的题目中继续使用 [Choice##。选择块的类型应根据 * 的数量确定:

  • * 恰好一个:[Choice##
  • * 多于一个:[Choice#multi#

9.3 公式选择题

选择题的选项中可以直接使用完整的 [E##...] 公式标签。下面是一道固定选项顺序的公式单选题:

一元二次方程的求根公式是?
[Choice#fixed#
* [E##x=\frac{-b\pm\sqrt{b^2-4ac}}{2a}]
- [E##x=\frac{-b\pm\sqrt{b^2+4ac}}{2a}]
- [E##x=\frac{b\pm\sqrt{b^2-4ac}}{2a}]
]
---
正确答案为第一项。

公式选项与选择题参数可以正常组合:固定顺序使用 fixed,多选使用 multi,固定顺序的公式多选题使用 [Choice#fixed,multi#。每个公式仍需使用完整、独立闭合的 [E##...],不要让一个 E 标签跨越两个选项。

9.4 选择题结构注意事项

  • [Choice##[Choice#fixed#[Choice#multi# 必须从新一行开头开始。
  • 每个选项必须单独一行,并以 *- 开头。
  • 结束选择块的 ] 必须独占一行,不能遗漏。
  • --- 应放在完整选择块之后,用来分隔题目与解析。
  • 希望固定选项顺序时加入 fixed;省略时默认随机排列。多选并固定顺序时使用 [Choice#fixed,multi#
  • 选项内可以使用普通文字、[T#...#...] 文字样式和 [E##...] 公式。不要直接放挖空、音频、卡片引用或图片,也不要继续组合“公式选择题”和“公式挖空”形成未经验证的三层嵌套。
  • 选项文字中的普通中括号使用 \[\] 转义。

固定顺序的多选题示例:

以下哪些是哺乳动物?
[Choice#fixed,multi#
* 鲸
- 鲨鱼
* 蝙蝠
- 企鹅
]

10. 五套可复制模板

下面模板中的尖括号内容都是占位符,制卡时必须替换。不要把 <标题><imageFileId> 等占位内容原样写入正式卡片。

模板一:基础知识卡

[P#H1,center#[T#B#<中文标题>]]
[P#center#<外文标题,可删除此行>]
---
<正文>

模板二:富文本知识卡

[P#H1,center#[T#B#<标题>]]
---
<普通正文>
[T#B,U,!ff2600#<加粗、下划线并设为红色的重点>]
[T#!!fff2cc#<带背景色的补充内容>]
[E##<KaTeX 支持的 LaTeX 公式内容>]

模板三:带图片和音频的知识卡

[P#H1,center#[T#B#<标题>][Audio#ID/<audioFileId>#]]
---
[Pic#ID/<imageFileId>#]
---
<正文>

如果不需要让图片与正文分两次揭示,可以删除图片后的第二条 ---

[P#H1,center#[T#B#<标题>][Audio#ID/<audioFileId>#]]
---
[Pic#ID/<imageFileId>#]
<正文>

如果图片需要遮罩,把普通图片行替换为以下语法。<imageFileId><maskFileId> 必须分别替换:

[Pic#ID/<imageFileId>,MID/<maskFileId>#]

模板四:真题卡

单选版本:

[T#B#<序号>Q 真题卡片]
<题干>
[Choice##
* <唯一正确选项>
- <错误选项一>
- <错误选项二>
- <错误选项三>
]
---
<解析>

多选版本:

[T#B#<序号>Q 真题卡片]
<题干>
[Choice#multi#
* <正确选项一>
- <错误选项>
* <正确选项二>
- <错误选项二>
]
---
<解析>

需要固定选项顺序时,把开始行改为 [Choice#fixed#;多选并固定顺序时改为 [Choice#fixed,multi#

公式选项版本:

[T#B#<序号>Q 公式真题卡片]
<题干>
[Choice#fixed#
* [E##<唯一正确选项的 LaTeX>]
- [E##<错误选项一的 LaTeX>]
- [E##<错误选项二的 LaTeX>]
]
---
<解析>

模板五:分级无序列表与挖空

[P#H1#<标题>]
[P#L#<一级主题>]
[P#L,I2#<二级主题>]
[P#L,I3#[F#1#<需要回忆的三级内容>]]
[P#L,I4#[F#2#<需要回忆的四级内容>]]
---
<补充说明>

11. 常见错误

11.1 删除或移动答案线

错误结果:题目和答案出现在同一面,或者显示顺序改变。

处理原则:修改前后都要核对 --- 的数量和位置。

11.2 丢失真实换行

错误结果:段落、选择题选项和答案线粘连,语法无法按预期解析。

处理原则:以 UTF-8 文件中的真实内容为准,不要只看终端中被转义后的单行显示。

11.3 标签没有完整闭合

错误示例:

[P#H1,center#[T#B#标题]

正确示例:

[P#H1,center#[T#B#标题]]

处理原则:每个开始的 [ 都必须有对应的 ];嵌套标签需要分别闭合。

11.4 用多层标签堆叠同一段样式

不推荐:

[T#B#[T#U#重点]]

推荐:

[T#B,U#重点]

11.5 把 HTML 直接贴入卡片

错误结果:HTML 标签可能作为普通文字显示,或原有格式完全丢失。

处理原则:先把 HTML 转成 Markji 富文本,并比对转换前后的纯文本内容。

11.6 把媒体文件名或 URL 当作 file.id

错误示例:

[Pic#ID/demo.png#]
[Pic#ID/https://example.com/demo.png#]

正确示例:

[Pic#ID/1kIBX#]

11.7 改变 file.id 大小写

错误结果:引用到另一份媒体,或者媒体无法显示。

处理原则:把 ID 当作大小写敏感的不可变字符串,不做任何标准化。

11.8 图片遮罩的 IDMID 混淆

错误结果:遮罩无法加载、套到错误图片上,或者原图本身无法显示。

处理原则:固定使用 [Pic#ID/<原图 file.id>,MID/<遮罩 file.id>#];两项都从真实记录读取并逐字符核对,不能交换、留空或改写大小写。MID 必须对应 .msk1 遮罩文件,不能误用预览 PNG 或 JPG。

11.9 生成遮罩后又改变原图

错误结果:矩形遮挡区域整体偏移、尺寸不符,无法准确覆盖答案。

处理原则:以最终原图的准确像素尺寸计算归一化坐标;生成遮罩后不要继续裁剪、缩放或旋转原图。原图有变化时必须重新计算并生成 .msk1

11.10 公式仍使用 $...$ 或丢失反斜杠

错误结果:公式作为普通文本显示、渲染失败,或者 LaTeX 命令失去含义。

处理原则:最终卡片统一使用 [E##LaTeX 公式内容],不再套 $$$\(...)\[...];同时确认 \frac\sqrt 等命令中的反斜杠仍然存在。

11.11 多选题误用单选语法

错误示例:[Choice## 中出现两个或更多 *

处理原则:先统计正确选项数,再决定使用 [Choice## 还是 [Choice#multi#

11.12 网页链接没有引用或编码 URL

错误结果:链接无法打开,或者 URL 中的 #、逗号等字符破坏外层标签。

处理原则:使用 link/"URL",保留英文双引号,并对特殊字符进行标准 URL 编码。

11.13 卡片引用误用 card.id

错误结果:引用显示失效,或者无法定位目标卡片。

处理原则:[Card#ID/...#...] 中只能填写目标卡片真实的 root_id;多卡引用使用短横线连接,最多 5 个。

11.14 挖空编号无效或公式挖空方向写反

错误结果:挖空无法分组、公式无法渲染,或者标签在错误的位置提前闭合。

处理原则:普通挖空使用 [F#正整数编号#内容],编号从 1 开始;相同编号表示同一组,F 的内容中不再嵌套其他标签。制作公式挖空时,把 F 放进 E

[E##k=[F#1#\frac{\Delta y}{\Delta x}]]

不要把方向写反为 [F#1#[E##...]]

11.15 块级语法没有从行首开始

错误示例:

题目:[Choice##
* A
- B
]

正确示例:

题目:
[Choice##
* A
- B
]

处理原则:PChoicePic、独立 E--- 都从新一行的第一个字符开始。

11.16 普通中括号没有转义

错误:

[T#B#区间 [0,1]]

正确:

[T#B#区间 \[0,1\]]

处理原则:普通文字中的 [] 写成 \[\],语法本身的外层括号不要转义。

11.17 把行内公式误当成独立公式

错误认识:所有 [E##...] 都必须从新一行开头开始,公式后也不能继续写文字。

正确示例:

速度 [E##v] 是位移变化量 [E##\Delta x] 与时间变化量 [E##\Delta t] 的比值。

处理原则:只有独立公式需要从行首开始且结束后不追加同行文字;行内公式可以出现在普通段落的任意位置。

12. 发布前检查清单

每张卡在交付或写回前至少检查以下项目:

  • [ ] 内容是一整段完整的 Markji 语法文本,没有只生成局部片段。
  • [ ] 使用的是真实换行,不是普通字符 \n
  • [ ] --- 的数量和位置符合预期,且每条答案线独占一行。
  • [ ] 位于卡片末尾的 --- 后仍保留真实换行。
  • [ ] 所有 [] 成对闭合,嵌套标签的关闭顺序正确。
  • [ ] 标签名和参数使用规定的大小写,两个结构分隔 # 都存在,多个参数以半角逗号分隔。
  • [ ] 普通文本中的 [] 已写成 \[\],没有把语法外层括号错误转义。
  • [ ] 参数区没有会破坏结构的 #、半角逗号或换行。
  • [ ] PChoicePic、独立 E--- 都从新一行的第一个字符开始。
  • [ ] 没有在不支持的位置嵌套语法。
  • [ ] 同一段文字的多种样式合并在一个 [T#...#...] 标签中。
  • [ ] 颜色使用六位小写十六进制 RGB,且颜色值前没有多写一个 #
  • [ ] updown 没有同时使用,同一种参数没有重复或冲突。
  • [ ] 所有挖空都使用从 1 开始的正整数编号,分组符合预期;普通 F 内容中没有其他标签,公式挖空使用的是 E 内嵌 F
  • [ ] 网页链接使用 link/"URL",URL 两侧保留英文双引号,特殊字符已经正确编码。
  • [ ] URL 中没有会破坏语法的裸 # 或逗号,链接显示文字与目标网页相符。
  • [ ] 卡片引用使用 [Card#ID/<真实 root_id>#显示文字],没有误用 card.iddeck_idfile.id
  • [ ] 多卡引用的 root_id 使用短横线连接,数量不超过 5 个,并已实际点击验证。
  • [ ] 卡片中没有残留 <b><span><div><br> 等 HTML 标签。
  • [ ] 图片使用 [Pic#ID/<真实 file.id>#],音频使用 [Audio#ID/<真实 file.id>#显示文字] 或已确认的播放参数组合。
  • [ ] 需要画廊的图片标签彼此紧邻且没有空格或换行;需要独立图片区块时已分行。
  • [ ] 带遮罩图片使用 [Pic#ID/<原图 file.id>,MID/<遮罩 file.id>#]IDMID 顺序正确,中间是无空格的半角逗号。
  • [ ] 原图和遮罩使用各自真实的 file.id,两者没有交换、混用或被改写大小写。
  • [ ] .msk1 是 UTF-8 JSON 数组,每个已验证矩形都含 widthheighttopleftindextype: "rect"
  • [ ] 遮罩坐标按最终原图的准确宽高归一化到 0~10000,生成后原图没有再被裁剪、缩放或旋转。
  • [ ] MID 指向 .msk1 遮罩文件,没有误用用于人工检查的预览 PNG 或 JPG。
  • [ ] 所有媒体占位符均已替换,没有把文件名、路径或 URL 当成 ID。
  • [ ] file.id 与上传结果逐字符一致,大小写没有被改变。
  • [ ] 所有数学公式均使用 [E##<LaTeX 公式内容>],没有残留 $...$$$...$$\(...)\[...]
  • [ ] 公式中的反斜杠、花括号和上下标结构完整,所用命令位于 KaTeX 支持范围内。
  • [ ] 行内公式没有被误套独立公式的行首限制,前后普通文字与公式标签边界清晰。
  • [ ] 公式挖空使用 [E##公式前段[F#正整数编号#被挖空的 LaTeX]公式后段],两个标签按正确顺序闭合。
  • [ ] 独立公式从行首开始,结束的 ] 后没有同行普通文字。
  • [ ] 单选题恰好有一个 *,多选题有两个或更多 *
  • [ ] 需要固定选项顺序时使用了 fixed,固定多选使用了 fixed,multi
  • [ ] 公式选择题的每个公式选项都使用完整闭合的 [E##...],没有让标签跨越选项,也没有继续叠加未经验证的多层嵌套。
  • [ ] 选择题块以独占一行的 ] 正确结束,解析位于 --- 之后。
  • [ ] 去除语法标签后,卡片纯文本与原始材料基本一致,没有漏字、重复或错序。

13. 已验证边界

本文收录的是目前已经确认的制卡语法,包括:

  • 答案线与真实换行;
  • P 段落和 T 富文本;
  • 使用正整数分组的 F 挖空;
  • T 文本标签中的网页链接;
  • 使用目标卡片 root_idCard 卡片引用;
  • 图片、图片遮罩与音频的 file.id 引用;
  • 由 KaTeX 渲染的 [E##...] 行内公式与独立公式;
  • E 内嵌 F 的公式挖空;
  • 普通文字、文字样式或公式作为选项的单选与多选选择题;
  • HTML 转 Markji 富文本时使用的基础样式映射。

本文以墨墨开放 API 的官方制卡指南为基础,并用论坛真实卡片样本补充当前已经成功渲染、但官方嵌套表尚未同步的行内公式、公式选择题和公式挖空。除此之外,本文没有收录官方文档未列出、且尚未通过足够真实样本确认的候选标签或参数。遇到本文未覆盖的效果时,应先查阅官方文档,或从真实卡片中取得可复现样本并验证,不能让 AI 根据标签名称自行发明语法。

文档反馈