@chengzhao-dev/dsh-quarto-book 0.6.18 → 0.6.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -7,30 +7,31 @@
7
7
 
8
8
  ### 代词不能代替未写出的对象
9
9
 
10
- 「这个/这些/这一步」类代词只在**同句或同一节的上一句已经列出对象名**时合法;对象名只出现在后面的 `###`、只出现在代码围栏、或只出现在另一道自测题里,都算没有先行词。判定以整篇 qmd 为范围,按标题切开后再看代词前面有没有对象名,一句摘出来不能判。段内回指不在此列:上一句已写出「数量」,下一句写「这个数量」仍然合法(given-new 的复用分支)。
10
+ 「这个/这些/这一步」类代词只在**同句或同一节的上一句已经列出对象名**时合法;对象名只出现在后面的 `###`、只出现在代码围栏、或只出现在另一道自测题里,都算没有先行词。判定以整篇 qmd 为范围,按标题切开后再看代词前面有没有对象名,一句摘出来不能判。段内回指不在此列:上一句已写出「数量」,下一句写「这个数量」仍然合法。
11
11
 
12
- - **自测题干**是合上书的一问,只看本题题干:禁止「这个、那个、这些、那些、哪个、哪些、哪一句、哪一层、哪一行、哪一块」,先写出被问的对象,再用「是多少、会不会、A 还是 B」来问;「什么」允许——它在要一个名字或一句文字,不是指上文没出现的东西。答案折叠里的回指不扫。
12
+ - **自测题干**是合上书的一问,只看本题题干:禁止「这个、那个、这些、那些、哪个、哪些、哪一句、哪一层、哪一行、哪一块」,先写出被问的对象,再用「是多少、会不会、A 还是 B」来问;「什么」允许——它在要一个名字或一句文字。答案折叠里的回指不扫。
13
13
  - **节首句**不得用代词把后文才展开的内容提前捆成一包:节首以「这些/这个/这一步」作话题、同句又没有列出对象名,即失败。「这一章」「下一章」「这一节」指书的单位,是固定说法,不在此禁令内。
14
14
  - **已经逐个写出名字之后的回指**仍然合法:如前文小节已写出 `Player`、`Move`、`PlaceResult`、`Result`,后文「这些类型由 `Game` 的四个数据成员使用」保留。
15
+ - 换算句里的「下标」不算已经写出的对象;点名规则见 `steps/07-layout.md`「列表选择」换算条。
15
16
 
16
- 条文与自动检查见 `writing-quarto` 技能 `scripts/verifying-content.py` 的整篇题干/节首检查;步骤挂点:定结构改自测题,定句子改节首与句内代词;对照见本文件「代词不能代替未写出的对象」。换算句里的「下标」不算已经写出的对象;点名规则见 `steps/07-layout.md`「列表选择」换算条。
17
+ 自动检查见 `scripts/verifying-content.py` 的整篇题干/节首检查;步骤挂点:定结构改自测题,定句子改节首与句内代词。
17
18
 
18
19
  ### 一次对话
19
20
 
20
- 面向读者的一次说话只推进一件内容:可以是一句,也可以是紧挨着的两句,但必须沿用同一套说法。对话不是新的切分单位,也不是标题层级:判定挂在定段落和定句子上——定段落先问这段有几件内容、决定删或拆,定句子才改措辞。脚本不统计对话数;自动失败只有下面四条判定里的三类高精度信号(见 `steps/03-blocks.md`「机械检查」)。
21
+ 面向读者的一次说话只推进一件内容:可以是一句,也可以是紧挨着的两句,但必须沿用同一套说法。对话不是新的切分单位,也不是标题层级:定段落先问这段有几件内容、决定删或拆,定句子才改措辞。脚本不统计对话数。
21
22
 
22
23
  - **一件内容**是读者能单独复述的一件事,例如「这次有没有写进状态面板」。两件内容用顿号或逗号放进同一句,再补「是两个不同的问题」「用两个枚举分开回答」,就是把两次说话写成一次;读者读到围栏前,要回头拿开头的问题去猜后面的编号各指哪个。
23
24
  - **围栏前的成员列表允许与随后成员注释用词接近;围栏后不再复述**:成员取值列表和成员行尾注释说的是同一批对象,用词相近不是改口;列表之后的数据成员围栏里已写明的信息,块后不再复述。
24
- - **写不出本段中心,或这句与导语、围栏注释同义,就删本段**,不另写替身句。要换对象必须另起段,而且该对象得是本节正在讲的,不能提前交给后文才展开的成员或函数(如 示例章的 `current_owner_` 与 `Game::ApplyMove`)。
25
- - **后文还讲这件事时,沿用开头的说法和类型名**,不改口成「接着看」「第一个枚举」「第二个枚举」。序数可以指真实位置(示例章「第一个格子」),不能用来给前面并列过的类型、成员、入口、步骤重新编号;格子、行、列和「第二次写入」这类真实次序豁免。改写是每件内容紧挨它自己的围栏,说法从开头保持到围栏。
26
- - **数量词和「这些」必须对着紧接着的名单或围栏**:写「四个入口」「覆盖四类」,下一块就要列出四个名字或四类场景;对不上就改成点名对象(示例章写「读写用 `IsInRange`、`GetCellKind`、`PlaceCell` 和 `IsFull`,`Board()` 只建出空状态面板」,不再说「只留四个入口」)。
25
+ - **写不出本段中心,或这句与导语、围栏注释同义,就删本段**,不另写替身句。要换对象必须另起段,而且该对象得是本节正在讲的,不能提前交给后文才展开的成员或函数。
26
+ - **后文还讲这件事时,沿用开头的说法和类型名**,不改口成「接着看」「第一个枚举」「第二个枚举」。序数可以指真实位置(「第一个格子」),不能用来给前面并列过的类型、成员、入口、步骤重新编号;格子、行、列和「第二次写入」这类真实次序豁免。
27
+ - **数量词和「这些」必须对着紧接着的名单或围栏**:写「四个入口」「覆盖四类」,下一块就要列出四个名字或四类场景;对不上就改成点名对象。
27
28
  - **一句里的全称(全部、所有、唯一)读完下一句仍然成立**;被下一句否定就改范围或删除。**类型接线**(两个逗号分句各自是「成员叫法 + 使用 + 某一章的类型」)若两项都已出现在紧邻导语和围栏里,整段删除,不走「拉链句」的推迟、拆句、一项一行。
