paperfit-cli 1.0.0

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.
Files changed (65) hide show
  1. package/.claude/commands/adjust-length.md +21 -0
  2. package/.claude/commands/check-visual.md +27 -0
  3. package/.claude/commands/fix-layout.md +31 -0
  4. package/.claude/commands/migrate-template.md +23 -0
  5. package/.claude/commands/repair-table.md +21 -0
  6. package/.claude/commands/show-status.md +32 -0
  7. package/.claude-plugin/README.md +77 -0
  8. package/.claude-plugin/marketplace.json +41 -0
  9. package/.claude-plugin/plugin.json +39 -0
  10. package/CLAUDE.md +266 -0
  11. package/CONTRIBUTING.md +131 -0
  12. package/LICENSE +21 -0
  13. package/README.md +164 -0
  14. package/agents/code-surgeon-agent.md +214 -0
  15. package/agents/layout-detective-agent.md +229 -0
  16. package/agents/orchestrator-agent.md +254 -0
  17. package/agents/quality-gatekeeper-agent.md +270 -0
  18. package/agents/rule-engine-agent.md +224 -0
  19. package/agents/semantic-polish-agent.md +250 -0
  20. package/bin/paperfit.js +176 -0
  21. package/config/agent_roles.yaml +56 -0
  22. package/config/layout_rules.yaml +54 -0
  23. package/config/templates.yaml +241 -0
  24. package/config/vto_taxonomy.yaml +489 -0
  25. package/config/writing_rules.yaml +64 -0
  26. package/install.sh +30 -0
  27. package/package.json +52 -0
  28. package/requirements.txt +5 -0
  29. package/scripts/benchmark_runner.py +629 -0
  30. package/scripts/compile.sh +244 -0
  31. package/scripts/config_validator.py +339 -0
  32. package/scripts/cv_detector.py +600 -0
  33. package/scripts/evidence_collector.py +167 -0
  34. package/scripts/float_fixers.py +861 -0
  35. package/scripts/inject_defects.py +549 -0
  36. package/scripts/install-claude-global.js +148 -0
  37. package/scripts/install.js +66 -0
  38. package/scripts/install.sh +106 -0
  39. package/scripts/overflow_fixers.py +656 -0
  40. package/scripts/package-for-opensource.sh +138 -0
  41. package/scripts/parse_log.py +260 -0
  42. package/scripts/postinstall.js +38 -0
  43. package/scripts/pre_tool_use.py +265 -0
  44. package/scripts/render_pages.py +244 -0
  45. package/scripts/session_logger.py +329 -0
  46. package/scripts/space_util_fixers.py +773 -0
  47. package/scripts/state_manager.py +352 -0
  48. package/scripts/test_commands.py +187 -0
  49. package/scripts/test_cv_detector.py +214 -0
  50. package/scripts/test_integration.py +290 -0
  51. package/skills/consistency-polisher/SKILL.md +337 -0
  52. package/skills/float-optimizer/SKILL.md +284 -0
  53. package/skills/latex_fixers/__init__.py +82 -0
  54. package/skills/latex_fixers/float_fixers.py +392 -0
  55. package/skills/latex_fixers/fullwidth_fixers.py +375 -0
  56. package/skills/latex_fixers/overflow_fixers.py +250 -0
  57. package/skills/latex_fixers/semantic_micro_tuning.py +362 -0
  58. package/skills/latex_fixers/space_util_fixers.py +389 -0
  59. package/skills/latex_fixers/utils.py +55 -0
  60. package/skills/overflow-repair/SKILL.md +304 -0
  61. package/skills/space-util-fixer/SKILL.md +307 -0
  62. package/skills/taxonomy-vto/SKILL.md +486 -0
  63. package/skills/template-migrator/SKILL.md +251 -0
  64. package/skills/visual-inspector/SKILL.md +217 -0
  65. package/skills/writing-polish/SKILL.md +289 -0
