深入解读 novelWriter 示例项目:从 `4f30ee54cca20.md` 看正文文档格式与标签引用机制

发布时间:2026/10/6 12:13:28
深入解读 novelWriter 示例项目:从 `4f30ee54cca20.md` 看正文文档格式与标签引用机制 桌面应用【免费下载链接】novelWriternovelWriter is an open source plain text editor designed for writing novels项目地址https://gitcode.com/gh_mirrors/no/novelWriter点击查看免费下载novelWriter 是一款面向长篇小说写作的开源纯文本编辑器其核心设计思想是项目的章节结构由文档中的标题推导故事的元数据视角、地点、角色等由开头的关键字注入正文。本文以仓库内置示例项目sample/content/4f30ee54cca20.md这一章正文为解剖样本逐层拆解 novelWriter 正文文档的文件头元数据、标题层级、标签Tag与引用Reference语法并结合源码与官方文档验证其底层实现。读完本文你将掌握 novelWriter 项目文件的存储格式、正文语法规则以及如何在自己的项目里复用这套“标签引用”的故事组织方法。一、这份示例文档到底是什么sample/content/4f30ee54cca20.md位于仓库示例项目的content目录下是官方随项目分发的示例小说以《爱丽丝梦游仙境》第一章“Down the Rabbit-Hole”为蓝本中的一个场景文档。它本身不是一篇技术说明而是一份真实的 novelWriter 正文数据文件——这正是它最有价值的地方通过它可以直接观察 novelWriter 在实际项目中如何保存一篇场景正文包括文档文件头的元数据TOML 风格的块标题语法###三级场景标题引用关键字pov、location正文的 Markdown 风格段落与内联强调语法。在 novelWriter 中这种文件被称为novel document小说文档与其相对的是存放角色、地点、时间线等设定信息的note笔记文档。两者都存放在项目根目录的content子文件夹中文件名是 12 位十六进制随机句柄加.md扩展名docs/source/technical/storage.rst 中说明扩展名为.nwd示例仓库中实际使用.md。二、文件头元数据TOML 风格块文档的前 10 行是一个以包裹的元数据块采用 TOML 键值对格式 name What a curious feeling! parent 806f17f87c4ff handle 4f30ee54cca20 class NOVEL layout DOCUMENT textHash b8239e522fe226307d4e969987c617dcc8369a7b createdDate 2025-11-01 21:23:13 updatedDate 2025-11-02 16:02:28 各字段含义如下字段含义说明name文档标签label显示在项目树中的文档名这里是场景的暂定标题parent父节点句柄指向所在章节文档的句柄即806f17f87c4ff章节“Down the Rabbit-Hole”handle文档句柄12 位十六进制随机数也是文件名主体用于跨平台安全命名class文档类别NOVEL表示小说正文文档笔记类则为CHARACTER、WORLD、PLOT等layout布局当前格式版本下主要是DOCUMENT正文与NOTE笔记两类textHash正文哈希内容指纹用于快速判断文档是否被外部改动createdDate/updatedDate创建/更新时间写入时间戳这些元数据的解析逻辑可以在源码 novelwriter/core/document.py 中找到文件读取时通过解析器获取handle、textHash等字段见readDocument中对parser.getStr(None, handle, )、parser.getStr(None, textHash, )的调用保存时则会重新计算textHash并写回writeDocument中的writeHash与self._meta.textHash writeHash。官方文档 docs/source/technical/storage.rst 同时提示如果直接在外部编辑器中修改content下的正文文件novelWriter 的索引不会自动更新重开项目后需要从Tools 菜单 → Rebuild Index或快捷键F9重建索引。三、标题层级###场景标题如何定义结构在 novelWriter 中项目的故事结构不是由文档划分的而是由文档内的标题层级推导出来的。正文第 11 行的### What a curious feeling!就是一个三级标题#一级标题表示新的卷Partition / Part##二级标题表示新的章节Chapter###三级标题表示新的场景Scene####四级标题表示新的小节Section。本示例文档name为“What a curious feeling!”其parent指向章节文档806f17f87c4ff.md标题为## Down the Rabbit-Hole两者共同构成“章节 → 场景”的父子层级。这正是 docs/source/usage/chapters_and_scenes.rst 所描述的规则对于 Novel 类根文件夹中的文档是标题决定该文档属于章节还是场景一个文档可以包含多个标题但项目树中显示的首个标题决定其图标与信息。此外标题层级还支持#!、##!、###!变体#!用于书籍封面主标题##!表示不参与自动编号的章节如序言、后记###!用于区分“软场景分隔”与“硬场景分隔”这些只在Manuscript Build工具生成文稿时才体现差异。注意#与标题文字之间必须有一个空格编辑器会根据正确格式自动改变标题的颜色与字号。四、标签与引用pov、location的底层机制4.1 示例文档中的引用写法正文第 13–14 行是文档最核心的“元数据注入”pov: Alice location: Down the Rabbit-Hole这两行分别表示pov: Alice—— 本场景的**视角角色point-of-view**是 Alicelocation: Down the Rabbit-Hole—— 本场景发生的地点是 Down the Rabbit-Hole。它们必须紧跟在标题之后、正文之前并且要求以开头、独占一行。在编辑器中正确解析的关键字与已定义的标签会被高亮着色无效引用则会显示波浪下划线。4.2 引用关键字的完整清单novelWriter 将关键字分为两类标签Tag与引用Reference。引用关键字在源码 novelwriter/constants.py 的nwKeyWords类中集中定义关键字含义目标标签类别tag定义标签唯一标识一个笔记文档任意笔记pov当前场景的视角角色角色Characterfocus当前场景中非视角的焦点角色角色Characterchar当前场景出现的其他角色角色Characterplot当前场景推进的情节/支线情节Plottime当前场景涉及的时间线时间线Timelinelocation当前场景发生的地点地点World/Locationobject当前场景中出现的物品物件Objectentity当前场景中出现的实体实体Entitycustom自定义类别引用自定义Customstory引用其他小说文档章节/场景小说Novelmention提及但未在场的角色/地点任意类别引用格式为keyword: value1, value2 ... valueN所有引用关键字都支持多个值用逗号分隔。KEY_CLASS映射表POV_KEY → nwItemClass.CHARACTER、WORLD_KEY → nwItemClass.WORLD等决定了每个关键字必须指向哪个根文件夹类型下的标签这也是编辑器校验引用合法性的依据。4.3 标签的用法先定义后引用引用之所以能生效前提是项目里已经存在对应的标签。标签通过tag关键字定义在笔记文档中基本格式为# Character: Jane Doe tag: Jane | Jane Doe Some information about the character Jane Doe.其中Jane是tagName项目内必须唯一且不可与其他标签冲突Jane Doe是可选的显示名Display Name在 Manuscript Build 生成章节标题时可用显示名替换缩写形式的tagName。每个标题只能设置一个tag但可同时设置多个引用。标签按“所在根文件夹类型”自动归类笔记放在Characters根文件夹下tag: Alice就被索引为一个角色放在Locations根文件夹下则被索引为地点。自 novelWriter 2.2 起标签不再区分大小写2.3 起支持显示名2.6 起小说文档本身也可以设置标签用于章与章之间的交叉引用对应story关键字详见 docs/source/usage/tags_and_references.rst。回到示例文档pov: Alice之所以有效正是因为示例项目中存在一个标签为Alice的角色笔记文档location: Down the Rabbit-Hole同理对应一个地点笔记。标签与引用配对后Outline View大纲视图与文档查看器下方的References面板会展示这些关联方便从角色、地点反向查找所有相关场景。4.4 编辑器辅助与索引维护自动补全在编辑器新行输入会弹出自动补全菜单先提示关键字输入:后再提示已定义标签列表多个引用可用,连续输入。为不存在的标签建笔记若引用了尚未定义的标签可右键选择Create Note for TagnovelWriter 会自动在对应类型的根文件夹中生成带新标签的笔记。索引重建所有标签与引用由项目索引收集。若高亮显示与实际标签不一致索引过期按F9或选择Tools → Rebuild Index即可重建正常情况下文档保存时会自动更新索引。五、正文段落与内联格式示例中的 Markdown 子集5.1 段落规则示例正文第 16 行起的文本展示了 novelWriter 的段落规则空行分隔段落单个换行视为段内换行。这与 docs/source/usage/basic_formatting.rst 的描述一致——不要用缩进模拟新段落否则会被视为同一段落中的两行影响 Manuscript Build 中依赖段落边界的所有排版功能。5.2 内联强调示例第 22 行的_one_ respectable person就是 novelWriter 支持的 Markdown 强调子集之一。完整支持的内联语法语法效果_text_斜体强调**text**粗体强烈强调*text*粗体可选需在设置中启用2026.1 起支持~~text~~删除线text高亮注意边界规则强调标记与文字之间不能有空格**与_同时使用时下划线必须在内侧强调不能跨行且标题与元数据行不支持任何内联格式。必要时可用\*、\_、\~转义输出字面字符。对话文本如示例中的引号内容在编辑器中会得到专门的着色与排版处理相关细节可参考 docs/source/features/dialogue.rst。六、把示例语法迁移到自己的项目如果你希望在自己的 novelWriter 项目中复刻这套写法可按照以下步骤操作建立笔记根文件夹在项目树中创建Characters、Locations等根文件夹对应pov/char与location的目标类别。写角色/地点笔记在每个笔记文档中用#写一个标题紧跟tag: 标签名定义唯一标签。写章节与场景在 Novel 根文件夹中章节文档用##标题场景文档用###标题标题下紧邻写pov、location等引用行。验证高亮正确解析的关键字会被着色若有波浪线检查标签是否已定义、索引是否过期。在 Manuscript Build 中利用元数据构建文稿时可将pov的角色显示名直接插入章节标题实现“每章标注视角人物”的效果。如果要手工查看或核对上述文件的真实形态可直接在仓库内打开场景正文示例sample/content/4f30ee54cca20.md章节父文档sample/content/806f17f87c4ff.md项目主文件XML 结构与设置sample/nwProject.nwx关键字常量定义novelwriter/constants.py文档读写实现novelwriter/core/document.py官方格式说明docs/source/more/project_format.rst、docs/source/technical/storage.rst标签与引用详解docs/source/usage/tags_and_references.rst七、小结sample/content/4f30ee54cca20.md虽然只是一段不足 300 词的小说正文却浓缩了 novelWriter 的核心数据模型TOML 元数据头 Markdown 标题层级 关键字标签/引用 纯文本段落。理解这份文件就等于理解了 novelWriter 项目存储格式的骨架文档以随机句柄命名存放在content目录结构由nwProject.nwx维护标签与引用由项目索引收集后驱动大纲视图、角色/地点面板与文稿构建。对写作者而言这套机制意味着可以用纯文本完成“角色—场景—地点”的结构化标注对开发者而言constants.py中的关键字常量表与document.py中的读写逻辑则给出了最直接的解析与落盘实现参考。赞分享桌面应用【免费下载链接】novelWriternovelWriter is an open source plain text editor designed for writing novels项目地址https://gitcode.com/gh_mirrors/no/novelWriter点击查看免费下载相关推荐novelWriter 角色文档存储格式深度解析从示例角色文件看 TOML 元数据、句柄与标签索引机制novelWriter 角色文档存储格式深度解析从示例角色文件看 TOML 元数据、句柄与标签索引机制 导读 本文以 novelWriter 仓库自带示例项目桌面应用CANN ops-math 算子实战解析aclnnReplicationPad2dBackward 复现填充 2D 反向传播接口完全指南CANN ops math 算子实战解析aclnnReplicationPad2dBackward 复现填充 2D 反向传播接口完全指南 CANN ops m桌面应用novelWriter 场景文档格式深度解析从示例项目 Alice getting very tired 看小说文档的存储与标记规范novelWriter 场景文档格式深度解析从示例项目 Alice getting very tired 看小说文档的存储与标记规范 本篇技术指南以 no桌面应用上一篇LookOnceToHear多GPU分布式训练实战指南PyTorch Lightning DDP WandB实验跟踪 Slurm集群任务提交下一篇OSS-Fuzz与软件可扩展性测试系统在负载增长时的安全性创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询