28
29
 
29
- 条文与自动检查见 `writing-quarto` 技能 `scripts/verifying-content.py` 的句子模块切分;步骤挂点:定段落删段或拆段,定句子改措辞;对照见 `examples/04-paragraph-cases.md`「定段落:类型接线段整段删除」、`examples/05-sentence-frame.md`「定句子:两次说话拆成一次对话」与 `examples/05-sentence-reference.md`「定句子:数量词对着下一块点名」。
30
+ 自动检查见 `scripts/verifying-content.py` 的句子模块切分;对照见 `examples/04-paragraph-cases.md`「定段落:类型接线段整段删除」、`examples/05-sentence-frame.md`「定句子:两次说话拆成一次对话」与 `examples/05-sentence-reference.md`「定句子:数量词对着下一块点名」。
30
31
 
31
32
  ### 句内骨架
32
33
 
33
- 写作步骤的定句子步骤。本条管**设计说明**(为什么这样存、这样判定、这样分工)——一段解释代码决策的正文;步骤句、列表项、自测导语不套这条。它不与邻条重复:拆核四步管多核怎么拆段(见 `steps/04-paragraphs.md`「拆核四步(多核混段的拆段方法)」),过简断裂管分句之间的衔接(见本文件「过简断裂禁令」),本条管**分句各自担任什么角色、按什么次序排列**:
34
+ 本条管**设计说明**(为什么这样存、这样判定、这样分工)——一段解释代码决策的正文;步骤句、列表项、自测导语不套这条。它与邻条不重复:拆核四步管多核怎么拆段(见 `steps/04-paragraphs.md`「拆核四步(多核混段的拆段方法)」),过简断裂管分句之间的衔接(见本文件「过简断裂禁令」),本条管**分句各自担任什么角色、按什么次序排列**:
34
35
 
35
36
  - 每个分句只担任一种角色:可观察事实、不变约束、因此作出的选择。次序固定为**事实 → 约束 → 因此选择**;选择句不得出现在依据之前——先写「长度取常量」再补「九个格子」,读者要把因果倒过来读。
36
37
  - 光有回指不够。后一分句若不是同一谓语的延续,必须写出「因此 / 所以」;删掉关系词后读者仍要自己补因果,判为不合格。可观察事实(「状态面板一共九个格子」)可以在前,读者据此才知道选择成立。
@@ -38,14 +39,14 @@
38
39
  - 「因此选择」必须是读者下一步要执行的动作。只约束作者的选择(不另造类型、测试少记一个名字、注释该怎么组织)整句删掉,不改写成另一句解释;正文不展开与本章对象无关的标准库机制,也不写「不写甲,而是乙」。
39
40
  - 一句里用逗号甩出的独立判断,最多留「事实,约束」或「约束,所以选择」一对;第三个判断另起句或删除。单句仍守本文件「句子规则」的 40 字与一动作上限。
40
41
  - 递进同一核不拆段复述:长度和装下它的数组是同一个核,同段用「因此」接住,不另起一段再说一遍「正好装下」。
41
- - 后续小节专讲的对象,本段不写「由 X 完成」:换算如果由下一小节专讲,本段不提前交接(「换算由下一小节完成」);块内注释或下节首句已经说出的职责,整句删除。
42
+ - 后续小节专讲的对象,本段不写「由 X 完成」:换算如果由下一小节专讲,本段不提前交接;块内注释或下节首句已经说出的职责,整句删除。
42
43
  - 与「对象先行」的对齐方式见 `steps/04-paragraphs.md`「句序与段落形态」。
43
44
 
44
- 判定信号:设计说明句里选择先于依据;逗号甩出第三个独立判断;分句只贴类别不改变下一步;删掉关系词后因果要读者自补;段末提前交接后续小节的对象;「因此选择」只约束作者、读者没有下一步动作。改写对照见 `examples/05-sentence-frame.md`「句内骨架:先依据后选择」与「技能腔:解释作者的选择」。类型接线句与被下一句否定的全称按本文件「一次对话」判删留,不按本节改写句内次序。
45
+ 判定信号:设计说明句里选择先于依据;逗号甩出第三个独立判断;分句只贴类别不改变下一步;删掉关系词后因果要读者自补;段末提前交接后续小节的对象;「因此选择」只约束作者、读者没有下一步动作。改写对照见 `examples/05-sentence-frame.md`「句内骨架:先依据后选择」与「技能腔:解释作者的选择」。
45
46
 
46
47
  ### 拉链句
47
48
 
48
- 一句话里把两组对象两两配对(左组对右组),删掉任一配对,剩下的配对仍能单独成立,原句就是拉链句:读者要按顺序把左组一一配到右组,且两个配对共用同一个判据(如「数据项在哪、上面是什么,分别交给 `Position` 和 `CellKind`」——删掉任一配对,另一配对照样成立)。它不是一个中心,也不是步骤链;现有的「一句一动作」「不提前交接」拦不住它,因为它把两件事合法地写进了同一句。旧「分号双主语」豁免(两个行内代码主语用分号并列,如「`Position` 定位一个数据项;`CellKind` 保存格子的类型」)已废除:这类分号句通常就是拉链句,按本节改写。
49
+ 一句话里把两组对象两两配对(左组对右组),删掉任一配对,剩下的配对仍能单独成立,原句就是拉链句:读者要按顺序把左组一一配到右组,且两个配对共用同一个判据(如「数据项在哪、上面是什么,分别交给 `Position` 和 `CellKind`」)。它不是一个中心,也不是步骤链;「一句一动作」「不提前交接」拦不住它,因为它把两件事合法地写进了同一句。旧「分号双主语」豁免(两个行内代码主语用分号并列)已废除:这类分号句通常就是拉链句,按本节改写。
49
50
 
50
51
  三条改写,按顺序选,停在第一条适用的:
51
52
 
@@ -57,10 +58,10 @@
57
58
 
58
59
  - 后一步用到前一步的结果时,写成前后两句陈述,不用「先 / 再 / 最后」连接。