@@ -0,0 +1,304 @@
1
+ # Overflow Repair Skill
2
+
3
+ ## 概述
4
+
5
+ 本技能专门处理 **Category D:溢出与对齐缺陷**,包括:
6
+
7
+ - **D1**:Overfull hbox(段落文本、表格单元格、公式溢出栏宽)
8
+ - **D2**:长公式未合理断行
9
+ - **D3**:URL/长标识符溢出
10
+
11
+ 该技能由 `code-surgeon-agent` 调用,执行对 `.tex` 源码的精确修改,以消除或缓解溢出问题。所有修复遵循 **最小修改原则**,不改变学术内容。
12
+
13
+ ---
14
+
15
+ ## 适用场景
16
+
17
+ 当 `layout-detective-agent` 或 `rule-engine-agent` 报告中出现以下缺陷 ID 时,路由至本技能:
18
+
19
+ | 缺陷 ID | 描述 | 优先级 |
20
+ |---------|------|--------|
21
+ | D1 | Overfull hbox(段落/表格/公式) | High |
22
+ | D2 | 长公式未断行 | High |
23
+ | D3 | URL/长标识符溢出 | Medium |
24
+
25
+ ---
26
+
27
+ ## 输入规范
28
+
29
+ | 输入项 | 来源 | 说明 |
30
+ |--------|------|------|
31
+ | 主 `.tex` 文件路径 | 项目上下文 | 需修改的源文件 |
32
+ | 规则引擎报告 | `rule-engine-agent` 输出 | 包含溢出位置(行号)、溢出量、对象 |
33
+ | 排版侦探报告 | `layout-detective-agent` 输出 | 包含视觉确认的溢出页面和对象 |
34
+ | 当前编译日志 | `.log` 文件 | 用于验证修复后溢出是否消除 |
35
+
36
+ ---
37
+
38
+ ## 输出规范
39
+
40
+ 修改完成后,必须返回以下信息:
41
+
42
+ ```json
43
+ {
44
+ "skill": "overflow-repair",
45
+ "status": "success | partial | failed",
46
+ "modified_files": ["main.tex", "tables/table1.tex"],
47
+ "changes": [
48
+ {
49
+ "defect_id": "D1",
50
+ "object": "Table 2",
51
+ "action": "替换 tabular 为 tabularx,设置列宽比例",
52
+ "before": "\\begin{tabular}{|l|c|c|}",
53
+ "after": "\\begin{tabularx}{\\linewidth}{|l|X|X|}"
54
+ }
55
+ ],
56
+ "unresolved": []
57
+ }
58
+ ```
59
+
60
+ ---
61
+
62
+ ## 修复策略
63
+
64
+ ### 策略选择流程
65
+
66
+ 1. 根据日志和视觉报告定位溢出位置与类型(段落/表格/公式/URL)。
67
+ 2. 按照下文各类型的修复策略依次尝试,从最不侵入的方案开始。
68
+ 3. 每次修改后,通知 `orchestrator-agent` 触发重新编译以验证效果。
69
+ 4. 若当前策略无效,回退并尝试下一策略。
70
+
71
+ ---
72
+
73
+ ### D1:段落文本溢出
74
+
75
+ **问题特征**:
76
+ - 日志:`Overfull \hbox (Xpt too wide) in paragraph at lines A--B`
77
+ - 视觉:某行文本伸出右边界
78
+
79
+ **修复策略(按优先级)**:
80
+
81
+ 1. **引入断词点**
82
+ 在溢出单词的合适位置添加 `\-` 连字符,使 LaTeX 能在该处断行。
83
+ ```latex
84
+ % 修改前
85
+ This is a verylongwordthatdoesnotbreak.
86
+ % 修改后
87
+ This is a very\-long\-word\-that\-does\-not\-break.
88
+ ```
89
+
90
+ 2. **调整段落级容差**
91
+ 在段落前临时增加 `\emergencystretch` 或调整 `\tolerance`。
92
+ ```latex
93
+ {\emergencystretch=1em % 允许额外拉伸 1em
94
+ This is the problematic paragraph content...
95
+ }
96
+ ```
97
+ *注意:修改后需恢复默认值,避免影响全局。*
98
+
99
+ 3. **局部微调措辞**(需 `semantic-polish-agent` 介入)
100
+ 若排版手段无法解决,可替换为稍短的近义词或调整语序。
101
+ ```latex
102
+ % 修改前
103
+ the implementation of the proposed methodology
104
+ % 修改后
105
+ the implementation of our method
106
+ ```
107
+
108
+ ---
109
+
110
+ ### D1:表格单元格溢出
111
+
112
+ **问题特征**:
113
+ - 日志:`Overfull \hbox (Xpt too wide) in alignment at lines A--B`
114
+ - 视觉:表格某单元格内容超出列宽,与相邻列重叠或伸出表格边界
115
+
116
+ **修复策略(按优先级)**:
117
+
118
+ 1. **改用 `tabularx` 环境**
119
+ 将 `tabular` 替换为 `tabularx`,并为文本列分配 `X` 列类型以允许自动换行。
120
+ ```latex
121
+ % 修改前
122
+ \begin{tabular}{|l|c|c|}
123
+ \hline
124
+ Method & Description & Score \\
125
+ \hline
126
+ Ours & A very long description that causes overflow & 0.95 \\
127
+ \hline
128
+ \end{tabular}
129
+
130
+ % 修改后
131
+ \usepackage{tabularx} % 确保导言区已引入
132
+ ...
133
+ \begin{tabularx}{\linewidth}{|l|X|X|}
134
+ \hline
135
+ Method & Description & Score \\
136
+ \hline
137
+ Ours & A very long description that causes overflow & 0.95 \\
138
+ \hline
139
+ \end{tabularx}
140
+ ```
141
+ *规则*:多个文本列应共同使用 `X` 列,避免单列过宽。
142
+
143
+ 2. **手动设置列宽**
144
+ 使用 `p{宽度}` 列类型固定文本列宽度。
145
+ ```latex
146
+ \begin{tabular}{|l|p{4cm}|c|}
147
+ ```
148
+
149
+ 3. **精简表头或内容**
150
+ 若表头过长导致溢出,可缩写表头或使用换行。
151
+ ```latex
152
+ % 修改前
153
+ \textbf{Mean Average Precision at IoU 0.5}
154
+ % 修改后
155
+ \textbf{mAP@0.5}
156
+ ```
157
+
158
+ 4. **调整字号(谨慎使用)**
159
+ 在表格环境内使用 `\small` 或 `\footnotesize`,但需确保与全篇表格风格一致。
160
+ ```latex
161
+ \begin{table}
162
+ \small
163
+ \begin{tabular}{...}
164
+ ...
165
+ \end{tabular}
166
+ \end{table}
167
+ ```
168
+
169
+ 5. **旋转表格**
170
+ 对于列数过多的宽表,使用 `\rotatebox` 或 `sidewaystable` 环境。
171
+ ```latex
172
+ \usepackage{rotating}
173
+ ...
174
+ \begin{sidewaystable}
175
+ ...
176
+ \end{sidewaystable}
177
+ ```
178
+
179
+ ---
180
+
181
+ ### D2:长公式未断行
182
+
183
+ **问题特征**:
184
+ - 视觉:公式长度接近或超过栏宽,未在运算符处断行
185
+ - 日志:可能伴随 `Overfull \hbox` 在公式环境
186
+
187
+ **修复策略(按优先级)**:
188
+
189
+ 1. **替换为多行公式环境**
190
+ - 单行公式 → `multline`:首行左对齐,末行右对齐,中间行居中。
191
+ - 多行对齐公式 → `align` 或 `aligned`:在等号或运算符处对齐。
192
+ ```latex
193
+ % 修改前(equation 环境)
194
+ \begin{equation}
195
+ f(x) = a_1 x^1 + a_2 x^2 + a_3 x^3 + a_4 x^4 + a_5 x^5 + a_6 x^6
196
+ \end{equation}
197
+
198
+ % 修改后(multline 环境)
199
+ \begin{multline}
200
+ f(x) = a_1 x^1 + a_2 x^2 + a_3 x^3 \\
201
+ + a_4 x^4 + a_5 x^5 + a_6 x^6
202
+ \end{multline}
203
+
204
+ % 或 align 环境(在等号处对齐)
205
+ \begin{align}
206
+ f(x) &= a_1 x^1 + a_2 x^2 + a_3 x^3 \nonumber \\
207
+ &\quad + a_4 x^4 + a_5 x^5 + a_6 x^6
208
+ \end{align}
209
+ ```
210
+
211
+ 2. **使用 `split` 环境嵌套在 `equation` 中**
212
+ 保留单个公式编号,但内部换行。
213
+ ```latex
214
+ \begin{equation}
215
+ \begin{split}
216
+ f(x) &= a_1 x^1 + a_2 x^2 + a_3 x^3 \\
217
+ &\quad + a_4 x^4 + a_5 x^5 + a_6 x^6
218
+ \end{split}
219
+ \end{equation}
220
+ ```
221
+
222
+ 3. **引入中间变量简化表达式**
223
+ 若公式过长且无明显断点,可拆分为多个子公式。
224
+ ```latex
225
+ % 修改前
226
+ P(y|x) = \frac{\exp(\sum_i w_i f_i(x,y))}{\sum_{y'}\exp(\sum_i w_i f_i(x,y'))}
227
+
228
+ % 修改后
229
+ Let $S(x,y) = \sum_i w_i f_i(x,y)$, then
230
+ \begin{equation}
231
+ P(y|x) = \frac{\exp(S(x,y))}{\sum_{y'}\exp(S(x,y'))}
232
+ \end{equation}
233
+ ```
234
+
235
+ ---
236
+
237
+ ### D3:URL/长标识符溢出
238
+
239
+ **问题特征**:
240
+ - 视觉:参考文献中的 URL 或 DOI 伸出右边界
241
+ - 日志:`Overfull \hbox` 在参考文献区域
242
+
243
+ **修复策略(按优先级)**:
244
+
245
+ 1. **使用 `\url` 命令**
246
+ `\url` 命令(由 `hyperref` 或 `url` 宏包提供)能自动在合适位置断行。
247
+ ```latex
248
+ % 修改前
249
+ https://github.com/very/long/url/that/overflows/the/margin
250
+ % 修改后
251
+ \url{https://github.com/very/long/url/that/overflows/the/margin}
252
+ ```
253
+
254
+ 2. **启用参考文献断行**
255
+ 在导言区添加:
256
+ ```latex
257
+ \usepackage{url}
258
+ \def\UrlBreaks{\do\/\do-} % 允许在 / 和 - 处断行
259
+ ```
260
+ 或对于 `biblatex`:
261
+ ```latex
262
+ \usepackage[backend=biber, url=true]{biblatex}
263
+ \setcounter{biburlnumpenalty}{100}
264
+ \setcounter{biburlucpenalty}{100}
265
+ \setcounter{biburllcpenalty}{100}
266
+ ```
267
+
268
+ 3. **手动添加断行点**
269
+ 在 URL 中允许断行处插入 `\linebreak[0]` 或使用 `\path` 命令。
270
+ ```latex
271
+ \path{https://github.com/very/long/url/\linebreak[0]that/overflows}
272
+ ```
273
+
274
+ ---
275
+
276
+ ## 修复验证
277
+
278
+ 每执行一项修复后,必须:
279
+
280
+ 1. 通知 `orchestrator-agent` 重新编译。
281
+ 2. 检查编译日志中对应行的 `Overfull \hbox` 是否消除或溢出量显著减少。
282
+ 3. 若问题持续存在,尝试下一优先级策略。
283
+ 4. 若所有策略均无效,标记为 `partial` 或 `failed`,并在报告中说明原因(如“公式语义复杂,无法自动断行,建议人工调整”)。
284
+
285
+ ---
286
+
287
+ ## 注意事项
288
+
289
+ - **表格修复后需检查视觉一致性**:改用 `tabularx` 后,确保全篇表格风格仍统一(参见 `consistency-polisher` 技能)。
290
+ - **公式断行需保持数学语义正确**:不要在括号或函数名中间断行。
291
+ - **URL 修复需保留超链接功能**:使用 `\url` 时自动包含超链接(若加载 `hyperref`)。
292
+ - **避免全局字号修改**:表格内的字号调整应局部化,并在同一文档中保持一致。
293
+
294
+ ---
295
+
296
+ ## 与其它技能的交互
297
+
298
+ - 若表格溢出修复后仍需调整列宽均衡,可联动 `consistency-polisher` 技能。
299
+ - 若段落溢出需语义微调,转交 `semantic-polish-agent` 处理。
300
+ - 修复结果最终由 `quality-gatekeeper-agent` 验收。
301
+
302
+ ---
303
+
304
+ **Overflow Repair Skill 就绪。** 等待 `code-surgeon-agent` 调用,执行溢出类修复任务。
@@ -0,0 +1,307 @@
1
+ # Space Utilization Fixer Skill
2
+
3
+ ## 概述
4
+
5
+ 本技能专门处理 **Category A:空间利用缺陷**,包括:
6
+
7
+ - **A1**:孤行/寡行(Widow/Orphan Lines)
8
+ - **A2**:末页大面积留白(Excessive Trailing Whitespace)
9
+ - **A3**:页数预算违反(Page Budget Violation)
10
+ - **A4**:双栏末页左右栏高度不齐(Unbalanced Column Heights)
11
+
12
+ 该技能由 `code-surgeon-agent` 或 `semantic-polish-agent` 调用,通过对段落级排版控制、浮动体调度和最小语义改写的组合运用,优化页面空间分配,使文档达到专业级的视觉均衡。
13
+
14
+ 空间利用问题的修复常常需要多轮迭代,因为局部调整会影响全局分页。因此,每次修改后必须重新编译并审查页图。
15
+
16
+ ---
17
+
18
+ ## 适用场景
19
+
20
+ | 缺陷 ID | 描述 | 优先级 | 是否允许语义修改 |
21
+ |---------|------|--------|-----------------|
22
+ | A1 | 孤行/寡行 | High | 是(最后手段) |
23
+ | A2 | 末页大面积留白 | High | 是(最后手段) |
24
+ | A3 | 页数预算违反 | Critical | 是(最后手段) |
25
+ | A4 | 双栏末页左右栏高度不齐 | Medium | 否 |
26
+
27
+ ---
28
+
29
+ ## 输入规范
30
+
31
+ | 输入项 | 来源 | 说明 |
32
+ |--------|------|------|
33
+ | 主 `.tex` 文件路径 | 项目上下文 | 需修改的源文件 |
34
+ | 排版侦探报告 | `layout-detective-agent` 输出 | 包含 A 类缺陷的页码和描述 |
35
+ | 目标页数(若适用) | 用户约束 | A3 修复必须提供 |
36
+ | 模板类型 | `templates.yaml` 或上下文 | 单栏/双栏 |
37
+
38
+ ---
39
+
40
+ ## 输出规范
41
+
42
+ ```json
43
+ {
44
+ "skill": "space-util-fixer",
45
+ "status": "success | partial | failed",
46
+ "modified_files": ["main.tex"],
47
+ "changes": [
48
+ {
49
+ "defect_id": "A1",
50
+ "object": "第4页顶部孤行",
51
+ "action": "在段落前添加 \\looseness=-1",
52
+ "before_snippet": "The proposed method achieves...",
53
+ "after_snippet": "{\\looseness=-1 The proposed method achieves...}"
54
+ }
55
+ ],
56
+ "unresolved": []
57
+ }
58
+ ```
59
+
60
+ ---
61
+
62
+ ## 修复策略
63
+
64
+ ### 通用原则
65
+
66
+ 1. **先排版,后语义**:优先使用 LaTeX 原生的排版控制命令,仅在无效时才考虑语义级改写。
67
+ 2. **局部修改,全局验证**:改动一段可能影响后续多页分页,必须完整编译并检查全文档。
68
+ 3. **避免硬性分页**:禁止滥用 `\newpage` 或 `\clearpage` 来“凑页数”,这会破坏文档结构的自然性。
69
+
70
+ ---
71
+
72
+ ### A1:孤行/寡行修复
73
+
74
+ **问题特征**:
75
+ - 段落最后一行单独出现在下一页顶部(孤行)。
76
+ - 段落第一行单独留在上一页底部(寡行)。
77
+ - 段落末尾仅含 1-3 个单词的短行(段尾小尾巴)。
78
+
79
+ **修复策略(严格按优先级顺序尝试)**:
80
+
81
+ #### 策略 1:段落级收紧 (`\looseness=-1`)
82
+
83
+ 通过在段落前设置 `\looseness=-1`,指示 TeX 引擎尝试将段落收缩一行,从而消除孤行或小尾巴。
84
+
85
+ ```latex
86
+ % 修改前
87
+ The proposed method achieves state-of-the-art performance on several
88
+ benchmarks, demonstrating the effectiveness of our approach.
89
+
90
+ % 修改后
91
+ {\looseness=-1 The proposed method achieves state-of-the-art performance on several
92
+ benchmarks, demonstrating the effectiveness of our approach.}
93
+ ```
94
+
95
+ *注意*:
96
+ - 必须将整个段落用花括号 `{ }` 括起,以限制 `\looseness` 的作用范围。
97
+ - 若段落本身很短,收缩可能导致过紧的行距,需在页图上确认可接受。
98
+
99
+ #### 策略 2:段落级扩张 (`\looseness=1`)
100
+
101
+ 若段落太紧,可尝试扩张一行,使段末行变长。
102
+
103
+ ```latex
104
+ {\looseness=1 This paragraph will be typeset with one more line...}
105
+ ```
106
+
107
+ #### 策略 3:调整段落间胶水 (`\emergencystretch`)
108
+
109
+ 为特定段落增加紧急拉伸量,允许行间略微拉伸以调整断行。
110
+
111
+ ```latex
112
+ {\emergencystretch=1em This paragraph content...}
113
+ ```
114
+
115
+ #### 策略 4:微调上下文句长分布(需 `semantic-polish-agent`)
116
+
117
+ 若排版控制无效,则进行最小语义改写:
118
+ - 在段落中增删 3-8 个单词(如将 `in order to` 改为 `to`,或将 `demonstrate` 改为 `show`)。
119
+ - 调整从句结构,但不改变学术原意。
120
+
121
+ ```latex
122
+ % 修改前
123
+ The proposed method achieves state-of-the-art performance on several
124
+ benchmarks, demonstrating the effectiveness of our approach.
125
+
126
+ % 修改后
127
+ The proposed method achieves state-of-the-art results on several
128
+ benchmarks, showing the effectiveness of our approach.
129
+ ```
130
+
131
+ *语义改写必须由 `semantic-polish-agent` 执行,本技能仅提出请求。*
132
+
133
+ #### 策略 5:全局调整 widow/orphan 惩罚
134
+
135
+ 在导言区增加以下设置(通常模板已包含,可作为兜底):
136
+
137
+ ```latex
138
+ \widowpenalty=10000
139
+ \clubpenalty=10000
140
+ \displaywidowpenalty=10000
141
+ ```
142
+
143
+ *注意*:此设置影响全局,需谨慎。若模板已设置,则无需重复。
144
+
145
+ ---
146
+
147
+ ### A2:末页大面积留白修复
148
+
149
+ **问题特征**:
150
+ - 最后一页(参考文献前或后)空白区域超过页面高度的 20%。
151
+
152
+ **修复策略(按优先级)**:
153
+
154
+ #### 策略 1:前移浮动体
155
+
156
+ 检查倒数第二、第三页是否有可前移的图表。调整其位置参数 `[htbp]`,使其占据末页空白区域。
157
+
158
+ ```latex
159
+ % 将原本放在倒数第二页的图强制前移
160
+ \begin{figure}[t] → \begin{figure}[ht]
161
+ ```
162
+
163
+ #### 策略 2:调整局部垂直间距
164
+
165
+ 在不影响整体美观的前提下,微调末页前的某些垂直间距(如 `\vspace`、章节间距)。
166
+
167
+ ```latex
168
+ % 轻微缩小最后一节前的间距
169
+ \vspace{-0.5em}
170
+ \section{Conclusion}
171
+ ```
172
+
173
+ *注意*:不要制造新的视觉不协调。
174
+
175
+ #### 策略 3:适当扩写结论或讨论部分(需语义润色)
176
+
177
+ 在结论、讨论或分析段落中增加有实质内容的 2-4 行文本(约 30-60 词),以自然填充空白。
178
+
179
+ *此操作必须由 `semantic-polish-agent` 执行。*
180
+
181
+ #### 策略 4:增加附录或致谢(最后手段)
182
+
183
+ 若用户同意,可将部分非核心内容(如额外消融实验)从正文移至附录,或在末页后增加致谢部分。
184
+
185
+ ---
186
+
187
+ ### A3:页数预算修复
188
+
189
+ **问题特征**:
190
+ - 实际总页数与目标页数不符(如会议要求 9 页,实际 8 页或 10 页)。
191
+
192
+ **修复策略**:
193
+
194
+ 本缺陷修复需要系统性操作,通常结合多种手段。
195
+
196
+ #### 情况 1:超页(实际页数 > 目标页数)
197
+
198
+ **优先级从高到低**:
199
+
200
+ 1. **压缩浮动体**
201
+ - 缩小超大图片(`width=0.95\linewidth` 代替 `\linewidth`)。
202
+ - 将跨页长表格改为 `longtable`(可跨页,避免独占一页)。
203
+ - 调整浮动体位置,使其更紧凑地填充页面。
204
+
205
+ 2. **缩减垂直间距**
206
+ - 使用 `\vspace{-0.2cm}` 微调节标题、图表与正文的间距。
207
+ - 检查是否有冗余的 `\newline` 或空行。
208
+
209
+ 3. **精炼文字(语义级)**
210
+ 在非核心段落(Related Work、Introduction 末尾)进行精简:
211
+ - 删除冗余修饰词。
212
+ - 合并短句。
213
+ - 将被动语态改为主动语态(通常更短)。
214
+
215
+ 4. **压缩参考文献**
216
+ 若参考文献过多,使用 `\bibliographystyle{abbrv}` 或类似缩写样式,或使用 `biblatex` 的压缩选项。
217
+
218
+ 5. **缩小页边距(谨慎)**
219
+ 若模板允许,使用 `\usepackage[margin=...]{geometry}` 微调边距。*必须在模板允许范围内。*
220
+
221
+ #### 情况 2:缺页(实际页数 < 目标页数)
222
+
223
+ **优先级从高到低**:
224
+
225
+ 1. **检查浮动体堆积**
226
+ 是否因 `\FloatBarrier` 或 `[H]` 导致页面空白?若是,先按 B 类缺陷修复。
227
+
228
+ 2. **适当扩写结论、讨论或分析段落**
229
+ 增加 5-10 行有实质内容的分析,例如:
230
+ - 深入解释某个实验结果的含义。
231
+ - 补充一个简短的局限性讨论。
232
+ - 强化与相关工作的对比。
233
+
234
+ 3. **增加附录或补充材料**
235
+ 若会议允许附录且不计入页数限制,可将部分内容移至附录,使正文恰好满页。
236
+
237
+ 4. **微调图表尺寸**
238
+ 将部分图片略微放大(`width=1.0\linewidth` 代替 `0.95\linewidth`),使其占据更多空间但不溢出。
239
+
240
+ 5. **增加分页点**
241
+ 在合适位置(如章节末尾)添加 `\newpage` 迫使内容分页,但必须确保不产生孤页。
242
+
243
+ ---
244
+
245
+ ### A4:双栏末页左右栏高度不齐
246
+
247
+ **问题特征**:
248
+ - 双栏模板最后一页,左栏和右栏底部高度差超过 2 行。
249
+
250
+ **修复策略**:
251
+
252
+ #### 策略 1:使用 `\balance` 或 `flushend` 宏包
253
+
254
+ 在导言区加载 `flushend` 宏包,自动平衡末页两栏高度。
255
+
256
+ ```latex
257
+ \usepackage{flushend}
258
+ ```
259
+
260
+ *注意*:`flushend` 与某些宏包(如 `multicol`)可能冲突,需在特定模板下测试。
261
+
262
+ #### 策略 2:手动平衡
263
+
264
+ 若自动平衡无效,在最后一节结束前插入 `\balance` 命令(需 `balance` 宏包)。
265
+
266
+ ```latex
267
+ \usepackage{balance}
268
+ ...
269
+ \section{Conclusion}
270
+ ...
271
+ \balance
272
+ \end{document}
273
+ ```
274
+
275
+ #### 策略 3:微调最后一段的断行
276
+
277
+ 对末页最后一段使用 `\looseness=-1` 或 `\looseness=1`,改变其行数,从而影响两栏高度。
278
+
279
+ #### 策略 4:调整浮动体位置
280
+
281
+ 若末页有浮动体,尝试将其移至前一页或强制放在当前页底部,以改变栏内内容分布。
282
+
283
+ ---
284
+
285
+ ## 修复验证
286
+
287
+ 每完成一项修复后:
288
+
289
+ 1. **重新编译至少两次**(确保交叉引用稳定)。
290
+ 2. **渲染页图**,对照缺陷逐项检查:
291
+ - A1:孤行/寡行是否消失?
292
+ - A2:末页空白比例是否降至 20% 以下?
293
+ - A3:总页数是否达到目标?
294
+ - A4:双栏末页高度差是否 ≤ 2 行?
295
+ 3. 若未通过,回滚并尝试下一策略。
296
+
297
+ ---
298
+
299
+ ## 与其它技能的协作
300
+
301
+ - **浮动体修复 (float-optimizer)**:A2 和 A3 常需配合浮动体调整。
302
+ - **语义润色 (writing-polish)**:当排版手段用尽时,请求语义改写。
303
+ - **一致性检查 (consistency-polisher)**:修改字号、间距后需确保全局一致。
304
+
305
+ ---
306
+
307
+ **Space Utilization Fixer Skill 就绪。** 等待调用,优化页面空间分配。