# 生成 Anki 问答卡片与 Cloze 填空卡片

Canonical page: https://ankiforge.dev/zh-cn/docs/cards/
Language: zh-CN
Description: 用代码批量生成 Anki 问答（Basic）卡片与 Cloze 填空卡片。经过验证的 Rust 示例用两条笔记生成三张卡片。

用代码批量生成 Anki 问答（Basic）卡片和 Cloze 填空（挖空）卡片，无需在 Anki 中逐张添加。Basic 笔记有正面和背面。Cloze 笔记针对每个受支持的填空编号生成一张卡片。本例用 Rust 创建两条笔记和三张卡片。Python 和 Node.js 提供相同的 `Note.basic` 与 `Note.cloze` 构造方法，参见 [Python API](https://ankiforge.dev/zh-cn/docs/python-api/#project-and-note-values) 和 [Node API](https://ankiforge.dev/zh-cn/docs/node-api/#project-and-notes)。

在仓库根目录运行：

```sh
cargo run --locked -p ankiforge --example docs_workflow -- target/docs-examples
```

在 Anki 中打开 `target/docs-examples/cards.apkg`。Basic 的问题为 **hola**；两张 Cloze 卡片分别隐藏 **Madrid** 和 **Spain**。

## 编写笔记

此函数摘自[完整可执行程序](https://github.com/morehardy/anki-forge/blob/main/anki_forge/examples/docs_workflow.rs)。其中的 `verify` 辅助函数检查成功输出的笔记、卡片与媒体数量。

```rust
fn cards(output: &Path) -> anyhow::Result<()> {
    let mut project = Project::new("docs-spanish")?.default_deck("Spanish");
    project.add("hola", Note::basic("hola", "hello"))?;
    project.add(
        "capital",
        Note::cloze("{{c1::Madrid}} is in {{c2::Spain}}.")
            .field("back_extra", "A city and its country."),
    )?;
    let built = project.build(BuildOptions::to(output.join("cards.apkg")))?;
    verify(&built, 2, 3, 0)?;
    Ok(())
}
```

`Project::new` 的第一个参数是稳定命名空间。每次 `add` 都需要稳定的源记录键。把同一个键用于另一条笔记会失败；库不会根据内容自动分配键。基于之前分发的包构建更新时，在同一键下修改答案仍表示同一条逻辑笔记。

## 文本、字段与卡片身份

Basic 和 Cloze 的字符串均为 Text。有意使用 HTML 时，调用 `Content::html`；Text 内仍会识别 Cloze 填空语法。`back_extra` 是内置 Cloze 附加字段键。文本、HTML、图片与声音都使用同一个 `Note::field` 方法。

使用 `{{c1::answer}}` 或 `{{c1::answer::hint}}`。普通句子不会提供 Cloze 问题。支持的填空编号为 1–500；修改编号可能改变卡片身份。应通过[比较和更新策略](https://ankiforge.dev/zh-cn/docs/updates/)检查此类更改。

接下来可以添加[媒体](https://ankiforge.dev/zh-cn/docs/media/)、[自定义模型](https://ankiforge.dev/zh-cn/docs/custom-notetypes/)或[图片遮挡](https://ankiforge.dev/zh-cn/docs/image-occlusion/)。
