math-card-import
数学 Anki 卡片导入。将 Markdown 格式的数学知识卡批量导入 Anki(通过 AnkiConnect), 自动处理 MathJax 公式渲染兼容性($...$ → \(...\) 转换)、配图复制、HTML 格式化。 触发条件:用户提到"导入anki"、"anki卡片"、"数学anki"、"牌组导入"、公式在 Anki 中显示不正确、$...$ 公式不渲染、MathJax 兼容性问题、创建/修改/完善 Anki 数学卡片、调整卡片格式。 也用于:已有 Anki 卡片公式显示异常的诊断和批量修复。
来源信息
- 仓库
- yang0/chuzhong-cards
- 最近来源活动
- 2026年7月10日 14:40
- 检测到的 SKILL.md 语言
- 中文
- 星标
- 0
- 分支
- 1
安装方式
默认使用会先检查来源的 Prompt;你也可以切换为直接命令,或下载本地副本。
检查来源文件
决定是否安装前,请先阅读 SKILL.md,以及 SkillsMP 当前展示的配套文件。
正在显示 SKILL.md
SKILL.md
来源说明 · 只读预览- name
- math-card-import
- description
- 数学 Anki 卡片导入。将 Markdown 格式的数学知识卡批量导入 Anki(通过 AnkiConnect), 自动处理 MathJax 公式渲染兼容性($...$ → \(...\) 转换)、配图复制、HTML 格式化。 触发条件:用户提到"导入anki"、"anki卡片"、"数学anki"、"牌组导入"、公式在 Anki 中显示不正确、$...$ 公式不渲染、MathJax 兼容性问题、创建/修改/完善 Anki 数学卡片、调整卡片格式。 也用于:已有 Anki 卡片公式显示异常的诊断和批量修复。
# 数学 Anki 卡片导入
将 Markdown 格式的数学知识卡批量导入 Anki,自动处理公式渲染兼容性。
## 前置条件
- Anki 已启动,AnkiConnect 插件可用(默认 `localhost:8765`)
- 卡片以 Markdown 文件编写,放在 `G:/初中/数学/` 目录下
## 卡片 Markdown 格式
每张卡片用 `### 卡N` 分隔,包含以下字段:
```markdown
### 卡1
**配图:** 
**提问:** 同底数幂相乘的公式是什么?
**答案:** $a^m \cdot a^n = a^{m+n}$。
**易错分析:** 底数不变,指数相加。
**记忆钩子:** 底同指加,乘对加。(可选字段)
```
### 字段说明
| 字段 | 必须 | 说明 |
|------|------|------|
| `**配图:**` | 否 | 图片路径,相对于 md 文件的子文件夹。支持 webp/png/jpg |
| `**提问:**` | 是 | 卡片正面内容,支持行内公式 |
| `**答案:**` | 是 | 卡片背面内容,支持行内和显示公式 |
| `**易错分析:**` | 否 | 红色文字显示的易错提醒 |
| `**记忆钩子:**` | 否 | 绿色文字显示的助记口诀 |
### 公式语法
在 Markdown 源文件中使用标准 LaTeX 语法:
- **行内公式**:`$a^2 + b^2 = c^2$` — 导入时自动转为 `\(...\)` 格式
- **显示公式(块级)**:`\[ ... \]` 或 `$$ ... $$` — 保留原始格式
导入脚本位于 `G:/初中/数学/import_math_to_anki.py`。
## MathJax 公式兼容性(关键知识点)
**这是最容易出错的部分,务必理解。**
### 问题
Anki(2.1.50+)内置 MathJax,但仅默认支持:
- `\(...\)` 行内公式 ✅
- `\[...\]` 显示公式 ✅
- `$...$` 行内公式 ❌ **不支持**
如果直接将包含 `$...$` 的文本导入 Anki,公式会显示为原始 `$a^2$` 而不是渲染后的数学符号。
### 解决方案
导入脚本中的 `convert_inline_math()` 函数自动处理转换:
```python
def convert_inline_math(text):
"""将 $...$ 行内公式转换为 Anki 支持的 \(...\) 格式。
跳过 $$...$$ 和 \[...\] 显示公式块。"""
return re.sub(
r'(?<!\$)\$(?!\$)(.*?)(?<!\$)\$(?!\$)',
r'\(\1\)',
text
)
```
**转换规则:**
- `$x^2$` → `\(x^2\)`(行内公式,转换为 `\(...\)`)
- `$$x^2$$` → `$$x^2$$`(显示公式,不转换)
- `\[x^2\]` → `\[x^2\]`(显示公式,不转换)
### 显示公式的换行保护
`preserve_display_math()` 函数处理 `\[...\]` 和 `$$...$$` 块:
- 块内的换行符替换为空格(防止被 `html_field()` 转成 `<br>`)
- 块外的换行符正常转为 `<br>`
### 两个字段的不同处理
| 字段 | 处理方式 | 原因 |
|------|----------|------|
| Front | `convert_inline_math()` 仅转换公式 | 正面通常为单行文本,不需要 `<br>` |
| Back | `html_field()` 转换公式 + 换行转 `<br>` + 保护显示公式 | 背面可能有多行答案、易错分析、记忆钩子 |
## 导入流程
### 标准导入
```bash
cd G:\初中
python 数学/import_math_to_anki.py
```
这会:
1. 清空现有"数学"牌组
2. 扫描 `数学/` 下所有 `.md` 文件
3. 解析卡片、转换公式、复制配图
4. 批量导入 Anki(每批 30 张)
### 仅导入特定文件
修改 `import_math_to_anki.py` 中的 `md_files` 路径过滤,或编写针对性的导入脚本。
## 修复已有卡片公式
当发现已导入的卡片公式不显示时:
### 批量修复(推荐)
```python
# 对现有多有卡片执行 convert_inline_math
for note in all_notes:
new_front = convert_inline_math(front)
new_back = convert_inline_math(back)
invoke_anki("updateNoteFields", {
"note": {"id": note_id, "fields": {
"Front": new_front, "Back": new_back
}}
})
```
然后重新导入整个牌组。
### 单张卡片修复
1. 在 Anki 浏览器中找到卡片
2. 修改字段中的 `$...$` 为 `\(...\)`
3. 保存
### 验证
检查卡片是否使用正确的格式:
```python
# 好的格式(能渲染)
"已知 \(a^2 + a - 1 = 0\),怎样处理含 \(a^3\) 的式子?"
# 坏的格式(不能渲染)
"已知 $a^2 + a - 1 = 0$,怎样处理含 $a^3$ 的式子?"
```
## AnkiConnect API 参考
导入脚本使用的关键 API:
| 操作 | action | 说明 |
|------|--------|------|
| 检查连接 | `version` | 返回 AnkiConnect 版本号 |
| 获取牌组 | `deckNames` | 列出所有牌组 |
| 创建牌组 | `createDeck` | `{"deck": "数学"}` |
| 查询卡片 | `findNotes` | `{"query": 'deck:"数学"'}` |
| 批量导入 | `addNotes` | `{"notes": [...]}` |
| 删除卡片 | `deleteNotes` | `{"notes": [id1, id2]}` |
| 更新字段 | `updateNoteFields` | `{"note": {"id": ..., "fields": {...}}}` |
| 获取媒体路径 | `getMediaDirPath` | 返回 `collection.media` 目录 |
| 卡片详情 | `notesInfo` | `{"notes": [id1, id2]}` |
## 常见问题
### Q: 卡片导入后公式显示为原始 `$...$` 文本
**原因**:公式使用了 `$...$` 格式,Anki 默认不支持。
**解决**:运行修复脚本转换所有 `$...$` → `\(...\)`,或重新导入(导入脚本已自动转换)。
### Q: 显示公式 `\[...\]` 内部出现多余的 `<br>`
**原因**:`html_field()` 将显示公式块内的换行符错误地转成了 `<br>`。
**解决**:确保 `preserve_display_math()` 在 `html_field()` 中被优先调用。导入脚本 v2 已修复此问题。
### Q: AnkiConnect 连接失败 "Connection refused"
**原因**:Anki 未启动或 AnkiConnect 插件未安装。
**解决**:
1. 确保 Anki 正在运行
2. 检查 AnkiConnect 插件是否已安装(工具 → 附加组件 → 搜索 AnkiConnect)
3. 确认端口 8765 未被占用
### Q: 配图不显示
**原因**:图片路径错误或未复制到 Anki 媒体文件夹。
**解决**:
1. 检查 md 文件旁是否有同名子文件夹存放 webp 图片
2. 路径格式:`**配图:** `
3. 导入脚本会自动复制图片到 Anki 的 `collection.media` 目录
## 项目文件结构
```
G:/初中/数学/
├── import_math_to_anki.py # 主导入脚本
├── 七年级下册/
│ ├── 错题补充-代数易错记忆.md # 卡片源文件
│ ├── 错题补充-代数易错记忆/ # 配图文件夹(webp)
│ │ ├── 01.webp
│ │ └── ...
│ ├── 重要知识点补充-实数坐标系不等式统计.md
│ └── 重要知识点补充-实数坐标系不等式统计/
│ └── ...
```
## 添加新卡片
1. 在对应的 `.md` 文件中按格式添加新的 `### 卡N` 块
2. 如果需要配图,将图片放入同名的子文件夹
3. 公式统一使用 `$...$` 写法(导入时自动转换)
4. 运行 `python 数学/import_math_to_anki.py` 重新导入
在 GitHub 查看