59
60
  - **同物两处可留一句**:主语只有一个,只是指出声明文件和实现文件;句中再塞第二个任务(接受、拒绝、判定终局)时,第二个任务拆掉。位置句的谓语用「放进」,不用「记住」「保存」「选出」。
60
- - **回顾不按拉链改写**:回顾的条数与形态见 `steps/02-structure.md`「六段块序列」。
61
+ - **回顾不按拉链改写**:回顾的条数与形态见 `steps/02-structure.md`「本章回顾」。
61
62
  - **块后复述不按拉链改写**:块后复述禁令见 `steps/03-blocks.md`「内容块前后的闭环」(对照见 `examples/03-block-after.md`「块后复述注释」)。
62
63
 
63
- 判定信号:同一句里用「分别交给」「各说一层」「分别是」连接两组对象;或一句内两组配对删掉任一仍成立。改写对照见 `examples/05-sentence-frame.md`「拉链句」;「分别交给」「各说一层」由 `verifying-content.py` 对读者正文硬拦。类型接线句是本节的例外出口:两项都已在紧邻导语和围栏出现时整段删除,不走推迟、拆句、一项一行(见本文件「一次对话」)。
64
+ 判定信号:同一句里用「分别交给」「各说一层」「分别是」连接两组对象;或一句内两组配对删掉任一仍成立。改写对照见 `examples/05-sentence-frame.md`「拉链句」;「分别交给」「各说一层」由 `verifying-content.py` 对读者正文硬拦。类型接线句是本节的例外出口:两项都已在紧邻导语和围栏出现时整段删除(见本文件「一次对话」)。
64
65
 
65
66
  ### 六个成分
66
67
 
@@ -78,8 +79,6 @@
78
79
 
79
80
  下一句的主语复用上一句的宾语或话题。一句仍只做一个动作,仍不超过 40 字;同档并句一个逗号,整句不超过 40 个汉字。
80
81
 
81
- 依据:黄伯荣、廖序东《现代汉语》把主谓句分成动词谓语句、形容词谓语句、名词谓语句、主谓谓语句,常用句式另有把字句、被字句、连谓句、兼语句、双宾句、存现句;朱德熙《语法讲义》把主语看成已知话题;陈平把零形回指定义为上文已出现的事物可以不写出那个词。
82
-
83
82
  ### 主语选执行者或话题对象
84
83
 
85
84
  章首引言、节导语与段首句的主语,取本章或本节要交代的对象,或执行动作的一方:程序、井字棋、对局、棋盘、玩家、`Board`。主语不取这些对象产生的下游产物——回应、输入、输出、画面、结果、数据。
@@ -88,7 +87,19 @@
88
87
  - 改法:执行者或本章对象先作主语,产物退回宾语。上例改为「程序每一轮都显示当前棋盘,并提示轮到谁落子」。
89
88
  - 判定信号:圈出主语,问它会不会自己做这个动作。不会,就是主次颠倒;把主语换成执行者或本章对象。
90
89
  - 产物是本节主题时可以作主语,例如快照字段、终端输出的格式;此时不把执行者降格为「由 X 完成」式被动(见 `steps/06-wording.md`「目标语气」)。
91
- - 依据:Google 开发者文档风格指南与 Microsoft 风格指南都要求尽量用主动语态,让执行动作的一方作主语;朱德熙《语法讲义》把主语看作已知话题,章首的话题是本章对象。改写对照见 `examples/05-sentence-reference.md`「主语不落到下游产物」。
90
+
91
+ 改写对照见 `examples/05-sentence-reference.md`「主语不落到下游产物」。
92
+
93
+ ### 句子规则
94
+
95
+ - 单句一般不超过 20 字,40 字以上不可接受;一个句子出现三个以上动作或多个括号时拆句。
96
+ - 解释拒绝、终局或分支时,主句先写可观察结果,条件跟在后面或另起一句:先写「操作被拒绝,局面保持不变」,再写为什么;不把原因堆在句首让读者读完才知道结果。正文不重复 if/return 的分支细节,见本文件「情况:围栏里的代码」。
97
+ - 正文不使用破折号夹心解释:解释用冒号引出,或拆成两句;冒号的合法场合收窄见 `steps/04-paragraphs.md`「散文伪标签冒号禁令」。
98
+ - 用主动语态、肯定语气和陈述句;不用感叹句和双重否定。语气判定与口语腔、公文腔的正向标准见 `steps/06-wording.md`「目标语气」。
99
+ - 不写否定式预告:「程序不提供电脑对手」「这一章不实现 X」式否定句一律不写;正文只正面陈述当前程序做什么,后续章节才会出现的能力保持沉默,即使当下为真也不写。范围声明同受此限:章引言只写本章要交出的对象,不点名后续章节的流程。下一章预告只写在章末本章回顾,引言保持沉默。
100
+ - 读者正文(`content/**/*.qmd`、根 `README.md`、`index.qmd` 的围栏外正文)不用「先…再…」「先…然后…」「先…最后…」串动作或阅读顺序。每一步写成独立陈述,主语是对象或读者要做的事。代码块导语直接点名对象做什么。`.agents` 的操作步骤、引号和围栏里的反例不套这条。
101
+ - 读者正文点名类时直接写反引号里的类名,例如 `Game`、`Board`、`Ai`。类名前面不加「类」。
102
+ - 点名后章类型再说明「这件事不在这里」也删除:类型名已经越界,否定句不豁免;只保留本章对象与本章要读者做的判断。
92
103
 
93
104
  ### 过简断裂禁令
94
105
 
@@ -108,28 +119,15 @@
108
119
  - 管 `content/**/*.qmd` 里 `##` / `###` 标题下、第一个围栏或子标题之前的导语。不管章首无标题引言里的「这一章」,不管 `.agents` 规则正文。
109
120
  - 「这一章」「下一章」仍只用于章首承接和章末回顾。
110
121
  - 导语里出现「这一节」或「本节」即不合格。第二句用「因此」「这样」或重复上一句已经写出的名词来接住,不用「先…再…」。
111
- - 链接文字已经是章节名时,链接外面再写「的画面」即不合格。`01-rules.qmd` 的标题「终局时的画面」保留,它是那一节自己的对象。
112
- - 「这个/这些/这一步」仍只按本文件「代词不能代替未写出的对象」判定。
122
+ - 链接文字已经是章节名时,链接外面再写「的画面」即不合格。那一节自己的对象标题保留。
113
123
 
