@chengzhao-dev/dsh-quarto-book 0.6.5 → 0.6.7
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.
- package/README.en.md +1 -1
- package/README.md +1 -1
- package/package.json +1 -1
- package/skills/designing-theme/SKILL.md +2 -2
- package/skills/designing-theme/assets/theme/css/content.css +23 -28
- package/skills/designing-theme/references/theme-system.md +1 -1
- package/skills/writing-quarto/quarto/tables.md +5 -3
- package/skills/writing-quarto/steps/02-structure.md +3 -3
package/README.en.md
CHANGED
|
@@ -29,7 +29,7 @@ Both skills are discovered from the package's `skills/` directory and loaded on
|
|
|
29
29
|
2. Open a session in the book repository. `_quarto.yml` needs a standalone `type: book` line, and the book needs at least one `.qmd` or `.md` chapter source; only then do both skill names appear.
|
|
30
30
|
3. Call a skill: `writing-quarto` for prose, `designing-theme` for the theme.
|
|
31
31
|
|
|
32
|
-
Replace `--profile` with the profile you actually run. The desktop app always runs the `desktop` profile, and that profile is owned by the app, so `dsh --profile desktop` is rejected; install or upgrade with `dsh plugin --profile desktop add <package>`, and use the app's Settings → Plugins → Add plugin only if the app refuses that write. To pin a version, write `npm:@chengzhao-dev/dsh-quarto-book@0.6.
|
|
32
|
+
Replace `--profile` with the profile you actually run. The desktop app always runs the `desktop` profile, and that profile is owned by the app, so `dsh --profile desktop` is rejected; install or upgrade with `dsh plugin --profile desktop add <package>`, and use the app's Settings → Plugins → Add plugin only if the app refuses that write. To pin a version, write `npm:@chengzhao-dev/dsh-quarto-book@0.6.7`; to follow a GitHub tag, write `github:chengzhao-dev/dsh-quarto-book#v0.6.7`.
|
|
33
33
|
|
|
34
34
|
Upgrading from the old unscoped package `dsh-quarto-book` (removed from npm with 0.3.4, so this only affects profiles that installed it earlier): remove it from the same profile first with `dsh plugin --profile <profile> remove dsh-quarto-book`, then add the scoped package. Keeping both installed registers `writing-quarto` and `designing-theme` twice at the same rank 550.
|
|
35
35
|
|
package/README.md
CHANGED
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
2. 在书仓库里打开会话。`_quarto.yml` 要有独立一行的 `type: book`,书根至少有一个 `.qmd` 或 `.md` 章节源文件;两个技能名这时才会出现。
|
|
30
30
|
3. 调用技能:写正文用 `writing-quarto`,改主题用 `designing-theme`。
|
|
31
31
|
|
|
32
|
-
`--profile` 换成你实际运行的那个 profile。桌面应用固定跑 `desktop` profile,且该 profile 由应用独占管理,`dsh --profile desktop` 直接启动会被拒绝;安装或升级用 `dsh plugin --profile desktop add <包>`,应用拒绝写入时再走「设置 → 插件 → 添加插件」。需要固定版本时写 `npm:@chengzhao-dev/dsh-quarto-book@0.6.
|
|
32
|
+
`--profile` 换成你实际运行的那个 profile。桌面应用固定跑 `desktop` profile,且该 profile 由应用独占管理,`dsh --profile desktop` 直接启动会被拒绝;安装或升级用 `dsh plugin --profile desktop add <包>`,应用拒绝写入时再走「设置 → 插件 → 添加插件」。需要固定版本时写 `npm:@chengzhao-dev/dsh-quarto-book@0.6.7`,跟 GitHub 标签时写 `github:chengzhao-dev/dsh-quarto-book#v0.6.7`。
|
|
33
33
|
|
|
34
34
|
从旧的无作用域包 `dsh-quarto-book` 升级(该包已随 0.3.4 从 npm 删除,只影响之前装过它的 profile):先在同一个 profile 里 `dsh plugin --profile <profile> remove dsh-quarto-book`,再装新包。两个包同时留着会以相同的 rank 550 各注册一遍 `writing-quarto` 和 `designing-theme`。
|
|
35
35
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@chengzhao-dev/dsh-quarto-book",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.7",
|
|
4
4
|
"description": "把一份 Quarto Book 写成可读、可查、可发布的中文技术书:九步章节写作、结构/链接/图表检查、统一主题与渲染验收。 · Write, check, and publish a Chinese Quarto Book: nine-step chapter writing, structure/link/figure checks, a consistent theme, and render acceptance.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./lib/index.js",
|
|
@@ -33,12 +33,12 @@ metadata:
|
|
|
33
33
|
1. 主题资产被书根 `_quarto.yml` 以相对路径直接消费;移动或改名必须同步 `_quarto.yml`。
|
|
34
34
|
2. `css/` 组件规则不写色值,语义颜色只来自 `palettes/<name>/tokens.css`(默认 Flexoki;Solarized 为运行时覆盖层);`css/tokens.css` 只放结构尺度令牌,明暗共用。
|
|
35
35
|
3. 这套资产是本插件主题的唯一来源。项目内若存在副本,先确认哪一份被 `_quarto.yml` 引用,再只改被引用的那一份,不假定两处自动同步。
|
|
36
|
-
4. 修改主题或 `_quarto.yml`
|
|
36
|
+
4. 修改主题或 `_quarto.yml` 后用 `quarto_render_check` 做整本渲染,验证明暗两套主题;布局调整优先修改 grid 与共享节奏,不用页面局部样式堆叠间距。
|
|
37
37
|
5. 不新增字体文件、不引入新颜色来源:字体与颜色决定的理由在 `knowledge/reading-surface.md`,改决定先改知识再动资产。
|
|
38
38
|
|
|
39
39
|
## 完成判据
|
|
40
40
|
|
|
41
|
-
- [ ] `
|
|
41
|
+
- [ ] `quarto_render_check` 的 `html_report` 为可用,明暗主题下页面无错位或对比度问题;`scripts/checking-layout.py` 通过。
|
|
42
42
|
- [ ] 代码块 filename 标题在长路径输入下不撑破容器,窄屏仍可读;超长代码在块内横向滚动,不出整页横向滚动条。
|
|
43
43
|
- [ ] 若项目内有主题副本,已在交付说明中写清改动是否同步,以及以哪一份为准。
|
|
44
44
|
- [ ] 收尾调用一次 `quarto_pass_report`:`skill` 填 `designing-theme`,`mode` 填 `theme`,`steps` 用主题步骤表的名字(`定表面`、`定字体`、`定尺度`、`定颜色`、`定组件`、`通过检查`),检查结论照实填。卡片就是回执,回复里不再复述。
|
|
@@ -7,33 +7,38 @@
|
|
|
7
7
|
扫读时表格被读成「另一类内容」。表头小一号但不加大写(中文表头 uppercase 无意义且显僵硬)。 */
|
|
8
8
|
font-size: 1rem;
|
|
9
9
|
border-collapse: collapse;
|
|
10
|
-
display:
|
|
10
|
+
/* 表格本体保持表格布局:display: table 才能让 tbl-colwidths 生效,
|
|
11
|
+
width: 100% 让表与代码块占满同一正文栏。横向滚动交给 .table-responsive。 */
|
|
12
|
+
display: table;
|
|
13
|
+
table-layout: fixed;
|
|
11
14
|
width: 100%;
|
|
12
15
|
max-width: 100%;
|
|
13
|
-
overflow-x: auto;
|
|
14
|
-
-webkit-overflow-scrolling: touch;
|
|
15
|
-
/* 列宽随内容分配:不写固定像素,长单元格换行,整表窄屏横向滚动。 */
|
|
16
|
-
table-layout: auto;
|
|
17
16
|
margin-block: 1.35rem 1.5rem;
|
|
18
17
|
border: none;
|
|
19
18
|
border-radius: 0;
|
|
20
19
|
font-variant-numeric: tabular-nums;
|
|
21
20
|
}
|
|
21
|
+
/* Quarto 的 .responsive 类把宽表包进这层:外层承担横向滚动。表体是 fixed + 100%
|
|
22
|
+
时不会溢出,滚动条永远不出现;包内因此改回按内容宽度排布,min-width 保证短表
|
|
23
|
+
仍占满正文栏,内容更宽时才真的滚动。 */
|
|
24
|
+
.table-responsive {
|
|
25
|
+
width: 100%;
|
|
26
|
+
overflow-x: auto;
|
|
27
|
+
-webkit-overflow-scrolling: touch;
|
|
28
|
+
}
|
|
29
|
+
.table-responsive > .table {
|
|
30
|
+
table-layout: auto;
|
|
31
|
+
width: max-content;
|
|
32
|
+
min-width: 100%;
|
|
33
|
+
}
|
|
22
34
|
.table > :not(caption) > * > * {
|
|
23
|
-
padding: 0.
|
|
35
|
+
padding: 0.625rem 1rem;
|
|
24
36
|
/* 多行单元格从顶部起排,同一行里短格子不被拉到垂直居中。 */
|
|
25
37
|
vertical-align: top;
|
|
26
38
|
/* 长 API 名与长句允许在格内折行,避免把整张表撑出内容列。 */
|
|
27
39
|
overflow-wrap: break-word;
|
|
28
40
|
border-bottom: 0;
|
|
29
41
|
}
|
|
30
|
-
/* 首尾列贴边,让表格与正文左缘对齐 */
|
|
31
|
-
.table > :not(caption) > * > :first-child {
|
|
32
|
-
padding-inline-start: 0;
|
|
33
|
-
}
|
|
34
|
-
.table > :not(caption) > * > :last-child {
|
|
35
|
-
padding-inline-end: 0;
|
|
36
|
-
}
|
|
37
42
|
.table thead th {
|
|
38
43
|
/* 表头用加粗与一道极浅底色标出层级;不套 .compact-table,列宽仍随内容。 */
|
|
39
44
|
background-color: color-mix(in srgb, var(--table-border) 24%, transparent);
|
|
@@ -41,9 +46,9 @@
|
|
|
41
46
|
/* 表头比表体小 1px(17px → 15px),层级靠字重、字号与底色,不靠更粗的线。 */
|
|
42
47
|
font-size: 0.9375rem;
|
|
43
48
|
line-height: 1.6;
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
49
|
+
/* 表头是短标签,水平与垂直都居中;表体长句保持左对齐、顶对齐。 */
|
|
50
|
+
text-align: center;
|
|
51
|
+
vertical-align: middle;
|
|
47
52
|
border-top: 1px solid var(--table-border);
|
|
48
53
|
border-bottom: 1px solid var(--table-border);
|
|
49
54
|
}
|
|
@@ -52,26 +57,16 @@
|
|
|
52
57
|
}
|
|
53
58
|
|
|
54
59
|
/* 短对照表保持全宽左对齐(与正文同宽,不居中收窄);左对齐便于中文术语扫读。
|
|
55
|
-
|
|
60
|
+
宽表由 .table 默认规则负责,不要给多列/长单元格表套本类。 */
|
|
56
61
|
.compact-table {
|
|
57
|
-
overflow-x: auto;
|
|
58
|
-
}
|
|
59
|
-
.compact-table .table {
|
|
60
|
-
display: table;
|
|
61
62
|
width: 100%;
|
|
62
|
-
|
|
63
|
+
overflow-x: auto;
|
|
63
64
|
}
|
|
64
65
|
.compact-table .table th,
|
|
65
66
|
.compact-table .table td {
|
|
66
67
|
text-align: left;
|
|
67
68
|
padding-inline: 1.25rem;
|
|
68
69
|
}
|
|
69
|
-
.compact-table .table > :not(caption) > * > :first-child {
|
|
70
|
-
padding-inline-start: 0;
|
|
71
|
-
}
|
|
72
|
-
.compact-table .table > :not(caption) > * > :last-child {
|
|
73
|
-
padding-inline-end: 0;
|
|
74
|
-
}
|
|
75
70
|
|
|
76
71
|
/* 表题:Pandoc 输出 <caption>,Bootstrap 默认把它放表下(caption-side: bottom),
|
|
77
72
|
这里统一提到表上、左对齐,与图注一样小一号。 */
|
|
@@ -81,7 +81,7 @@
|
|
|
81
81
|
- **章节翻页**:一条顶线 + 左右两个文字链接,不用边框卡片;箭头用 `<` / `>`,hover 才转 `--accent`,下一页右对齐。箭头用字符而不用 SVG 是量过的:Bright 的 `<` `>` 墨迹中心在 0.23em,与同行西文同一轴,没有面包屑 `>` 那种偏高,换 SVG 反而要另配基线。
|
|
82
82
|
- **章节线**:标题不画线。全书只有一种横线——通栏 1px `--card-border` 发丝线,只出现在顶栏底边、引用块上下边、表格 booktabs、首页目录每行顶线、翻页顶线、页脚顶线、答案折叠线;`h2::after` 的 2.25rem 短发丝线已删除(连同首页 `.feature-grid` 例外),章节节奏只靠 H2 的 `margin-top: 3.25rem` 与字号台阶。约定改动时同步本节与 `css/base.css`。
|
|
83
83
|
- **引用块**:上下各一条 1px `--card-border` 横线、正文色、无底色、无左右竖条;与 Callout 的 2px 左色条区分开(后者是类型标记,不是分隔线)。
|
|
84
|
-
- **表格**:`display:
|
|
84
|
+
- **表格**:`display: table` + `table-layout: fixed` 吃 `tbl-colwidths`,`width: 100%` 让表与代码块占满同一正文栏;表头水平与垂直居中,表体左对齐、顶对齐,四边 padding 一致、首列不贴边。`display: block` 不行:外层块占 100%,里面的匿名表按内容收缩,表会变窄。宽表由 Quarto `.responsive` 类包成 `.table-responsive` 外层滚动容器;包内表改回 `table-layout: auto` + `width: max-content`,否则 fixed + 100% 永远不会溢出、滚动条是死的。不需要 JS 量列宽。表题走 `caption-side: top`、左对齐、14px `--text-secondary`;`table-striped` 压平成与普通行同底。
|
|
85
85
|
- **脚注**:区块顶部一条 1px `--card-border`、`margin-top: 3rem`、14px / lh 1.7、`--text-secondary`;回跳箭头随正文链接色。
|
|
86
86
|
- **任务列表**:`input[type=checkbox]` 用 `accent-color: var(--action-color)`,不用系统蓝。
|
|
87
87
|
- **图片**:正文图与坐标图圆角一律 `--radius-sm`(3px),不用 6px 大圆角;图注选择器同时覆盖 `figure figcaption`、`.quarto-float-caption`、`.figure-caption`(`lang: zh` 后 Quarto 生成「图 3.1: …」,`lang` 必须写在 `_quarto.yml`,否则图/表题回落英文 Figure/Table)。
|
|
@@ -27,11 +27,13 @@
|
|
|
27
27
|
| 接口 | 返回 | 边界 |
|
|
28
28
|
| --- | --- | --- |
|
|
29
29
|
| `GetCellType` | 坐标处的 `CellType` | 越界时抛出 `std::out_of_range` |
|
|
30
|
-
: {tbl-colwidths="[24,30,46]"}
|
|
30
|
+
: {.responsive tbl-colwidths="[24,30,46]"}
|
|
31
31
|
```
|
|
32
32
|
|
|
33
33
|
比例按内容分配:名称与接口列 18–26,返回列 22–32,说明列 34–50,三项合计 100。三列以上时最长列不超过 55,避免其余列被挤成一条线。
|
|
34
|
-
-
|
|
34
|
+
- 表格与代码块同宽:主题用 `table-layout: fixed` 吃上面的比例,四边内边距一致,首列不贴边;表头在格内水平、垂直居中,表体左对齐、顶对齐。
|
|
35
|
+
- 宽表在表属性里加 `.responsive`(Quarto 内置类):Quarto 生成外层 `.table-responsive` 滚动容器,主题在该容器里改回按内容宽度排布,内容超过正文栏时才出现横向滚动。窄表可省。
|
|
36
|
+
- 不写固定宽度(`{width=...}`、`style="width:..."`),也不覆盖 `table-layout`;比例之外的几何由主题负责。
|
|
35
37
|
- 长单元格先改文案:删重复修饰,把条件与结果按「条件 + 结果」排成一句。仍长时允许格内折行,`overflow-wrap: break-word` 已由主题处理。
|
|
36
38
|
|
|
37
39
|
## 单元格
|
|
@@ -74,6 +76,6 @@
|
|
|
74
76
|
|
|
75
77
|
- [ ] 表前有导语、表后有一句结论,两句都不复述格子内容。
|
|
76
78
|
- [ ] 代码块、图、列表与表之间隔了一段正文。
|
|
77
|
-
- [ ] 表头没有手写加粗;列宽是相对比例,最长列不超过 55
|
|
79
|
+
- [ ] 表头没有手写加粗;列宽是相对比例,最长列不超过 55%;宽表加了 `.responsive`。
|
|
78
80
|
- [ ] 一格一个事实,没有「名词:说明」和手动空格对齐。
|
|
79
81
|
- [ ] 短表已改回句子或列表。
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
- **无标题引言**:第一个 `##` 之前,写成**连贯读者文**回答读者三问——从哪来(承接上一章已成立的结果)、这一章做什么(本章要解决的问题与读者将获得的能力,正面陈述;范围能并则并,不写否定式后章预告)、代码在哪(可选:若本章有主源文件,用**同段末句**自然语言点名并挂全章 blob 链接,不另起「代码写在…里」独立段)。第一句写出谁在什么情况下做本章这件事,类章同时写出类名;类型怎么实现放到后面的句子。不另开背景节。**形态硬限(用户决定)**:首选**恰好 1 个自然段**(通常 2–4 句);必要时允许 **1 个自然段 + 1 个列表**(列表前引导句写在同一段末,或段落后紧跟列表;列表不算第二散文段);**禁止**出现两个散文自然段并立,更禁止 ≥3 段、单句孤儿段、结尾导航段。列表仅用于并列范围/对象,任务细节下沉正文 `##`,不用顿号串交付物冒充散文。**摘录免责句永不写进读者正文**:「本章摘录源码服务于讲解」「片段不保证与源文件逐字一致」「不等于文件内顺序」类作者旁白一律删除(旧「示例位置句开口子」已废止),同源保证交给 `verifying-content.py`;摘录免责只保留在 技能的权威文件与检查脚本里。不放 Callout,不写后续章节内容,不用「后面的 X」式前向指称引入后续章节才建立的结构件(如「实现放在后面的编号目录里」)。引言容纳多个独立概念时**并段或改列表**,禁止拆成两个散文段;拆分判据见 `steps/04-paragraphs.md`「拆分判据」。内容量硬限:token 预算见本文件「分层上限」;范围边界能并入承接段时不成列表。承接中引用其他章节一律用章节标题链接,不用「第 N 章」;**链接预算**:引言只挂承接上一章的那 1 个章节链接和本章主源文件的 blob 链接,其余章节链接下沉到正文真正用到它的句子,每处只挂当下需要的那个目标,同一段不堆多个章节链接(Google 技术写作指南把每个链接视为一次读者可能离开当前页的机会,链接越多,认知负担越重);本章回顾的下一章预告不写链接,直述预告一句(页面导航已有前进按钮),两者均见 `steps/06-wording.md`。任务概览默认并入承接句,正文小节就是任务的展开;预览列表仅当任务没有对应正文小节时使用(示例章四项工作列表已按此删除)。原 front matter `description` 的定位信息并入引言承接句,信息只保留引言一处、不同义两存;章节 qmd 不写 `description`(字段出处见 basics.md)。着陆页 `index` 按 landing 规则组织,不硬套本契约。
|
|
21
21
|
- **任务序列**:每节一个可验证结果。判定标准是任务结束时存在一个读者能自己复述的检查动作;只有「读完了解释」的内容并入相邻任务。概念 → 最小示例 → 操作 → 验证 → 边界,先让读者看到行为再解释规则;单次操作按「做什么 → 执行什么 → 看到什么 → 简短说明」推进。各章的任务节以该章标题里的对象为准,不把每一章都写成「目录、设计、构建、测试」四节。设计范围以这一章能在 `src/` 里核对的源文件收束。内容量硬限:任务级 `##` 通常不超过 4 个;`##` 与 `###` 开头的承接句数见本文件「分层上限」,写完直接进入代码、命令或列表;超出即为凑字数信号,禁令见 `steps/04-paragraphs.md`「凑字数禁令」。有 `###` 子节时,二级标题(`##`)的引言须承接上文;恰好 2 个子节时一句点一个,3 个或 4 个时不再逐个点名,点名交给三级标题的句式见本文件「标题分层」,点名用读者已认识的词,不点后文才定义的类型名;一句之内禁止把两个子节对象配成「由 X 定位,并保存 Y」「分别交给」式的两组对应(对照见 `examples/05-sentence-frame.md`「拉链句」)。交付清单或纯边界说明不单独设 `##`,并入引言或相邻工程总览节;同一头文件中连续的值类型优先按一个可验证结果归并到同一任务节。任务节内的讲述顺序按「类型 → 简单函数 → 更难的函数」排列,最难的组装放在最后,并满足先定义后调用:读者要跟着读懂的行内代码标识符,其行为必须已经出现过——上一章、上文,或同一小节里紧挨着的声明和一句行为——上一章已建立的名字视为已知;未定义名字的调用链、节首概览与编号步骤整段删除。`##` 导语只用白话,不点后文才定义的函数名。章内顺序的依据见 `SKILL.md`「九步」的定结构一条,本文件不复述。
|
|
22
22
|
- **常见错误**:服务失败后回来的读者。每个症状一个 `###`,标题后第一句写触发条件和可观察现象。误用型条目一段成文写原因与正确做法;原因与做法各需一句完整交代时(如原因牵涉私有段的设计动机),用症状句导语加「出错的原因/正确的做法」引导词列表,列表可作为节导语的合法收尾,导语预算只约束症状句;排查型故障展开定位 → 修复 → 验证三步。形态分野与细则是 `writing-quarto` 技能 `quarto/terminal.md`「常见错误条目形态与三步诊断流」。入门章节只保留最可能遇到的 2-3 项,不是完整 FAQ。
|
|
23
|
-
- **自测问题**:服务刚跑通主线、需要确认理解的读者。每章 0-7 道题,题目问本章已经写明的一件可观察结果(会怎样、是哪一个、从几开始),没有这种结果就不设题;只有本章写了原因、而且情景已经说全时,才用「为什么」。题面用本章已经用过的词说全,不用本章未定义的概念,不问「为什么不做成另一种」;题干是合上书的一问,只看本题题干、不看答案与上一题;题干代词的判法见 `steps/05-sentences.md`「代词不能代替未写出的对象」,允许「什么」——它在要一个名字或一句文字,不是指上文没出现的东西;题面里每个细节都要改变答案,答案不受细节影响时不单点某一种情形。题面只描述一个自洽局面,每个事实都要能同时成立,禁止把互相矛盾的局面写成题干(同一句里先说轮到甲方、又说这一步的用户是 O,读者听到的是程序自相矛盾,不是一次非法调用)——「轮到谁」和「这一步的用户」若是同一个对象,只写一次。要考拒绝,用正文已经用过的那条规则问可观察结果(正例:「空状态面板开局,轮到甲方。没轮到的一方来操作时,状态面板会改变吗?」,答案首句「不会。操作的用户不是当前用户,`Place` 返回 `kRejected`,状态面板和轮次都保持原样。」);不为了出题制造正文没走过的矛盾局面。一道题只问一件可观察结果,不把两个观察捆进同一题(如「状态面板是空的吗」与「轮到谁」并列),拆开或删去一个。固定导语「不要展开答案,试着自己把回答完整说出来,写完之后展开对照;说不出来的部分,回到对应小节对照正文。」;答案写在 `::: {.answer}` 围栏 div
|
|
23
|
+
- **自测问题**:服务刚跑通主线、需要确认理解的读者。每章 0-7 道题,题目问本章已经写明的一件可观察结果(会怎样、是哪一个、从几开始),没有这种结果就不设题;只有本章写了原因、而且情景已经说全时,才用「为什么」。题面用本章已经用过的词说全,不用本章未定义的概念,不问「为什么不做成另一种」;题干是合上书的一问,只看本题题干、不看答案与上一题;题干代词的判法见 `steps/05-sentences.md`「代词不能代替未写出的对象」,允许「什么」——它在要一个名字或一句文字,不是指上文没出现的东西;题面里每个细节都要改变答案,答案不受细节影响时不单点某一种情形。题面只描述一个自洽局面,每个事实都要能同时成立,禁止把互相矛盾的局面写成题干(同一句里先说轮到甲方、又说这一步的用户是 O,读者听到的是程序自相矛盾,不是一次非法调用)——「轮到谁」和「这一步的用户」若是同一个对象,只写一次。要考拒绝,用正文已经用过的那条规则问可观察结果(正例:「空状态面板开局,轮到甲方。没轮到的一方来操作时,状态面板会改变吗?」,答案首句「不会。操作的用户不是当前用户,`Place` 返回 `kRejected`,状态面板和轮次都保持原样。」);不为了出题制造正文没走过的矛盾局面。一道题只问一件可观察结果,不把两个观察捆进同一题(如「状态面板是空的吗」与「轮到谁」并列),拆开或删去一个。固定导语「不要展开答案,试着自己把回答完整说出来,写完之后展开对照;说不出来的部分,回到对应小节对照正文。」;答案写在 `::: {.answer}` 围栏 div 内,由书内 `filters/answering-disclosure.lua` 渲染为默认收起的原生 `<details>`;答案只使用本章已讲过的概念。题目同样必须能由本章正文回答:答案依据须是正文已写明的内容,正文没讲的概念不设题;若问题值得问,先在正文补上依据再设题。答案先答所问:首句直接回答题面,一到两句,不补题面之外的对比、延伸或重复题面(对照与归属由正文承载)。问答中的文件、路径与标识符指称统一用行内代码,不挂链接(`verifying-content.py` 对自测节链接记 WARN);所属目录在答案前文已确立时,路径可省去重复的顶层前缀(如先写 `example/`,后文写 `include/state.h`)。
|
|
24
24
|
- **本章回顾**:服务已经成功的读者。1-2 句段落(不是 bullet 列表):「你已经能 <能力>」中的能力必须对应本章任务节交出的结果,可复用任务节关键词,不写正文没有的抽象总称(如「按输入、输出和终局」);「下一章 <预告>」不写链接,直述预告一句(页面导航已有前进按钮),预告不引入下一章才建立的术语。回顾的每个说法都要能在正文找到出处,禁止空泛能力句或只写预告;正文任务节变化时同步改写回顾。
|
|
25
25
|
|
|
26
26
|
### 有 class 的章的任务节
|
|
@@ -129,7 +129,7 @@
|
|
|
129
129
|
|
|
130
130
|
### 命名检查
|
|
131
131
|
|
|
132
|
-
改 title
|
|
132
|
+
改 title 不改文件名,除非主题边界或页面职责变化;改动后用 `quarto_render_check` 检查右侧目录与书内导航显示。页面 title 变化时,part 落地页的卡片标题与一句话描述同步改为新 title 的承诺,一句话仍概括该章交付,不沿用旧措辞。
|
|
133
133
|
|
|
134
134
|
### 计数口径
|
|
135
135
|
|
|
@@ -181,7 +181,7 @@
|
|
|
181
181
|
|
|
182
182
|
页面“紧凑”通常有两个来源:正文列太窄导致无谓换行,或块之间缺少承接留白。优先小幅放宽 Quarto HTML grid 的 `body-width`,再用共享 CSS 调整正文块间距;不要只放大字体,也不要用局部规则给每个块重复加 margin。正文列仍需保留 `max-width: 100%`,代码和宽表在窄屏上继续滚动或换行。
|
|
183
183
|
|
|
184
|
-
当前仓库采用 840px 的正文内容列和约 1.55rem 的普通块间距,代码块连续出现时保留更大的间隔。代码块与正文同宽:不再对代码做二次限宽(`--code-max-width` 已删除),宽屏两侧留白属主流文档站(VitePress 1440 壳/688 正文)正常行为,不按显示器拉满正文。872px/840px 的取值依据(100 列代码不折行)见 `../designing-theme/knowledge/reading-surface.md`。评估重点是:每个任务是否有清晰的动作与结果、连续盒子之间是否有解释段、移动端是否出现横向溢出。这里不设置依赖浏览器截图的硬阈值,最终以 `
|
|
184
|
+
当前仓库采用 840px 的正文内容列和约 1.55rem 的普通块间距,代码块连续出现时保留更大的间隔。代码块与正文同宽:不再对代码做二次限宽(`--code-max-width` 已删除),宽屏两侧留白属主流文档站(VitePress 1440 壳/688 正文)正常行为,不按显示器拉满正文。872px/840px 的取值依据(100 列代码不折行)见 `../designing-theme/knowledge/reading-surface.md`。评估重点是:每个任务是否有清晰的动作与结果、连续盒子之间是否有解释段、移动端是否出现横向溢出。这里不设置依赖浏览器截图的硬阈值,最终以 `quarto_render_check` 渲染出的 HTML 结构和实际阅读抽查为准。
|
|
185
185
|
|
|
186
186
|
Quarto 通过 HTML grid 控制正文、侧栏和目录列,代码块的 `filename`、换行和复制行为由代码块配置及 CSS 共同控制;页面宽度与代码标题过长是两个独立问题。
|
|
187
187
|
|