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,337 @@
1
+ # Consistency Polisher Skill
2
+
3
+ ## 概述
4
+
5
+ 本技能专门处理 **Category C:排版一致性缺陷**,包括:
6
+
7
+ - **C1**:表格字号不统一(`\resizebox` 滥用导致字号参差)
8
+ - **C2**:图片分辨率/风格不一致
9
+ - **C3**:Caption 格式不统一
10
+
11
+ 该技能由 `code-surgeon-agent` 调用,通过对表格字号、图片尺寸策略、标题格式的统一化处理,消除全篇排版风格割裂,使论文呈现出专业、一致的视觉形象。
12
+
13
+ 一致性缺陷通常不致命,但严重影响审稿人对论文专业度的第一印象。本技能的目标是建立并强制执行全篇统一的排版规范。
14
+
15
+ ---
16
+
17
+ ## 适用场景
18
+
19
+ | 缺陷 ID | 描述 | 优先级 | 是否自动修复 |
20
+ |---------|------|--------|-------------|
21
+ | C1 | 表格字号不统一 | Medium | 是 |
22
+ | C2 | 图片分辨率/风格不一致 | Low | 否(仅诊断并建议) |
23
+ | C3 | Caption 格式不统一 | Medium | 是 |
24
+
25
+ ---
26
+
27
+ ## 输入规范
28
+
29
+ | 输入项 | 来源 | 说明 |
30
+ |--------|------|------|
31
+ | 主 `.tex` 文件路径 | 项目上下文 | 需修改的源文件 |
32
+ | 排版侦探报告 | `layout-detective-agent` 输出 | 包含 C 类缺陷的具体描述 |
33
+ | 模板信息 | `templates.yaml` 或上下文 | 会议/期刊模板的字号、栏宽等默认参数 |
34
+
35
+ ---
36
+
37
+ ## 输出规范
38
+
39
+ ```json
40
+ {
41
+ "skill": "consistency-polisher",
42
+ "status": "success | partial | failed",
43
+ "modified_files": ["main.tex", "tables/experiments.tex"],
44
+ "changes": [
45
+ {
46
+ "defect_id": "C1",
47
+ "object": "Table 2",
48
+ "action": "移除 \\resizebox,改用 tabularx 并统一使用 \\small",
49
+ "before_snippet": "\\resizebox{\\linewidth}{!}{\\begin{tabular}{...}",
50
+ "after_snippet": "{\\small\\begin{tabularx}{\\linewidth}{...}}"
51
+ }
52
+ ],
53
+ "suggestions": [
54
+ {
55
+ "defect_id": "C2",
56
+ "object": "Figure 5",
57
+ "message": "图片分辨率过低(72 DPI),建议替换为至少 300 DPI 的矢量图或高分辨率位图"
58
+ }
59
+ ],
60
+ "unresolved": []
61
+ }
62
+ ```
63
+
64
+ ---
65
+
66
+ ## 修复策略
67
+
68
+ ### 通用原则
69
+
70
+ 1. **建立风格锚点**:从全篇中自动识别或由用户指定一个“最佳实践”表格/图片/Caption 作为模板,其余向它看齐。
71
+ 2. **最小破坏**:修改仅限于样式层面,不改变表格内容、图片信息或标题文本。
72
+ 3. **模板优先**:若会议/期刊模板提供了官方样式文件,优先遵循模板预设,而非自定义样式。
73
+
74
+ ---
75
+
76
+ ### C1:表格字号不统一
77
+
78
+ **问题特征**:
79
+ - 不同表格使用了差异明显的字号(如一个 `\small`,另一个 `\tiny`)。
80
+ - 使用 `\resizebox{\linewidth}{!}{...}` 整体缩放表格,导致文字被非线性缩放而变形,且与其他表格字号不一致。
81
+
82
+ **修复策略(按优先级)**:
83
+
84
+ #### 策略 1:移除 `\resizebox`,改用 `tabularx` 自适应宽度
85
+
86
+ `\resizebox` 是表格一致性的头号杀手,必须无条件移除。
87
+
88
+ ```latex
89
+ % 修改前
90
+ \begin{table}
91
+ \centering
92
+ \resizebox{\linewidth}{!}{
93
+ \begin{tabular}{|l|c|c|c|}
94
+ \hline
95
+ Method & Metric1 & Metric2 & Metric3 \\
96
+ \hline
97
+ Ours & 95.2 & 87.3 & 78.1 \\
98
+ \hline
99
+ \end{tabular}
100
+ }
101
+ \caption{Results}
102
+ \end{table}
103
+
104
+ % 修改后
105
+ \begin{table}
106
+ \centering
107
+ \small % 统一字号
108
+ \begin{tabularx}{\linewidth}{|l|X|X|X|}
109
+ \hline
110
+ Method & Metric1 & Metric2 & Metric3 \\
111
+ \hline
112
+ Ours & 95.2 & 87.3 & 78.1 \\
113
+ \hline
114
+ \end{tabularx}
115
+ \caption{Results}
116
+ \end{table}
117
+ ```
118
+
119
+ *注意*:确保导言区已加载 `tabularx` 宏包。若未加载,需添加 `\usepackage{tabularx}`。
120
+
121
+ #### 策略 2:统一全篇表格字号
122
+
123
+ 检查全篇表格的字号设置,确定一个“锚点字号”(通常是模板默认的正文字号,或 `\small`),将所有表格统一为该字号。
124
+
125
+ **识别当前字号**:
126
+ - 搜索 `\begin{table}` 后的 `\small`、`\footnotesize`、`\scriptsize`、`\tiny` 等命令。
127
+ - 搜索 `\resizebox` 并评估其实际视觉字号。
128
+
129
+ **统一方法**:
130
+ - 若表格无字号声明,且模板默认表格字号与正文相同,则不加字号命令(让模板决定)。
131
+ - 若需缩小,优先使用 `\small`;若仍超宽,考虑改为 `tabularx` 而非进一步缩小字号。
132
+ - 绝对禁止使用 `\tiny` 或 `\scriptsize`(不可阅读)。
133
+
134
+ ```latex
135
+ % 统一风格示例:在每个 table 环境内首行添加 \small
136
+ \begin{table}
137
+ \small
138
+ \centering
139
+ \begin{tabularx}{\linewidth}{...}
140
+ ...
141
+ \end{tabularx}
142
+ \end{table}
143
+ ```
144
+
145
+ #### 策略 3:检测并修复列宽失衡导致的字号误用
146
+
147
+ 有时作者使用超小字号是因为表格列太多、内容太宽。此时应优先重构列格式(如合并相似列、使用缩写表头、改为跨栏表),而非暴力缩小字号。
148
+
149
+ ```latex
150
+ % 修改前(滥用 \tiny)
151
+ \begin{table}
152
+ \tiny
153
+ \begin{tabular}{|l|c|c|c|c|c|c|c|c|}
154
+ ...
155
+ \end{tabular}
156
+ \end{table}
157
+
158
+ % 修改后(合并为关键列 + 缩写表头 + 跨栏宽表)
159
+ \begin{table*}
160
+ \small
161
+ \begin{tabularx}{\textwidth}{|l|X|X|X|}
162
+ \hline
163
+ \textbf{Method} & \textbf{Prec.} & \textbf{Rec.} & \textbf{F1} \\
164
+ \hline
165
+ ...
166
+ \end{tabularx}
167
+ \end{table*}
168
+ ```
169
+
170
+ ---
171
+
172
+ ### C2:图片分辨率/风格不一致
173
+
174
+ **问题特征**:
175
+ - 不同图片清晰度差异大(矢量图 vs 低分辨率截图)。
176
+ - 图片中的字体、配色、线条风格不统一。
177
+ - 同一论文中混用 `.pdf`、`.png`、`.jpg`,且质量参差。
178
+
179
+ **本技能的定位**:**仅诊断和建议,不自动修改图片内容**。
180
+
181
+ #### 诊断与建议生成
182
+
183
+ 1. **检查图片文件格式**:
184
+ - 推荐:`.pdf`(矢量图)、`.eps`(矢量图)。
185
+ - 可接受:高分辨率 `.png`(≥300 DPI)。
186
+ - 避免:低分辨率 `.jpg`、屏幕截图。
187
+
188
+ 2. **生成逐图建议**:
189
+
190
+ ```json
191
+ {
192
+ "defect_id": "C2",
193
+ "object": "Figure 5 (figures/ablation.png)",
194
+ "issue": "图片分辨率约 72 DPI,放大后锯齿明显",
195
+ "suggestion": "请使用原始矢量图导出为 PDF,或以至少 300 DPI 重新渲染位图"
196
+ }
197
+ ```
198
+
199
+ 3. **风格一致性建议**:
200
+ - 若检测到多张图来自不同工具(如 Matplotlib、Excel、draw.io),提示用户统一绘图工具和导出设置。
201
+ - 建议使用统一的配色方案(如 ColorBrewer)和字体(如 Times New Roman 或 Helvetica)。
202
+
203
+ #### 输出示例
204
+
205
+ ```json
206
+ "suggestions": [
207
+ {
208
+ "defect_id": "C2",
209
+ "object": "Figure 1, Figure 3, Figure 5",
210
+ "message": "三张图使用了三种不同的配色风格,建议统一使用会议模板推荐的配色方案。"
211
+ }
212
+ ]
213
+ ```
214
+
215
+ ---
216
+
217
+ ### C3:Caption 格式不统一
218
+
219
+ **问题特征**:
220
+ - 图表标题的字体不一致(有的加粗,有的未加粗)。
221
+ - 标题结尾标点不一致(有的有句号,有的无)。
222
+ - 表格标题位置不一致(有的在表格上方,有的在下方)。
223
+ - 标题与图表主体的间距不一致。
224
+
225
+ **修复策略**:
226
+
227
+ #### 策略 1:统一使用 `caption` 宏包配置
228
+
229
+ 在导言区加载 `caption` 宏包并设置全局样式,一次性统一全篇标题格式。
230
+
231
+ ```latex
232
+ \usepackage{caption}
233
+ \captionsetup{
234
+ font=small, % 字号
235
+ labelfont=bf, % 标签加粗("Figure 1:" 中的 "Figure 1" 部分)
236
+ textfont=it, % 标题文本斜体(可选)
237
+ labelsep=period, % 标签与文本分隔符:period = 句点,colon = 冒号
238
+ justification=raggedright, % 左对齐(或 justified 两端对齐)
239
+ singlelinecheck=false % 即使单行也应用设置
240
+ }
241
+ ```
242
+
243
+ *针对表格和图片的差异化设置*:
244
+
245
+ ```latex
246
+ % 表格标题默认在上方,图片在下方,无需额外设置,LaTeX 自动处理。
247
+ % 若需微调间距:
248
+ \captionsetup[table]{position=above, skip=6pt}
249
+ \captionsetup[figure]{position=below, skip=6pt}
250
+ ```
251
+
252
+ #### 策略 2:检查并修复手动设置的标题样式
253
+
254
+ 搜索 `.tex` 文件中的 `\caption` 命令,移除其前后的手动字体设置(如 `\textbf{\caption{...}}`),因为这些手动设置会覆盖全局配置。
255
+
256
+ ```latex
257
+ % 修改前
258
+ \caption{\textbf{This is a bold caption.}}
259
+
260
+ % 修改后(依赖全局 caption 设置)
261
+ \caption{This is a caption with unified style.}
262
+ ```
263
+
264
+ #### 策略 3:统一结尾标点
265
+
266
+ 检查所有 `\caption{}` 的内容,确保标点风格一致。推荐:
267
+ - 学术论文标题通常**不加句号**。
268
+ - 若标题包含完整句子,可保留句号,但全篇统一。
269
+
270
+ ```latex
271
+ % 统一移除标题末尾的句号
272
+ \caption{Results on the validation set.} → \caption{Results on the validation set}
273
+ ```
274
+
275
+ #### 策略 4:修复表格标题位置错误
276
+
277
+ LaTeX 中表格标题应放在 `\begin{tabular}` 之前,图片标题应放在 `\includegraphics` 之后。
278
+
279
+ ```latex
280
+ % 正确的表格标题位置
281
+ \begin{table}
282
+ \centering
283
+ \caption{Table caption here} % 在上方
284
+ \begin{tabular}{...}
285
+ ...
286
+ \end{tabular}
287
+ \end{table}
288
+
289
+ % 错误的表格标题位置(标题在表格下方)
290
+ \begin{table}
291
+ \centering
292
+ \begin{tabular}{...}
293
+ ...
294
+ \end{tabular}
295
+ \caption{This caption is misplaced.}
296
+ \end{table}
297
+ ```
298
+
299
+ 若发现位置错误,将 `\caption` 命令移动到正确位置。
300
+
301
+ ---
302
+
303
+ ## 全局一致性检查清单
304
+
305
+ 在修复 C 类缺陷时,应同时对全篇进行以下检查:
306
+
307
+ | 检查项 | 目标状态 | 修复方法 |
308
+ |--------|----------|----------|
309
+ | 所有表格是否使用相同字号? | 全篇统一(通常 `\small` 或模板默认) | 移除 `\resizebox`,添加统一的字号命令 |
310
+ | 所有图片是否使用 `\linewidth`? | 是(单栏)或 `\textwidth`(跨栏) | 替换固定宽度为相对宽度 |
311
+ | 所有 Caption 字体是否一致? | 是 | 使用 `caption` 宏包全局配置 |
312
+ | 表格标题是否都在表格上方? | 是 | 移动 `\caption` 命令 |
313
+ | 图片标题是否都在图片下方? | 是 | 移动 `\caption` 命令 |
314
+ | 标题结尾标点是否统一? | 全篇统一(推荐无句号) | 移除或添加标点 |
315
+ | 是否使用了 `booktabs` 绘制三线表? | 推荐 | 将 `\hline` 替换为 `\toprule`、`\midrule`、`\bottomrule` |
316
+
317
+ ---
318
+
319
+ ## 与其它技能的协作
320
+
321
+ - **表格修复 (overflow-repair)**:C1 的 `\resizebox` 移除常与 D1 的表格溢出修复联动,可合并处理。
322
+ - **浮动体优化 (float-optimizer)**:B2 的宽度适配与 C1 的表格字号统一通常同时进行。
323
+ - **模板迁移 (template-migrator)**:在跨模板迁移后,本技能确保新模板下的样式一致性。
324
+
325
+ ---
326
+
327
+ ## 修复验证
328
+
329
+ 每完成一项修复后:
330
+
331
+ 1. **重新编译**。
332
+ 2. **渲染页图**,逐页对比修改前后的表格字号、标题格式。
333
+ 3. 检查是否引入新的不一致(如某个表格因移除 `\resizebox` 而超宽),若有,转交 `overflow-repair` 处理。
334
+
335
+ ---
336
+
337
+ **Consistency Polisher Skill 就绪。** 等待调用,消除排版风格割裂,交付视觉统一的作品。
@@ -0,0 +1,284 @@
1
+ # Float Optimizer Skill
2
+
3
+ ## 概述
4
+
5
+ 本技能专门处理 **Category B:浮动体缺陷**,包括:
6
+
7
+ - **B1**:浮动体远离首次引用(Float-Reference Distance)
8
+ - **B2**:浮动体大小不适配栏宽(Float Width Mismatch)
9
+ - **B3**:连续多个浮动体堆叠无正文间隔(Float Clustering)
10
+ - **B4**:浮动体跨页分裂(Float Page Orphaning)
11
+
12
+ 该技能由 `code-surgeon-agent` 调用,通过对浮动体位置参数、尺寸设置和周围正文结构的精确调整,实现图表与正文的和谐共处。浮动体优化是视觉排版中最具挑战性的环节之一,必须结合页图反馈迭代验证。
13
+
14
+ ---
15
+
16
+ ## 适用场景
17
+
18
+ 当 `layout-detective-agent` 报告中出现以下缺陷 ID 时,路由至本技能:
19
+
20
+ | 缺陷 ID | 描述 | 优先级 |
21
+ |---------|------|--------|
22
+ | B1 | 浮动体远离首次引用 | High |
23
+ | B2 | 浮动体大小不适配栏宽 | High |
24
+ | B3 | 浮动体连续堆叠 | Medium |
25
+ | B4 | 浮动体跨页分裂 | Medium |
26
+
27
+ ---
28
+
29
+ ## 输入规范
30
+
31
+ | 输入项 | 来源 | 说明 |
32
+ |--------|------|------|
33
+ | 主 `.tex` 文件路径 | 项目上下文 | 需修改的源文件 |
34
+ | 排版侦探报告 | `layout-detective-agent` 输出 | 包含缺陷对象(图表标签)、页码、描述 |
35
+ | 当前 PDF 页图 | `visual-inspector` 输出 | 用于验证修复后视觉效果 |
36
+ | 模板类型 | 用户上下文或 `templates.yaml` | 单栏/双栏,影响浮动体宽度策略 |
37
+
38
+ ---
39
+
40
+ ## 输出规范
41
+
42
+ 修改完成后,必须返回以下信息:
43
+
44
+ ```json
45
+ {
46
+ "skill": "float-optimizer",
47
+ "status": "success | partial | failed",
48
+ "modified_files": ["main.tex"],
49
+ "changes": [
50
+ {
51
+ "defect_id": "B1",
52
+ "object": "Figure 3",
53
+ "action": "调整浮动体位置参数为 [htbp]",
54
+ "before": "\\begin{figure}[t]",
55
+ "after": "\\begin{figure}[htbp]"
56
+ },
57
+ {
58
+ "defect_id": "B2",
59
+ "object": "Table 1",
60
+ "action": "将 tabular 宽度设为 \\linewidth",
61
+ "before": "\\begin{tabular}{|l|c|c|}",
62
+ "after": "\\begin{tabularx}{\\linewidth}{|l|X|X|}"
63
+ }
64
+ ],
65
+ "unresolved": []
66
+ }
67
+ ```
68
+
69
+ ---
70
+
71
+ ## 修复策略
72
+
73
+ ### 通用原则
74
+
75
+ 1. **浮动体是“浮动”的**:LaTeX 的浮动体放置算法具有不确定性,同一份源码在不同编译中可能产生不同输出。因此,修复后必须多次编译以验证稳定性。
76
+ 2. **最小侵入**:优先调整位置参数 `[htbp]`,其次调整尺寸,最后才考虑移动浮动体在源码中的位置。
77
+ 3. **视觉验证必须**:浮动体修复的效果必须在页图上肉眼确认,不能仅凭日志判断。
78
+
79
+ ---
80
+
81
+ ### B1:浮动体远离首次引用
82
+
83
+ **问题特征**:
84
+ - 图表出现在距离其首次引用页码 ≥ 2 页的位置。
85
+ - 读者需翻页才能找到对应图表,打断阅读流。
86
+
87
+ **修复策略(按优先级)**:
88
+
89
+ 1. **调整位置参数**
90
+ 将浮动体环境的参数从限制性强的 `[t]` 或 `[b]` 改为更宽松的 `[htbp]`,给 LaTeX 更多放置自由度。
91
+ ```latex
92
+ % 修改前
93
+ \begin{figure}[t]
94
+ % 修改后
95
+ \begin{figure}[htbp]
96
+ ```
97
+ *参数含义*:`h` = here(尽可能在此处),`t` = top(页顶),`b` = bottom(页底),`p` = float page(独立浮动页)。
98
+
99
+ 2. **使用 `\FloatBarrier` 强制放置**
100
+ 在引用点之后、期望图表出现的位置之前插入 `\FloatBarrier`(需 `placeins` 宏包),阻止浮动体越过此边界。
101
+ ```latex
102
+ \usepackage{placeins}
103
+ ...
104
+ As shown in Figure~\ref{fig:result}, ...
105
+ \FloatBarrier % 确保图不会漂到更后
106
+ ```
107
+
108
+ 3. **移动浮动体源码位置**
109
+ 将整个 `figure` 或 `table` 环境在 `.tex` 源码中向上移动,使其更接近首次引用点。
110
+ *注意*:移动源码可能改变上下文,需确保不影响前后文语义。
111
+
112
+ 4. **拆分大型浮动体**
113
+ 若一个浮动体包含多个子图且过大,考虑拆分为两个独立的浮动体,或将其部分内容移至附录。
114
+
115
+ 5. **调整前后正文数量**
116
+ 在浮动体前后增删少量文本(由 `semantic-polish-agent` 协助),改变分页位置,使浮动体自然落在引用附近。
117
+
118
+ ---
119
+
120
+ ### B2:浮动体大小不适配栏宽
121
+
122
+ **问题特征**:
123
+ - 过窄:图表宽度明显小于栏宽,两侧留白过多。
124
+ - 超宽:图表超出栏宽,内容被截断或溢出到页边。
125
+
126
+ **修复策略(按优先级)**:
127
+
128
+ 1. **图片宽度标准化**
129
+ 将所有图片的 `\includegraphics` 宽度设为 `\linewidth`(单栏)或 `\textwidth`(跨栏)。
130
+ ```latex
131
+ % 修改前
132
+ \includegraphics[width=0.6\textwidth]{figure.pdf}
133
+ % 修改后
134
+ \includegraphics[width=\linewidth]{figure.pdf}
135
+ ```
136
+
137
+ 2. **区分单栏与跨栏图表**
138
+ - 单栏模板:所有图表默认使用 `\linewidth`。
139
+ - 双栏模板:单栏图表用 `\columnwidth` 或 `\linewidth`;跨栏图表使用 `figure*` / `table*` 环境,宽度用 `\textwidth`。
140
+ ```latex
141
+ % 双栏中的跨栏图
142
+ \begin{figure*}
143
+ \includegraphics[width=\textwidth]{wide_figure.pdf}
144
+ \end{figure*}
145
+ ```
146
+
147
+ 3. **表格宽度自适应**
148
+ 使用 `tabularx` 将表格宽度设为 `\linewidth`,并由 `X` 列自动分配多余空间。
149
+ ```latex
150
+ \begin{tabularx}{\linewidth}{|l|X|X|}
151
+ ```
152
+
153
+ 4. **旋转超宽表格**
154
+ 对于列数过多的宽表,使用 `sidewaystable` 环境旋转 90 度展示。
155
+ ```latex
156
+ \usepackage{rotating}
157
+ ...
158
+ \begin{sidewaystable}
159
+ \centering
160
+ \begin{tabular}{...}
161
+ ...
162
+ \end{tabular}
163
+ \end{sidewaystable}
164
+ ```
165
+
166
+ 5. **缩小超大图片**
167
+ 若原图本身尺寸过大,可使用 `width=\linewidth` 自动缩放;若仍需保持比例,可同时设置 `height` 和 `keepaspectratio`。
168
+ ```latex
169
+ \includegraphics[width=\linewidth,height=0.3\textheight,keepaspectratio]{figure.pdf}
170
+ ```
171
+
172
+ ---
173
+
174
+ ### B3:浮动体连续堆叠
175
+
176
+ **问题特征**:
177
+ - 同一页或连续两页出现 ≥ 3 个图表,且中间正文极少(≤ 2 行)。
178
+
179
+ **修复策略(按优先级)**:
180
+
181
+ 1. **分散浮动体位置参数**
182
+ 为不同浮动体分配不同的位置偏好,如第一个用 `[t]`,第二个用 `[b]`,第三个用 `[p]`,避免它们挤在同一页。
183
+ ```latex
184
+ \begin{figure}[t] ... \end{figure}
185
+ \begin{table}[b] ... \end{table}
186
+ \begin{figure}[p] ... \end{figure}
187
+ ```
188
+
189
+ 2. **在浮动体之间插入正文**
190
+ 若浮动体在源码中连续出现,可在其间补充或前移若干行正文(需确保语义连贯)。
191
+ ```latex
192
+ \begin{figure} ... \end{figure}
193
+ % 在此处插入一段正文,哪怕只有 2-3 行
194
+ The above results demonstrate...
195
+ \begin{table} ... \end{table}
196
+ ```
197
+
198
+ 3. **使用 `\FloatBarrier` 控制浮动页**
199
+ 在适当位置插入 `\FloatBarrier`,迫使之前的浮动体在下一页之前全部输出,避免后续浮动体继续堆积。
200
+
201
+ 4. **将部分图表移至附录**
202
+ 若正文中图表过多,可将非核心的图表或消融实验移至附录,并在正文中引用。
203
+
204
+ ---
205
+
206
+ ### B4:浮动体跨页分裂
207
+
208
+ **问题特征**:
209
+ - 一个长表格跨页断开,且第二页未重复表头。
210
+ - 一个图片(含子图)被分页符切开。
211
+
212
+ **修复策略(按优先级)**:
213
+
214
+ 1. **长表格使用 `longtable` 环境**
215
+ 将普通 `table` + `tabular` 替换为 `longtable`,支持跨页并自动重复表头。
216
+ ```latex
217
+ \usepackage{longtable}
218
+ ...
219
+ \begin{longtable}{|l|c|c|}
220
+ \caption{Long table caption} \label{tab:long} \\
221
+ \hline
222
+ \textbf{Header1} & \textbf{Header2} & \textbf{Header3} \\
223
+ \hline
224
+ \endfirsthead
225
+ \hline
226
+ \textbf{Header1} & \textbf{Header2} & \textbf{Header3} \\
227
+ \hline
228
+ \endhead
229
+ % 表格内容
230
+ \end{longtable}
231
+ ```
232
+
233
+ 2. **强制表格不跨页**
234
+ 若表格并非特别长,可用 `\begin{table}[!h]` 配合 `\centering` 强制放在一页内。
235
+ ```latex
236
+ \begin{table}[!h]
237
+ \centering
238
+ \begin{tabular}{...}
239
+ ...
240
+ \end{tabular}
241
+ \end{table}
242
+ ```
243
+
244
+ 3. **拆分过大的图片组**
245
+ 若一个 `figure` 包含多个子图且总高度过大,拆分为两个独立的 `figure` 环境。
246
+
247
+ ---
248
+
249
+ ## 双栏模板的特殊处理
250
+
251
+ 双栏布局下的浮动体优化更加复杂,需额外注意:
252
+
253
+ | 场景 | 策略 |
254
+ |------|------|
255
+ | 单栏图过窄 | 判断图片宽高比:若宽度 > 高度 * 1.5,考虑改为跨栏 `figure*` |
256
+ | 跨栏图位置不受控 | 跨栏图只能放在页顶或单独浮动页,使用 `[t]` 或 `[p]` |
257
+ | 跨栏图导致正文留白 | 若跨栏图后下一页大片空白,考虑缩小图尺寸或在其后补充内容 |
258
+ | 双栏末页浮动体堆积 | 使用 `\balance` 或 `\flushend` 平衡末页两栏高度(见 `space-util-fixer`) |
259
+
260
+ ---
261
+
262
+ ## 修复验证
263
+
264
+ 每完成一项修复后:
265
+
266
+ 1. 重新编译至少 **两次** 以稳定交叉引用和浮动体位置。
267
+ 2. 渲染新的 PDF 页图,对照缺陷报告逐项检查:
268
+ - B1:浮动体页码与引用页码差值是否 ≤ 1?
269
+ - B2:图表宽度是否充分利用栏宽且无溢出?
270
+ - B3:堆叠是否分散,页面上图表数量是否 ≤ 2?
271
+ - B4:表格跨页是否带有重复表头?
272
+ 3. 若未通过,尝试下一策略,直至所有策略用尽或缺陷消除。
273
+
274
+ ---
275
+
276
+ ## 注意事项
277
+
278
+ - **避免过度使用 `[H]`**:`float` 宏包提供的 `[H]` 参数强制图表“在此处”,会破坏 LaTeX 的浮动机制,容易导致大面积留白。仅作为最后手段使用。
279
+ - **跨栏图顺序**:双栏中 `figure*` 总是出现在下一页顶部,这是 LaTeX 的固有行为,不可改变。若引用与图表跨页不可避免,接受并记录。
280
+ - **与 `space-util-fixer` 协同**:浮动体调整可能影响页数预算和末页留白,需联动 `space-util-fixer` 综合优化。
281
+
282
+ ---
283
+
284
+ **Float Optimizer Skill 就绪。** 等待 `code-surgeon-agent` 调用,执行浮动体优化任务。
@@ -0,0 +1,82 @@
1
+ """
2
+ PaperFit LaTeX Fixers - 可执行的 LaTeX 排版修复函数库
3
+
4
+ 本模块将 SKILL.md 中的修复策略转化为可执行、可测试的 Python 函数。
5
+ 供 code-surgeon-agent 直接调用,实现自动化修复。
6
+ """
7
+
8
+ from .overflow_fixers import (
9
+ fix_overfull_hbox,
10
+ fix_paragraph_overflow,
11
+ fix_table_overflow,
12
+ fix_long_formula,
13
+ fix_url_overflow,
14
+ )
15
+ from .float_fixers import (
16
+ fix_float_placement,
17
+ fix_float_width,
18
+ fix_float_fullwidth,
19
+ fix_float_clustering,
20
+ fix_split_float,
21
+ fix_table_width,
22
+ )
23
+ from .space_util_fixers import (
24
+ fix_widow_orphan,
25
+ fix_trailing_whitespace,
26
+ fix_page_budget,
27
+ fix_unbalanced_columns,
28
+ )
29
+ from .fullwidth_fixers import (
30
+ fix_figure_fullwidth,
31
+ fix_table_fullwidth,
32
+ fix_all_floats_fullwidth,
33
+ ensure_reference_newpage,
34
+ fix_body_last_page,
35
+ )
36
+ from .semantic_micro_tuning import (
37
+ minimalist_shorten,
38
+ deep_expand,
39
+ semantic_intervention,
40
+ )
41
+ from .utils import (
42
+ add_package_to_preamble,
43
+ add_to_preamble,
44
+ find_paragraph_start,
45
+ find_paragraph_end,
46
+ )
47
+
48
+ __all__ = [
49
+ # Overflow fixes
50
+ "fix_overfull_hbox",
51
+ "fix_paragraph_overflow",
52
+ "fix_table_overflow",
53
+ "fix_long_formula",
54
+ "fix_url_overflow",
55
+ # Float fixes
56
+ "fix_float_placement",
57
+ "fix_float_width",
58
+ "fix_float_fullwidth",
59
+ "fix_float_clustering",
60
+ "fix_split_float",
61
+ "fix_table_width",
62
+ # Full-width fixes (absolute priority)
63
+ "fix_figure_fullwidth",
64
+ "fix_table_fullwidth",
65
+ "fix_all_floats_fullwidth",
66
+ "ensure_reference_newpage",
67
+ "fix_body_last_page",
68
+ # Space utilization fixes
69
+ "fix_widow_orphan",
70
+ "fix_trailing_whitespace",
71
+ "fix_page_budget",
72
+ "fix_unbalanced_columns",
73
+ # Utilities
74
+ "add_package_to_preamble",
75
+ "add_to_preamble",
76
+ "find_paragraph_start",
77
+ "find_paragraph_end",
78
+ # Semantic micro-tuning
79
+ "minimalist_shorten",
80
+ "deep_expand",
81
+ "semantic_intervention",
82
+ ]