114
124
  ### 概念负荷
115
125
 
116
126
  - 主题仍一段一个(「一段一对象」见 `steps/04-paragraphs.md`「段落规则」);该主题下最多 **1–3 个主要概念**——读者读完必须能复述的独立对象或判断。
117
127
  - 允许若干**次要概念**只服务主概念:出处、约束、可见性、与上一句的关系;次要概念不得另起主语当新主概念。
118
128
  - **主次判定**:删掉该信息后,段首中心句是否仍成立?成立 → 次要或应删;不成立 → 主要。文件位置、`public:` 段名、入口个数默认是次要;「`Game` 编排一次」「状态面板收在对象内部」若本段要讲接口与存储分工,则「接口/内部存储」算两个主概念,须用给定信息衔接,不得并列甩出。
119
- - 超过 3 个主概念:拆下一段,或改「一句中心 + 列表」;禁止用逗号、句号把第 4 个主概念塞进同一段。
120
- - 普通自然段的 token 带与豁免见 `steps/02-structure.md`「分层上限」;低于下限时补的是衔接与必要次要概念,不是凑字数句(「凑字数禁令」见 `steps/04-paragraphs.md`,与本条同时成立)。
121
-
122
- ### 句子规则
123
-
124
- - 单句一般不超过 20 字,40 字以上不可接受;一个句子出现三个以上动作或多个括号时拆句。
125
- - 解释拒绝、终局或分支时,主句先写可观察结果,条件跟在后面或另起一句:先写「操作被拒绝,局面保持不变」,再写为什么;不把原因堆在句首让读者读完才知道结果。正文不重复 if/return 的分支细节,见本文件「情况:围栏里的代码」。
126
- - 正文不使用破折号夹心解释:解释用冒号引出,或拆成两句;冒号的合法场合收窄见 `steps/04-paragraphs.md`「散文伪标签冒号禁令」。
127
- - 用主动语态、肯定语气和陈述句;不用感叹句和双重否定。语气判定与口语腔、公文腔的正向标准见 `steps/06-wording.md`。
128
- - 不写否定式预告:「程序不提供电脑对手」「这一章不实现 X」式否定句一律不写;正文只正面陈述当前程序做什么,后续章节才会出现的能力保持沉默,即使当下为真也不写,否则后文补上该能力时句子失效。范围声明同受此限:章引言只写本章要交出的对象,不点名后续章节的流程(如「不在这里配置、编译、测试或运行」)——即使是否定形式,也把后章内容提前搬进读者视野,超出本章范围。下一章预告同属后章内容,只写在章末本章回顾,引言保持沉默。
129
- - 读者正文(`content/**/*.qmd`、根 `README.md`、`index.qmd` 的围栏外正文)不用「先…再…」「先…然后…」「先…最后…」串动作或阅读顺序。每一步写成独立陈述,主语是对象或读者要做的事。代码块导语直接点名对象做什么。`.agents` 的操作步骤、引号和围栏里的反例不套这条。
130
- - 读者正文点名类时直接写反引号里的类名,例如 `Game`、`Board`、`Ai`。类名前面不加「类」。
131
-
132
- - 点名后章类型再说明「这件事不在这里」也删除:类型名已经越界,否定句不豁免;不要改写成另一句否定句。只保留本章对象与本章要读者做的判断。
129
+ - 超过 3 个主概念:拆下一段,或改「一句中心 + 列表」;名称已经在上一块出现时,不另起一份清单。禁止用逗号、句号把第 4 个主概念塞进同一段。
130
+ - 普通自然段的 token 带与豁免见 `steps/02-structure.md`「分层上限」;低于下限时补的是衔接与必要次要概念,不是凑字数句(见 `steps/04-paragraphs.md`「凑字数禁令」)。
133
131
 
134
132
  ### 简洁边界
135
133
 
@@ -137,7 +135,7 @@
137
135
 
138
136
  - 禁例:「先自己回答,再展开核对。」——读者不知道怎么算回答、核对什么。改为完整指令:「不要展开答案,试着自己把回答完整说出来,写完之后展开对照。说不出来的部分,回到对应小节对照正文。」
139
137
  - 指令与提示句写全三要素:动作(做什么)、对象(对什么做)、顺序(先做什么后做什么)。
140
- - 并列的量名各自带上被计量的对象:「行数、列数」不能配一个光秃的「总数」。对象必须留在引入该名字的短语里;围栏代码注释和隔着代码块的后文都不算补上(示例章 `kRows` 的导语因此写成「数据项总数」)。
138
+ - 并列的量名各自带上被计量的对象:「行数、列数」不能配一个光秃的「总数」。对象必须留在引入该名字的短语里;围栏代码注释和隔着代码块的后文都不算补上。
141
139
  - 拿不准一句是否过省时写成完整句;多出的字数由篇幅预算吸收(见 `steps/02-structure.md`「分层上限」),不由读者的理解力吸收。
142
140
 
143
141
  ### 结构助词「的」
@@ -146,27 +144,19 @@
146
144
 
147
145
  - 定语是动词、主谓或介词短语时留下这个「的」。例:已经写入的状态面板;还没有元素的数据项;检查状态面板是否已满的功能。
148
146
  - 固定搭配整词修饰:搭配已经固化为一个术语或一个叫法时整词使用,不再拆出「的」。例:二进制文件、源代码、数据成员。
149
- - 中心语是类型、大小、数量、位置时一层修饰就够:这个「的」只在术语与中心语之间出现一次,不再叠加。例:数据项的类型(中心语是类型);文件的大小(中心语是大小)。
147
+ - 中心语是类型、大小、数量、位置时一层修饰就够:这个「的」只在术语与中心语之间出现一次,不再叠加。例:数据项的类型;文件的大小。
150
148
  - 同一个名词短语里有两个「的」时,先把内层术语粘合,只在两个术语的分界留一个。粘合后仍有两个,就改写成动词句。
