墨墨记忆卡(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#内容]
通用规则如下:
- 标签名和参数区分大小写,必须使用规定的
T、P、F、Choice、Pic、Audio、Card、E等形式。 - 第一个
#分隔名称与参数,第二个#分隔参数与内容;没有参数时也要保留两个#,例如[E##x+y]、[Choice##...]。 - 多个参数使用半角逗号分隔;标签名、参数和结构分隔符之间不要加入空格。
- 每个标签都必须用未转义的
]正确闭合,不要依赖错误语法被自动修复。 P段落、选择题、图片、独立公式和答案线属于块级语法,必须从新一行的第一个字符开始。- 普通段落不需要写成
[P##内容],直接输入文字即可。
嵌套时按下面的范围处理:
| 容器 | 可以放入的语法 |
|---|---|
| 普通段落 | T、F、Audio、Card、行内 E |
P 段落 |
T、F、Audio、Card |
Choice 选项 |
T、E |
T、F 的内容 |
不放其他标签 |
Audio、Card 的显示文字 |
不放其他语法 |
Pic |
内容必须为空 |
E 公式内容 |
KaTeX 内容;制作公式挖空时可放 F |
除 Choice 选项中的 E 和 E 公式中的 F 这两种已验证组合外,不要让行内语法互相嵌套。P、Choice、Pic、独立 E 和 --- 不要放进其他语法内部,也不要把两种例外继续组合成未经验证的多层嵌套。
3. 转义与特殊字符¶
在普通文字或标签的内容区中,需要显示半角中括号本身时,用反斜杠转义:
| 想显示 | 应输入 |
|---|---|
[ |
\[ |
] |
\] |
例如:
数学中的闭区间可以写作 \[0,1\]。
[T#B#请阅读第 \[3\] 章]
只转义作为普通文字显示的中括号,真正的语法外层括号不要转义。内容区中的 # 和半角逗号通常可以直接写;参数区中的 #、半角逗号和换行具有结构含义,不能当普通字符使用。
反斜杠只有紧挨中括号时才用于这里的转义。公式中的 LaTeX 反斜杠应按公式原样书写。全角 []# 会改变实际字符,只在确实需要展示全角字符时使用,不再作为默认转义方案。
4. 段落与标题语法¶
4.1 段落标签¶
已验证的基本形式是:
[P#段落样式#段落内容]
常用样式:
| 用途 | 写法 | 说明 |
|---|---|---|
| 一级居中标题 | [P#H1,center#内容] |
H1 与 center 组合使用 |
| 普通居中段落 | [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 表示无序列表,不要自行生成有序列表、折叠或行内代码等未列出的参数。
分级无序列表可以把 L 和 I<n> 组合,并在段落内容中使用挖空:
[P#L#一级主题]
[P#L,I2#二级主题]
[P#L,I3#[F#1#需要回忆的三级主题]]
[P#L,I4#[F#2#更深一层的内容]]
整个 P 标签尽量写在同一行。P 的内容可以包含 T、F、Audio 和 Card,但这些行内语法之间不要互相嵌套。
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"
没有使用到的样式直接省略。up 和 down 不要同时使用;同一种参数不要重复,多个颜色或多个对齐方式也不要冲突。不要为了叠加样式生成多层不必要的嵌套标签,也不要在 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>填原图真实的 Markjifile.id;MID/<maskFileId>填遮罩文件真实的 Markjifile.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 数组中,index 从 1 开始依次增加:
[
{
"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#]]
M 和 A 不要同时使用。需要手动播放时写 M;需要自动播放时可以省略 A。显示文字可以为空,但仍要保留第二个 #,且显示文字中不要嵌套其他语法。
6.5 媒体引用的硬性规则¶
<fileId>、<imageFileId>和<maskFileId>都只是文档占位符,实际制卡时必须替换为对应媒体上传后得到的真实 Markjifile.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 作为已经验证的公式挖空写法,不据此推断其他标签也能放进 E 或 F。
如果旧版本或个别设备不能正常显示行内公式、公式选择题或公式挖空,请先把 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 图片遮罩的 ID 与 MID 混淆¶
错误结果:遮罩无法加载、套到错误图片上,或者原图本身无法显示。
处理原则:固定使用 [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
]
处理原则:P、Choice、Pic、独立 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。 - [ ]
---的数量和位置符合预期,且每条答案线独占一行。 - [ ] 位于卡片末尾的
---后仍保留真实换行。 - [ ] 所有
[和]成对闭合,嵌套标签的关闭顺序正确。 - [ ] 标签名和参数使用规定的大小写,两个结构分隔
#都存在,多个参数以半角逗号分隔。 - [ ] 普通文本中的
[、]已写成\[、\],没有把语法外层括号错误转义。 - [ ] 参数区没有会破坏结构的
#、半角逗号或换行。 - [ ]
P、Choice、Pic、独立E和---都从新一行的第一个字符开始。 - [ ] 没有在不支持的位置嵌套语法。
- [ ] 同一段文字的多种样式合并在一个
[T#...#...]标签中。 - [ ] 颜色使用六位小写十六进制 RGB,且颜色值前没有多写一个
#。 - [ ]
up与down没有同时使用,同一种参数没有重复或冲突。 - [ ] 所有挖空都使用从
1开始的正整数编号,分组符合预期;普通F内容中没有其他标签,公式挖空使用的是E内嵌F。 - [ ] 网页链接使用
link/"URL",URL 两侧保留英文双引号,特殊字符已经正确编码。 - [ ] URL 中没有会破坏语法的裸
#或逗号,链接显示文字与目标网页相符。 - [ ] 卡片引用使用
[Card#ID/<真实 root_id>#显示文字],没有误用card.id、deck_id或file.id。 - [ ] 多卡引用的
root_id使用短横线连接,数量不超过 5 个,并已实际点击验证。 - [ ] 卡片中没有残留
<b>、<span>、<div>、<br>等 HTML 标签。 - [ ] 图片使用
[Pic#ID/<真实 file.id>#],音频使用[Audio#ID/<真实 file.id>#显示文字]或已确认的播放参数组合。 - [ ] 需要画廊的图片标签彼此紧邻且没有空格或换行;需要独立图片区块时已分行。
- [ ] 带遮罩图片使用
[Pic#ID/<原图 file.id>,MID/<遮罩 file.id>#],ID与MID顺序正确,中间是无空格的半角逗号。 - [ ] 原图和遮罩使用各自真实的
file.id,两者没有交换、混用或被改写大小写。 - [ ]
.msk1是 UTF-8 JSON 数组,每个已验证矩形都含width、height、top、left、index和type: "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_id的Card卡片引用; - 图片、图片遮罩与音频的
file.id引用; - 由 KaTeX 渲染的
[E##...]行内公式与独立公式; E内嵌F的公式挖空;- 普通文字、文字样式或公式作为选项的单选与多选选择题;
- HTML 转 Markji 富文本时使用的基础样式映射。
本文以墨墨开放 API 的官方制卡指南为基础,并用论坛真实卡片样本补充当前已经成功渲染、但官方嵌套表尚未同步的行内公式、公式选择题和公式挖空。除此之外,本文没有收录官方文档未列出、且尚未通过足够真实样本确认的候选标签或参数。遇到本文未覆盖的效果时,应先查阅官方文档,或从真实卡片中取得可复现样本并验证,不能让 AI 根据标签名称自行发明语法。