Install
openclaw skills install @tomuiv/docx-writerGenerate academic-standard Word documents with correctly formatted native footnotes, styled text, tables, and images using bayoo-docx and lxml.
openclaw skills install @tomuiv/docx-writer通过 bayoo-docx(原生支持脚注的 python-docx 分支)+ lxml 生成符合学术规范的 Word 文档。脚注由库引擎原生创建,避免手工构造 OOXML 导致的格式问题。
pip install bayoo-docx lxml
| 类型 | 路径 | 生命周期 |
|---|---|---|
| SKILL 本体 | skills/docx-writer/SKILL.md | 长期 |
| 标准模板 | skills/docx-writer/template.docx | 不修改 |
| 持久脚本 | skills/docx-writer/scripts/ | 长期 |
| 临时脚本 | skills/docx-writer/tmp/scripts/ | 写入 log.md,2周清除 |
| 输出 | skills/docx-writer/output/ | 用户确认后移到目标位置 |
| 需求 | 推荐 | 理由 |
|---|---|---|
| 创建含脚注的 docx | bayoo-docx | paragraph.add_footnote() 原生创建,编号/间距正确 |
| 格式化(字体/字号/缩进) | bayoo-docx + lxml | 字体用 run.font API,边框/样式用 lxml 微调 |
| 加载模板样式 | bayoo-docx | Document(模板路径) 继承模板的样式和页设置 |
| 脚注字体/字号设定 | 创建后遍历 fn.findall('.//w:r') | 显式设置 w:sz=18 和 w:rFonts |
不要用的:
add_footnote)footnotes.xml(编号/分隔线不可控)SKILL 自带模板 skills/docx-writer/template.docx(已验证的初稿文件,含 Word 原生脚注)。该模板提供正确的 footnote text(样式ID=12)和 footnote reference(样式ID=20)样式。
脚本中引用方式:TEMPLATE = os.path.join(SKILL_DIR, 'template.docx')
使用 B('文本{F1}更多文本') 语法,其中 {F1} 表示脚注。
脚注编号规则:
句子内容。{F1} ✅句子内容{F1}。 ❌FN_TEXT_MAP = {
'F1': '作者. 标题. 期刊, 年份, 卷(期): 页码.',
}
| 函数 | 用途 | 字体/字号 |
|---|---|---|
P(text, ...) | 通用段落 | 宋体/TNR 10.5pt |
B(text) | 正文 | 宋体/TNR 10.5pt |
Bs(text) | 小字正文(摘要) | 宋体/TNR 9pt |
H1(text) | 一级标题 | 黑体/Arial 12pt |
H2(text) | 二级标题 | 黑体/Arial 12pt |
H3(text) | 三级标题 | 黑体/Arial 10.5pt |
Tc(text) | 表题/图题 | 宋体/TNR 9pt |
add_img(path, cap) | 插入图片+图题 | 居中 |
add_tbl(h, rows) | 三线表格 | 小五号 |
doc.save('输出路径.docx')
不要自己写脚本。 使用已有的已验证脚本:
| 文件 | 说明 | 路径 |
|---|---|---|
build_docx.py | 空白模板,填空即用 | skills/docx-writer/scripts/build_docx.py |
build_final.py | 已验证的完整终稿生成脚本 | skills/docx-writer/scripts/build_final.py |
使用方法:
build_docx.py 到目标目录FN_TEXT_MAP 为实际脚注内容B('文本{F1}') 等函数编写正文内容不要修改排版函数(set_font, P, B, H1, H2, H3, Tc, add_img, add_tbl),这些已经过验证。
| 元素 | 中文 | 英文/数字 | 字号 | 对齐 | 缩进 | 行距 |
|---|---|---|---|---|---|---|
| 文章标题 | 黑体 | Arial | 四号(14pt) | 居中 | 无 | 1.5倍 |
| 作者行 | 楷体 | Times New Roman | 五号(10.5pt) | 居中 | 无 | 1.5倍 |
| 摘要/关键词 | 宋体 | Times New Roman | 小五(9pt) | 左对齐 | 首行缩进2字符 | 1.5倍 |
| 一级标题 | 黑体 | Arial | 小四(12pt) | 居中 | 无 | 1.5倍 |
| 二级标题 | 黑体 | Arial | 小四(12pt) | 左对齐 | 首行缩进2字符 | 1.5倍 |
| 三级标题 | 黑体 | Arial | 五号(10.5pt) | 左对齐 | 首行缩进2字符 | 1.5倍 |
| 正文 | 宋体 | Times New Roman | 五号(10.5pt) | 左对齐 | 首行缩进2字符 | 1.5倍 |
| 表题/图题 | 宋体 | Times New Roman | 小五(9pt) | 居中 | 无 | 1.5倍 |
| 表内文字 | 宋体 | Times New Roman | 小五(9pt) | 居中 | — | 1.5倍 |
| 表注 | 宋体 | Times New Roman | 小五(9pt) | 左对齐 | 首行缩进2字符 | 1.5倍 |
| 脚注正文 | 宋体 | Times New Roman | 小五(9pt) | 左对齐 | 无缩进 | 单倍行距 |
| 脚注编号(正文中) | — | — | — | — | — | 上标 |
句子内容。{F1} — 句号在脚注标记之前,符点在前,注释号在后def B(t): return P(t) # 正文
def Bs(t): return P(t, sz=Pt(9)) # 小字
def H1(t): return P(t, cn='黑体', en='Arial', # 一级标题
sz=Pt(12), align='center', fi=None)
def H2(t): return P(t, cn='黑体', en='Arial', # 二级标题
sz=Pt(12))
def H3(t): return P(t, cn='黑体', en='Arial', # 三级标题
sz=Pt(10.5))
def Tc(t): return P(t, sz=Pt(9), align='center', # 表题/图题
fi=None)
B('文本{F1}') — 正文带脚注,句号在脚注前H1('一、标题') — 一级标题add_tbl(['列名'], [['数据']]) — 三线表add_img('路径.png', '图1 标题') — 图片+图题\u3000)。正文缩进通过 fi=Cm(0.74) 控制,表格/标题用 align 参数控制。全角空格在不同字体和排版环境下表现不一致,会导致错位。| 问题 | 原因 | 解决 |
|---|---|---|
| 脚注显示等线字体 | bayoo-docx 不自动设置中文字体 | 创建后遍历 fn.findall('.//w:r') 显式设 rFonts:eastAsia=宋体, ascii=Times New Roman, hAnsi=Times New Roman |
| 脚注五号字(应为小五) | 脚本文本 run 未设 w:sz | 显式设 sz=18 和 szCs=18(18 half-points = 9pt = 小五号) |
| 正文引用不上标 | bayoo-docx 的 rStyle 匹配不到模板的样式 ID | 后处理加 vertAlign=superscript |
| 句号位置 | 规范要求 。{F1} 而非 {F1}。 | 写作时注意句号在脚注标记前 |
| 表格全框线 | Table Grid 样式默认全框 | 用 lxml 移除所有边框后加三线:header top、header bottom、last row bottom |