151
- - 定语和中心语都是名词,粘合后仍是一个叫法时,去掉「的」。例:状态面板的行数写成状态面板行数;状态面板的列数写成状态面板列数;数据项的状态写成数据项状态;示例项目的状态面板写成示例项目状态面板。
149
+ - 定语和中心语都是名词,粘合后仍是一个叫法时,去掉「的」。例:状态面板的行数写成状态面板行数;数据项的状态写成数据项状态。
152
150
  - 术语表已经定名的,类型概述跟术语走。例:`Position` 的类型概述写「数据项坐标。」
153
151
  - 省掉之后领属不成立,或变成另一个意思时,留一个「的」。
154
152
  - 口诀:两层不加的,三层要加的;固定搭配不加的,动词定语要加的;读起来会停顿,就加的。
155
- - 正文里的命令与配置按同一组规则;源码注释的措辞由项目 C++ 流程负责,本技能不在这里定。
156
-
157
- ### 函数概述跟围栏
158
-
159
- 函数围栏前的概述句,其动词与对象必须与围栏里的函数名和参数一致:围栏里是 `ApplyMove`,概述句就用「应用」和「一步操作」,不改写成同义词(如「落子」)。位置写成「定义在 `文件` 里」,不用「声明在」。源码注释怎么写由项目 C++ 流程负责,本技能只对齐正文与围栏。
160
-
161
- 散文一句不换对象;判定全文见本文件。
162
- 反例:「已落 X:先手在这一格落下 X。」——右侧换成「先手」和落下动作。
163
- 正例:「先手:使用 X 元素。」
153
+ - 正文里的命令与配置按同一组规则;源码注释的措辞由项目 C++ 流程负责。
164
154
 
165
155
  ### 关系写成能核对的运算
166
156
 
167
- 一句里的量必须写成相等、乘除加减、上下界,或哪个成员记下哪个数。盖住这四种的「确定、体现、界定、表达」不合格。时间义「已经确定」合格,如「编译期就能确定」。领域换算注释的「由 A 得到 B」和 `To*` 的「将 A 转换为 B」不在这节改,注释场景见 `steps/03-blocks.md`。一句仍只做一个动作,仍是是字句或动词谓语句。标识符的加减乘除写在同一对反引号里,运算符用源码符号。`kRows - 1` 合格,`kRows` 减 1 不合格。
157
+ 一句里的量必须写成相等、乘除加减、上下界,或哪个成员记下哪个数。盖住这四种的「确定、体现、界定、表达」不合格。时间义「已经确定」合格,如「编译期就能确定」。领域换算注释的「由 A 得到 B」和 `To*` 的「将 A 转换为 B」不在这节改,注释场景见 `steps/03-blocks.md`「摘录与源文件注释」。一句仍只做一个动作,仍是是字句或动词谓语句。标识符的加减乘除写在同一对反引号里,运算符用源码符号。`kRows - 1` 合格,`kRows` 减 1 不合格。
168
158
 
169
- 命中即改的信号在 `writing-quarto` 技能 `steps/08-reread.md` 信号表「定用词」行;正反对照见 `examples/06-wording-cases.md`。
159
+ 正反对照见 `examples/06-wording-cases.md`。
170
160
 
171
161
  ### 同档并句
172
162
 
@@ -176,15 +166,11 @@
176
166
  - 机制:同一对象上、同一件事的条件与动作。连谓只允许这一档,一个逗号。状语必须是时间或条件(写入前),不能是文件位置。
177
167
  - 位置:声明文件和实现文件。主语仍是这个对象,谓语只能是「放进」。这是「同物两处可留一句」的写法,不把职责再塞进来;上一章链接只当库名的定语,不另起主语。
178
168
 
179
- 示例章章首正例:`Board` 记住状态面板上已经落下的元素。保存九个数据项,写入前检查坐标。把声明放在项目动态库的头文件 `state.h`,把实现放在源文件 `state.cpp`。话题没换,下一句不写「它」作主语;中间已经换成别的对象,位置句写回原来的类型名。否决句是「在头文件和源文件里记住已经落下的元素」:「在头文件和源文件里」修饰了「记住」,记住的是元素,不是头文件。改写对照见 `examples/05-sentence-reference.md`「处所状语配错谓语」。
169
+ 正例:`Board` 记住状态面板上已经落下的元素。保存九个数据项,写入前检查坐标。把声明放在项目动态库的头文件 `state.h`,把实现放在源文件 `state.cpp`。话题没换,下一句不写「它」作主语;中间已经换成别的对象,位置句写回原来的类型名。否决句是「在头文件和源文件里记住已经落下的元素」:「在头文件和源文件里」修饰了「记住」,记住的是元素,不是头文件。改写对照见 `examples/05-sentence-reference.md`「处所状语配错谓语」。
180
170
 
181
171
  ### 一句不换对象
182
172
 
183
- 一句里能不能同时写已落 X 和先手:不能。一句只写一个对象,冒号右侧不得换成另一个对象,也不得用近义词把左侧再说一遍。
184
-
185
- 反例:「已落 X:先手在这一格落下 X。」——冒号右侧换成「先手」和落下动作,不再说左侧的格子状态。改写见术语表「数据项类型」的三句;正例三句不在这里贴,见同节。
186
-
187
- 一句里的对象仍只有一个;六个成分的槽位见本文件。
173
+ 一句里能不能同时写已落 X 和先手:不能。一句只写一个对象,冒号右侧不得换成另一个对象,也不得用近义词把左侧再说一遍。反例:「已落 X:先手在这一格落下 X。」——冒号右侧换成「先手」和落下动作,不再说左侧的格子状态。一句里的对象仍只有一个;六个成分的槽位见本文件「六个成分」。
188
174
 
189
175
  ### 句子级病类清单
190
176
 
@@ -195,24 +181,13 @@
195
181
  3. **并列成分不一致**:并列各项句法形式与施事必须同构,首项介词统领全列(「一行、一列或一条对角线上」→「在一行……上」)。
196
182
  4. **顿号层级嵌套**:外层并列用逗号、内层用顿号;「以及」前用逗号(GB/T 15834—2011)。
197
183
  5. **指代不明**:先行词不唯一或不在最近,换专名。
