桌面应用【免费下载链接】novelWriternovelWriter is an open source plain text editor designed for writing novels项目地址https://gitcode.com/gh_mirrors/no/novelWriter点击查看免费下载导读本文以 novelWriter 示例项目sample/content/6a2d6d5f4f401.md即 Basic Formatting 章节文档为入口系统讲解 novelWriter 小说写作的三套核心语法用于跨文档引用的tag标签体系、不计入字数的%注释体系含%Story/%Note结构注释以及决定小说章节/场景结构的 Markdown 标题语法。读完本文你将掌握在 plain text 文档中书写元数据、组织章节场景、并为后续稿本Manuscript构建与大纲导出打好语法基础的全部要点。novelWriter 是一款面向小说写作的开源纯文本编辑器它把整部小说的结构信息直接写进人类可读的纯文本文件里——没有表单、没有数据库表一切都通过文档内的一小套「元数据语法」来表达。示例项目sample/中的每一篇文档都是这套语法的活教材文档正文顶部是 TOML 风格的元数据头name、handle、class、layout等正文则混合使用标题、标签、注释和普通段落。下面我们沿着6a2d6d5f4f401.md这篇 Basic Formatting 文档逐层拆解。一、tag为标题定义跨文档唯一标签示例文档第 15 行给出了标签语法的最小示例tag: Formatting规则要点标签Tag是你在某个标题heading下定义的一个词或短语用来给这段内容一个可被其他文档引用的身份。一个标题只能设置一个标签且标签必须在整个项目内全局唯一所有文档合计这是项目索引能够可靠解析引用的前提。标签与标题绑定而不是与整个文档绑定——同一文档内可以有多个标题从而定义多个标签。示例项目的角色笔记 sample/content/14298de4d9524.md 就是典型同一文件里# John Smith下定义tag: John | John Smith# Bob Smith下定义tag: Bob | Robert Smith两个角色互不干扰还能用char相互引用。带显示名的形式tag: John | John Smith|左边是项目内部使用的唯一标识tagName必填右边是构建稿本时用于章节标题等位置的显示名可选。默认情况下稿本会使用tagName本身当你内部习惯用短名、出版标题需要全名时显示名就派上了用场。从源码看这套规则被硬编码在关键词常量类nwKeyWords中novelwriter/constants.py其中TAG_KEY tag索引层在 novelwriter/core/index.py 的checkThese()中校验tag只接受第一个值且当该标签已存在时必须指向当前文档句柄才算合法重复标签会以波浪线标红。parseValue()index.py负责把|拆成(名称, 显示名)两段。标签最终通过setHeadingTag()写进标题索引novelwriter/core/indexdata.py并驱动大纲视图、引用面板与稿本构建。1.1 标签引用关键词一览定义好标签后就可以在其他文档中用引用关键词把它「挂」到某个章节或场景上。完整关键词集同样定义在nwKeyWordsconstants.py每个关键词只能引用对应根文件夹类型下定义的标签映射关系见KEY_CLASSconstants.py关键词含义目标标签所在根文件夹pov当前章节/场景的视角角色Characters角色focus当前场景聚焦的角色非视角角色Characters角色char当前场景出现的其他角色Characters角色plot当前场景推进的剧情线Plot情节time当前场景涉及的时间线Timeline时间线location当前场景发生的地点Locations地点object当前场景出现的物品Object物品entity当前场景出现的实体Entities实体custom自定义类别的引用Custom自定义mention提及但未实际出现的任何元素任意笔记根文件夹story引用 Novel 文件夹中的章节/场景文档Novel小说引用行的通用格式为keyword: value1, value2 ...一行可带多个值例如示例场景文档 sample/content/bc0cbd2a407f3.md 中的### Another Scene pov: John focus: Jane location: Earth编辑器会自动给出两种反馈合法标签有彩色高亮非法重复或指向不存在标签则带波浪线。若引用了尚不存在的标签可右键选择Create Note for Tag此时 novelwriter/core/project.py 的createNewNote()会在正确的根文件夹下自动生成一份含tag定义的新笔记。输入方面在新行键入会触发自动补全菜单先提示关键词、再在输入:后提示已定义标签见 novelwriter/editor/completer.py。部分关键词还有快捷键如CtrlK, V视角、CtrlK, C角色、CtrlK, P情节等constants.py。二、%注释正文之外的元数据层示例文档第 1722 行展示了注释的三种形态% 你可以把注释写进文本的任何位置。注释永远不计入字数统计 % 并且可以在稿本中按需包含或排除。 %Story.Resolution: 你可以用故事注释描述场景结构。 %Note.Consistency: 你还可以记录关于故事一致性的笔记。 % 故事注释Story或笔记注释Note中「点号之后的部分」是你自定义的关键词。2.1 普通注释Plain Comments以%开头的行或段落就是普通注释。它被 novelWriter 视为「作者写给自己的便签」不参与字数与字符数统计仅在文档查看面板中按需显示并在构建稿本时可整体包含或排除。官方用户指南在 docs/source/usage/comments.rst 中有完整的示例### Scene A regular text paragraph in the scene. % A comment youve added for your own notes. Another regular text paragraph in the scene.2.2 概要 / 简述注释%Synopsis与%Short这两种注释是特殊形态%Synopsis: ...用于概括章节/场景内容%Short: ...用于描述角色等故事元素的短简介。它们可以显示在场景、角色等条目的信息栏中在稿本中也会以区别于普通注释的样式排版。官方文档强调每个标题下这类「描述性注释」只能使用一次同一标题下重复出现时以最后一条为准。### Scene %Synopsis: A summary of the content of the scene.# Characters ## Darth Vader %Short: A Sith Lord that used to be a Jedi.2.3 结构注释%Story.关键词与%Note.关键词这是示例文档第 1920 行点名的进阶用法自 2.7 版本加入完整规范见 docs/source/features/story_comments.rst%Story.term: 文本用于标注故事结构。term完全由作者自定义——可以记录「节拍」的四个阶段如借鉴The Story Grid的 incite / complication / crisis / resolution也可以记录场景节奏、情绪、时间流逝甚至变形角色此刻的物理形态。语法是注释首个词写Story随后一个句点、一个结构词、一个冒号、空格再写内容。%Note.term: 文本%Note是%Story的泛化形式没有预定义含义典型用途是给正文打一致性标注例如%Note.consistency: 这是卡罗尔第一次演讲提醒自己在别处核对设定。两者的差异在于稿本构建时的独立开关text.includeStory与text.includeNotes见 novelwriter/manuscript/manussettings.py允许你分别过滤它们。当你从大纲视图导出项目数据CSV时所有%Story/%Note术语会作为独立列写入导出文件方便用表格软件做整本书的结构性审读。2.4 忽略文本与脚注注释忽略文本%~行首写%~会让该段文本在预览与构建时被完全跳过比改成普通注释更干净因为普通注释仍可选择包含进稿本。光标置于段内按CtrlShiftD可开关该段落的忽略状态。脚注%Footnote.key脚注由短代码[footnote:key]加配套注释%Footnote.key: 脚注正文组成二者靠 key 配对key 只需在文档内唯一。从Insert菜单插入脚注会自动生成唯一 key并在段落之后创建注释、把光标移过去等待输入。从索引实现看注释的解析发生在_scanActive()中对每个以%开头的行调用processComment()分出样式、key 与文本脚注 key 单独登记其他注释则写入对应标题的注释槽novelwriter/core/index.py。注释样式本身由枚举nwComment定义PLAIN / SYNOPSIS / SHORT / STORY / NOTE / FOOTNOTE / IGNORED 等每种样式还有独立的主题图标见 novelwriter/constants.py。2.5 构建时的注释包含开关在 Manuscript Build / 稿本设置对话框中注释类内容拥有独立的包含开关manussettings.py设置键控制内容text.includeBodyText正文段落text.includeSynopsis%Synopsis概要注释text.includeComments普通%注释text.includeStory%Story.*结构注释text.includeNotes%Note.*笔记注释text.includeKeywords元数据行这些开关最终映射到 Tokenizer 的setCommentType()novelwriter/formats/tokenizer.py从而决定每种注释是否进入最终稿本文档。三、标题语法用#定义章节与场景示例文档第 2426 行给出了全篇最关键的一句话The headings define the story structure. Two#symbols means a chapter, and three means a scene. Adding the exclamation point changes the formatting of the heading in your manuscript.即标题决定故事结构。在 Novel 类型的根文件夹下##表示章节、###表示场景一篇文档究竟被当作章节还是场景完全取决于其第一个标题的层级该层级同时决定了它在项目树中显示的图标。6a2d6d5f4f401.md自身就是一篇以## Basic Formatting开头的章节文档场景文档既可以作为它的子文档挂在树下也可以与它同层排列——novelWriter 只关心标题层级与出现顺序示例场景 sample/content/bc0cbd2a407f3.md 的第 1719 行对此有直接说明。完整的四级标题体系见 docs/source/usage/chapters_and_scenes.rst 与配图标题层级含义!变体# 标题卷Part/幕用于把故事拆成 Part 1 等#!表示小说/笔记文件夹主标题如封面书名构建时使用独立样式## 标题章节可在构建时自动插入章节编号##!表示不参与自动编号的章节适合序章、尾声、间章### 标题场景可自动插入场景编号或分隔符###!表示另一种场景标题用于区分「软/硬」场景切换#### 标题小节构建时可替换为分隔符或忽略无示例项目恰好为##!提供了活例子文档 sample/content/ba8a28a246524.md 以##! Interlude开头其正文注释写明「带有 ! 的标题意味着这是不编号的章节可以在导出时与编号章节分开处理适合间章、序章或尾声」——这正是 6a2d6d5f4f401.md 提示读者去对照的 Interlude 文件。实用细节#或!之后的空格是必须的格式正确时编辑器会改变标题的颜色与字号。同一文档允许多个标题但第一个标题决定项目树中的图标与信息。层级一到三的!变体只在构建稿本时改变语义编号、样式、分隔符写作时可以随时选用。页面级换页符可自动加在标题、章节、场景前在 Manuscript Build 工具中配置其他位置如需换页需手动指定。构建稿本时标题层级会整体发生变化存在标题提级机制详见官方文档 docs/source/usage/chapters_and_scenes.rst。笔记类根文件夹下也可以自由使用同样的标题层级只是不会被当作章节/场景。索引层对标题的解析在_scanActive()novelwriter/core/index.py逐行扫描#开头的行调用processHeading()得到层级H0H4合法集合定义于 constants.py 的nwStyles.H_VALID与标题文本记录主标题、按标题切分统计字数并把该标题之后遇到的行与%行都归入此标题名下。换言之标签、注释、引用全部是「标题级」元数据这正是理解整套语法的关键。四、段落与文本强调基础排版语法6a2d6d5f4f401.md提到的「格式化」还包括正文排版官方指南 docs/source/usage/basic_formatting.rst 给出了完整规则段落段落由空行分隔即两段之间需要两个换行单个换行只算段内换行不会新起一段。这一点必须严格遵循因为稿本工具Manuscript Tool的许多排版选项缩进、对齐等都依赖「空行分段」这一前提。错误示范是把第二段用缩进「假装」成新段落——那会被当成同一个段落的两行。强调语法Markdown 子集列表/图片/链接均不支持写法效果_text_斜体强调**text**粗体强烈强调*text*粗体2026.1 起可在Preferences → Text Editing中启用启用后CtrlB与格式按钮改用单星号与**并存~~text~~删除线text高亮规则分隔符与文字之间不能有空格**text**合法、**text **非法分隔符必须位于词的外缘同时使用**与_时下划线必须是内层因为下划线本身是合法单词字符强调不跨换行符强调仅用于注释与段落标题与元数据行中不做格式化。转义\*、\_、\~会分别输出原义的*、_、~避免编辑器误解。URL以http/https开头的链接会被自动识别高亮并可点击在编辑器中需按住Ctrl点击才能跳转。这些 Markdown 规则在底层由正则表达式模式实现斜体、粗体、删除线、高亮、链接分别对应FMT_IT、FMT_B1/FMT_B2、FMT_ST、FMT_HL、FMT_LN等模式封装于 novelwriter/text/patterns.py 的RegExPatterns类其中粗体模式会根据CONFIG.singleStarBold配置在双星号与单星号之间切换patterns.py印证了「单星号粗体」是用户可选项这一设计。五、示例项目中的综合应用与建议novelWriter 的官方文档推荐了两种最稳妥的上手路径在Welcome对话框的 New Project 表单中选择 Create an example projectPre-fill project 选项生成包含若干标签与引用示例的预填充项目——sample/目录正是这类示例项目的静态副本。对照本文逐段输入练习先建一篇##章节文档在其下添加###场景子文档在角色笔记里写tag再回到章节文档用pov/char引用随后为每个场景补%Synopsis、%Story.*与%Note.*。需要留意的是示例项目的文档头部还带有class、layout、textHash、createdDate等由编辑器维护的项目元数据头手工编辑时不要改动这些字段——它们记录的是文档在项目树中的类型与校验信息正文才是你书写的空间。另外如果标签高亮与索引不同步可在Tools菜单执行Rebuild Index或按F9正常情况下文档保存时会自动重建自身索引因此这种手工刷新很少需要。综上novelWriter 的元数据语法可以浓缩为一句话标题定结构、tag定身份、%定注记。掌握了这三层语法你就能够以纯文本方式管理整部小说的章节、场景、角色、地点与情节线索让大纲视图、引用面板、CSV 导出与稿本构建全部自动为你工作。延伸阅读本文相关官方文档与源码均在仓库内可继续深入basic_formatting.rst、chapters_and_scenes.rst、comments.rst、tags_and_references.rst、story_comments.rst源码层面可查看 constants.py、core/index.py、core/indexdata.py 与 text/patterns.py。赞分享桌面应用【免费下载链接】novelWriternovelWriter is an open source plain text editor designed for writing novels项目地址https://gitcode.com/gh_mirrors/no/novelWriter点击查看免费下载相关推荐TradingAgents-CN 部署教程5分钟跑通多智能体投资分析平台TradingAgents CN 部署教程5分钟跑通多智能体投资分析平台 TradingAgents CN 是一款基于多智能体 LLM 的中文金融股票分析平台桌面应用MAS 激活工具完整指南免费激活 Windows 与 Office4 种方法怎么选MAS 激活工具完整指南免费激活 Windows 与 Office4 种方法怎么选 MASMicrosoft Activation Scripts是一操作系统Go Music DL安全与数据保护音乐下载工具的Cookie本地存储、管理员认证与数据隔离完整指南Go Music DL安全与数据保护音乐下载工具的Cookie本地存储、管理员认证与数据隔离完整指南 Go Music DL 是一个基于 Go 语言的全网音乐桌面应用上一篇如何免费练出英语打字的肌肉记忆Qwerty Learner 从安装到熟练的完整指南下一篇告别卡顿邮件客户端用SnappyMail轻松自建网页版邮箱的完整实战创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考