198
- 6. **紧缩并称释义**:把用途压成「一读一写」式并称、或省主语从句(「报告是否下满」),名字与动作的对应要读者自补,改写为显式映射(判定信号见「逐条释义代替动机」)。
199
- 7. **欧化措辞**:「进行/作出+名词」改回动词;滥「的」滥「被」压缩;名词化主语段内一致时(如「读取直接抛出」的操作名)可留,否则补施事。
200
- 8. **破折号夹心与分号堆叠**:破折号夹解释的句子级判法见本文件;冒号后用分号续第二个解释即拆(对照见「破折号夹心句」「冒号后堆叠分号解释」)。改冒号时只允许两种合法场合(完整句引出列表/围栏/图;列表项引导词后),散文词条式冒号的判定见 `steps/04-paragraphs.md`「散文伪标签冒号禁令」。
184
+ 6. **紧缩并称释义**:把用途压成「一读一写」式并称、或省主语从句(「报告是否下满」),名字与动作的对应要读者自补,改写为显式映射。
185
+ 7. **欧化措辞**:「进行/作出+名词」改回动词;滥「的」滥「被」压缩;名词化主语段内一致时可留,否则补施事。
186
+ 8. **破折号夹心与分号堆叠**:冒号后用分号续第二个解释即拆。改冒号时只允许两种合法场合(完整句引出列表/围栏/图;列表项引导词后),散文词条式冒号的判定见 `steps/04-paragraphs.md`「散文伪标签冒号禁令」。
201
187
 
202
- ### 定句子:句子要短
203
-
204
- 设计说明的分句角色链(事实 → 约束 → 因此选择)见本文件「句内骨架」;句序与段落形态判定见 `steps/04-paragraphs.md`「句序与段落形态」。
188
+ ### 函数概述跟围栏
205
189
 
206
- - 先按本文件「六个成分」给每句分类,再改字;改完回到定段落,核对中心句和一段一对象。
207
- - 单句长度与拆句的判定见本文件「句子规则」。
208
- - 多中心句按中心拆成两句,判定见本文件「句内骨架」。
209
- - 拉链句判定口诀与三条改写见本文件「拉链句」;步骤链、同物两处不按拉链改写,对照见 `examples/05-sentence-frame.md`「拉链句」。
210
- - 结构助词「的」的去留判定与口诀见本文件「结构助词「的」」;两个名词粘成一个叫法仍带「的」,或三个以上名词、动词定语省了「的」,就按这条改。
211
- - 相邻句子的因果、时序关系要写在句面上,判定见本文件「句内骨架」。
212
- - 写完数量词和「这些」,对着下一块点名的判定见本文件「一次对话」,对照见 `examples/05-sentence-reference.md`「定句子:数量词对着下一块点名」。
213
- - 换算按 `steps/07-layout.md`「列表选择」换算条写成同一段短句;对照见 `examples/07-layout-list.md`「公式与换算讲解段」。
214
- - 元叙述开场与对象先行的判定见 `steps/04-paragraphs.md`「句序与段落形态」,对照见 `examples/01-language-scope.md`「元叙述开场与对象先行」。
215
- - 假对比(「这不仅是 X,更是 Y」)、起跑式铺垫(「在开始之前」「首先我们来看」)与句尾意义拔高的判定和删法见本文件「情况:假对比、起跑式铺垫与意义拔高」,对照见 `examples/05-sentence-frame.md`「假对比、起跑式铺垫与意义拔高」。
190
+ 函数围栏前的概述句,其动词与对象必须与围栏里的函数名和参数一致:围栏里是 `ApplyMove`,概述句就用「应用」和「一步操作」,不改写成同义词(如「落子」)。位置写成「定义在 `文件` 里」,不用「声明在」。源码注释怎么写由项目 C++ 流程负责,本技能只对齐正文与围栏。
216
191
 
217
192
  ## 情况
218
193
 
@@ -236,4 +211,4 @@
236
211
 
237
212
  ## 正反例
238
213
 
239
- 通用情况判得准就不打开。判不准时只开 `examples/05-sentence-frame.md`,按命中的信号读其中一节;另外两份 05 案例留到下一次激活。
214
+ 通用情况判得准就不打开。判不准时只开 `examples/05-sentence-frame.md`,按命中的信号读其中一节;`examples/05-sentence-brevity.md` 与 `examples/05-sentence-reference.md` 留到下一次激活。
@@ -23,9 +23,10 @@
23
23
  - **规则和条件不编号**:并列的许可、禁止、判定条件写自然段或分句;只有读者需要按顺序执行动作时才用编号。把「越界 / 占用 / 格式错误」写成 1、2、3,会让读者以为要按顺序检查。一段同时有规则和流程时,规则先成段,流程另起有序列表。
24
24
  - 例外:终局判定的「获胜」「平局」这类并列结果,每条都有名称和可独立核对的条件时,可以用编号列表,让读者逐条对照。
25
25
  - 列表项结构平行:起首用同类的词(都是名词短语,或都是动词短语),长度相近。
26
- - **列表字数带**:同一列表各项保持视觉齐长,避免扫读节奏断裂。计量:引导词汉字数、冒号后汉字数(行内代码按标识符计)。失衡判定:冒号后最长 ≥ 最短 × 2,或引导词相差 ≥ 4。改写顺序:删长项多余中心 → 拆多中心 → 过短项按简洁边界补全 → 停止。豁免:出错原因/正确做法;有序步骤;着陆页卡片。列表齐长服从句段主规则,假拆禁令见 `steps/04-paragraphs.md`。
26
+ - **列表字数带**:同一列表各项保持视觉齐长,避免扫读节奏断裂。计量:引导词汉字数、冒号后汉字数(行内代码按标识符计)。失衡判定:冒号后最长 ≥ 最短 × 2,或引导词相差 ≥ 4。改写顺序:删长项多余中心 → 拆多中心 → 过短项按简洁边界补全 → 停止。豁免:出错原因/正确做法;着陆页卡片。列表齐长服从句段主规则,假拆禁令见 `steps/04-paragraphs.md`。
27
27
  - 列表项起首用加粗引导词标记中心语,读者扫读时先看到分类再决定是否细读;关键词取同类词(如「显示状态面板」「读入坐标」),并按对象的发生顺序排列,读者扫读即得顺序与内容。
28
28
  - 行为或规则枚举项用「**动词短语引导词**:完整句」格式:引导词命名本项的中心动作(如「**显示状态面板**」「**判定流程结果**」),冒号后保留完整中文句,写全动作、对象与结果。引导词是扫读索引,不替代句子信息,不为省字把冒号后压成电报短句(对照见 `examples/07-layout-list.md`)。
29
+ - 同一列表不得混用普通句子和「**引导词**:句子」:多数项已经是哪一种,全部改成哪一种。
29
30
  - 解释并列名称的引导词列表放在首次使用这些名称的代码块或目录树之前:读者先经列表认识每个名称,再看结构展示;禁止把解释压到块后,读者会带着未解释的名称读块。名称本身用读者可核对的具体形态(如「项目动态库」),不用模糊统称(术语依据见 `steps/06-wording.md`)。
30
31
  - 并列成员一次列全:目录、组件等并列对象(含 `build/` 这类构建生成的目录)并入同一个引导词列表,先列全再展示目录树等结构;列表之后不用段落补列遗漏的成员(对照见 `examples/04-paragraph-opening.md`「角色总述段」)。
31
32
  - 目录树的列对齐(目录 `#/` 在左、文件 `#` 右移一列、两种注释文字对齐、每个节点一条注释)见 `steps/03-blocks.md`「情况:目录树」;本文件只管列表、标点与加粗,不另写一份树规则。
@@ -7,7 +7,7 @@
7
7
 
8
8
  ### 信号表(句段与注释,按步骤命中即改)
9
9
 
10
- 同一张表扫 `content/**` 与 `.agents/**`;载体差异按 `steps/06-wording.md` 的「不同文件的语气」表(压缩语气豁免不适用于读者正文)。高精度项由 `verifying-content.py` 固化,其余靠人工过表;「步骤」列对齐 `SKILL.md` 的写作步骤:
10
+ 同一张表扫 `content/**` 与 `.agents/**`;载体差异按 `steps/06-wording.md` 的「不同文件的语气」表(压缩语气豁免不适用于读者正文)。高精度项由 `verifying-content.py` 固化,其余靠人工过表;「步骤」列对齐 `SKILL.md` 的九步:
11
11
 
12
12
  | 步骤 | 信号 | 判定 | 依据 |
13
13
  | --- | --- | --- | --- |
@@ -60,29 +60,19 @@
60
60
  | 定用词 | 空泛套话(「深入探讨」「至关重要」「无缝」「赋能」)不指具体对象;同义循环换词;客服腔;编辑过程残留 | 改写成可核对的对象或删除;工程术语(反馈里的「闭环」)保留 | `steps/06-wording.md`「情况:空泛套话与编辑残留」 |
61
61
  | 回读并退回 | 与改前文本对照:新增原文没有的事实、遗漏读者需要的信息、把限定说成确定 | 恢复原文或按现象退回对应步 |本文件「情况:对照改前文本」 |
62
62
 
63
- 机械项:`verifying-content.py` 扫读者 qmd 与 agents 的 `下一节`/`上一节`、`代码把它写成`、围栏外正文的 `由…完成` 与 `由…确定/体现/界定/表达`;agent 免责腔、章节页引言两个散文段与段落下限硬拦;过简断裂记 WARN,不追清零。句子切分全量执行,只印计数与失败行,失败收类型接线句、「接着看/第 N 个枚举」改口、全称被下一句否定三类;段中心与对话件数留给步骤与案例。
63
+ 机械项:`verifying-content.py` 扫读者 qmd 与 agents 的 `下一节`/`上一节`、`代码把它写成`、围栏外正文的 `由…完成` 与 `由…确定/体现/界定/表达`;agent 免责腔、章节页引言两个散文段与段落下限硬拦;过简断裂中的其余情况记 WARN,不追清零;后句主语是新标识符或以「它」开头的那一类记失败。句子切分全量执行,只印计数与失败行,失败收类型接线句、「接着看/第 N 个枚举」改口、全称被下一句否定三类;段中心与对话件数留给步骤与案例。
64
64
 
65
- ### 润色流程:沿着步骤走
65
+ ### 回读流程:按操作走
66
66
 
67
- 润色任务沿 `SKILL.md` 的路由执行:增量任务只走与改动对应的步骤;新章、新阶段或用户明确要求全章重构才从定任务走到通过检查。判定标准见 `steps/06-wording.md`。书根 `README.md` 与 `README.en.md` 是仓库说明页,按 `SKILL.md` 的例外只走第 5–8 步,这个例外优先于本步的跳步判定。三种走法见 `SKILL.md`「三种走法」,差别按那里执行。执行时遵守定段落节的既有判定:分句骨架在定句子判为不合格,不在定段落里顺手改句子。
67
+ 回读任务按 `SKILL.md`「三种操作」判入口:只改句子和用词时走第 5–8 步;事实与行为不变、块段或顺序不对时按改写从被打破的步重走,可到第 9 步;缺任务或结构时不在本步补。新章从第 1 步走到通过检查。书根 `README.md` 与 `README.en.md` 按 `SKILL.md` 的例外只走第 5–8 步,这个例外优先于本步的跳步判定。
68
68
 
69
69
  同一处同时命中多条规则时,先按 `references/priority.md` 排级:事实与读者任务 > 结构 > 清晰 > 一致 > 风格。高层没有解决,不先做低层润色;低层改动碰到高层事实,停手退回。
70
70
 
71
- **先切模块,再套规则。** 任何一步动笔前先把文本切成单位,围栏、YAML 与链接 URL 跳过(脚本按同一口径统计,计数见 `verifying-content.py` 输出):
71
+ 先切单位,再套规则:章、节、自然段、句子、列表项、表格、块;围栏、YAML 与链接 URL 跳过。单位怎么判、该退哪一步,留给对应步骤,本步只负责把现象送回那一步。
72
72
 
73
- - **章**:标题到下一个 `##` 之前。只做定任务、定结构。
74
- - **节**:`###` 到下一标题。只做主线与标题对齐。
75
- - **自然段**:空行隔开的散文。只做一段一中心、概念负荷、块后还有没有新信息。这一步不改分句措辞。
76
- - **句子**:段内按「。!?」切开。只做一句一中心、拉链、句内骨架、和下一句是否互相否定。
77
- - **列表项**:`-` 或有序编号。只做一项一中心、平行、字数带。不把列表项当散文拉链改。
78
- - **表格单元格**:管道表。一表一事;格里写事实,不写第二篇散文。
79
- - **块**:导语、围栏、块后、Callout。围栏不是句子;块后新信息的判定见 `steps/03-blocks.md`。
80
-
81
- 「一次对话」不与这些单位并列成切分单位:脚本切得出标题、空行、句号、列表和表格,切不出「一次说话」。它只留在 `steps/05-sentences.md`「一次对话」的判定里——定段落先问这段有几件内容,再决定删、拆或切成几次说话;定句子才改措辞。
82
-
83
- 1. **确定范围**:用户点名的文件,或本轮已改动的文件;项目提供作用域命令时先跑它,只读它列出的文件。全库中文普查只在用户明确要求审完全部中文文件时做,它自己就是那个 goal 的结束条件,不嵌进单章润色。
73
+ 1. **确定范围**:用户点名的文件,或本轮已改动的文件;项目提供作用域命令时先跑它,只读它列出的文件。全库中文普查只在用户明确要求审完全部中文文件时做。
84
74
  2. **沿步骤走本次文件**:每个文件只走它对应的步骤,每步只改该步判为不合格的句子;后一步发现前一步没做完,退回那一步一次,不在当前步补结构。某句只在定用词失败,就不重写它的结构;某段在定句子失败,先改骨架,再让定用词看一遍。已合格的句子不重润。
85
- 3. **改写**:最小改动,只改判为不合格的句子,不做风格重塑。改写不破检查:qmd 导语 token 与句数、段落篇幅、禁用词由 `verifying-content.py` 把关;中文文件保持 UTF-8 无 BOM、LF。代码围栏逐字摘自源文件;注释与源文件不一致时回源改围栏(`steps/03-blocks.md`「摘录与源文件注释」);同源复制文件改一处同步其余并 diff 比对。改动触及知识库案例引用句时先 grep 案例文件再同步。
75
+ 3. **润色**:最小改动,只改判为不合格的句子,不做风格重塑。润色不破检查:qmd 导语 token 与句数、段落篇幅、禁用词由 `verifying-content.py` 把关;中文文件保持 UTF-8 无 BOM、LF。代码围栏逐字摘自源文件;注释与源文件不一致时回源改围栏(`steps/03-blocks.md`「摘录与源文件注释」);同源复制文件改一处同步其余并 diff 比对。改动触及知识库案例引用句时先 grep 案例文件再同步。
86
76
  4. **验收同步**:按改动域跑校验(qmd → `verifying-content.py` + `checking-links.py`;有项目技能时只跑它列出的那一条命令,不跑全量 profile)。检查次数与停手见 `steps/09-check.md`「完成判据」。
87
77
 
88
78
  ### 完成前核对
@@ -93,13 +83,6 @@
93
83
  - [ ] 与改前文本对照过:没有新增原文没有的事实、遗漏读者需要的信息,或把限定说成确定;判法见本文件「情况:对照改前文本」。
94
84
  - [ ] `verifying-content.py` 与 `checking-links.py` 通过,证据在 `temp/`。
95
85
 
96
- ### 下沉指针
97
-
98
- - 判定总纲 / 不同文件的语气 / 病类清单:`steps/06-wording.md`。
99
- - 段、列表、同义、衔接、块链、句内骨架:`steps/04-paragraphs.md`、`steps/07-layout.md`、`steps/03-blocks.md`、`steps/05-sentences.md`。
100
- - 小节密度依据:`steps/02-structure.md`。
101
- - 页面骨架 / 预算 / 标题:`steps/02-structure.md`。
102
-
103
86
  ## 情况
104
87
 
105
88
  ### 情况:现象落在更早的步骤
@@ -112,7 +95,7 @@
112
95
 
113
96
  ### 情况:对照改前文本
114
97
 
115
- 回读时把改后稿和改前稿并排看,专查三件事:改后多了原文没有的事实、数字、命令、性能结论或引文;原文有、改后丢了且读者任务需要的信息;原文的「可能」「通常」「在本书里」被改成确定说法。命中就恢复原文,再按信号表退回对应步。增量润色与全章重构都要对照:全章重构允许删除与换序,不允许改事实和确定性。
98
+ 回读时把改后稿和改前稿并排看,专查三件事:改后多了原文没有的事实、数字、命令、性能结论或引文;原文有、改后丢了且读者任务需要的信息;原文的「可能」「通常」「在本书里」被改成确定说法。命中就恢复原文,再按信号表退回对应步。润色与改写都要对照:改写允许删除与换序,不允许改事实和确定性。
116
99
 
117
100
  ## 正反例
118
101
 
@@ -52,7 +52,7 @@
52
52
 
53
53
  检查结论确定后,调用一次 `quarto_pass_report`,把这次执行的结论压成一张卡片:
54
54
 
55
- - `skill` 填 `writing-quarto`,`mode` 填 `polish` 或 `rewrite`。
55
+ - `skill` 填 `writing-quarto`,`mode` 填 `write`、`rewrite` 或 `polish`。
56
56
  - `files` 写这次动过的章节路径和改动次数(最多 8 个);`steps` 只列有改动的步骤编号(1–9)与次数,两者合计必须一致。
57
57
  - `held` 写围栏、事实这类明确没有改动的地方;没改就传 0。
58
58
  - `checks` 抄内容与渲染的结论,名字只取 `content`、`html`、`layout`,状态只取 `pass`、`fail`、`skip`。
@@ -62,9 +62,9 @@
62
62
 
63
63
  ## 情况
64
64
 
65
- ### 情况:全仓重构
65
+ ### 情况:全仓改写
66
66
 
67
- 任务是全仓重构时,打开 `quarto/refactor.md` 取范围和排除,并加跑 `checking-links.py` 与 `checking-names.py`。HTML 可用性仍只由 `quarto_render_check` 判定。
67
+ 任务是全仓改写时,打开 `quarto/refactor.md` 取范围和排除,并加跑 `checking-links.py` 与 `checking-names.py`。HTML 可用性仍只由 `quarto_render_check` 判定。
68
68
 
69
69
  ### 情况:没有 DSH 工具
70
70