Files
hermes-skills/skills/legal/contract-editor/references/litigation-doc-footnotes-and-templates.md

7.6 KiB

诉讼文书:法条原文脚注 + 母版克隆建新文书 + 字体规范化

contract-editor 库在诉讼文书上的三组技法,2026-06-23/24 邹家「情况反映」(给法院监督部门的程序违法反映材料)制作中验证,全部 OnlyOffice x2t 渲染逐页核对过。与 litigation-doc-tracked-changes.md(修订态技法)互补——本文是脚注 + 新建文书 + 字体层面。


一、法条原文脚注(Doro 偏好:引用法律规定一律用脚注呈现原文,不删改不概括)

Doro 对引用法条的文书要求:法条原文(一字不改、不归纳)用脚注方式写进去。监督申请书 v9 已是这个体例,情况反映照搬。这是可复用的整套做法。

1. 脚注格式从同族已有文书克隆,不自造

申请书 v9 的 word/footnotes.xml 是现成模板。提取三样:

  • 两个特殊脚注 type=separator / type=continuationSeparator(id=-1/0)——分隔线,照搬。
  • 一个内容脚注的段落骨架(id=1 的 <w:p>)——拿它的 pPr(脚注段 spacing line=240)和三种 run 的 rPr 模板:
    • mark rPr:带 <w:rStyle w:val="affb"/> + Times New Roman + sz18(9pt 脚注体,不是正文 sz24)——脚注区那个序号。
    • bold rPr<w:b/> + sz18——法名加粗用。
    • plain rPr:sz18 无 rStyle 无 b——条号+原文用。
  • 正文里的脚注引用标(footnoteReference 承载 run)的 rPr 另取:从 v9 正文 里找 r/footnoteReference 那个 run 的 rPr(rStyle=affb + Times + sz24,跟正文同号,上标由 affb 样式控制)。

每条脚注 <w:footnote id=N> 段落结构:[footnoteRef(mark rPr)][空格(plain)][法名(bold rPr)][条号+原文(plain rPr)]。条号与原文之间用全角空格(如「第七十一条 证据应当…」)。

2. 目标 docx 已支持脚注则零配置

情况反映是从 v9 编辑来的,本就带 word/footnotes.xml、rels 里有 footnotes 关系、[Content_Types].xmlfootnotes+xml、styles.xml 有 affb 样式——直接覆盖 footnotes.xml + 在 document.xml 插引用标即可,不用补 rels/CT/style。动手前先 grep 确认这四样齐全;若是从无脚注的 docx 起步,才需要补全四处。

3. 插入引用标的位置铁律 + 多 run 锚点陷阱(本次踩坑)

脚注上标要紧贴法条号正后方(如「第七十一条¹之规定」「第五十一条第二款³所定」),不要落在句末或下游词上。统一体例:四个脚注全部「条号后挂注」最整齐。

陷阱第五十一条第二款 这种锚点在 docx XML 里常跨多个 w:r(编号、款号被拆在不同 run)。若按"找到 anchor 所在 run、在该 run 后插引用"的粗定位,会把上标插到 anchor 下游某个 run 后——本次 ³ 错插到了「承办部门」后(隔了好几个词)。OnlyOffice 渲染出来才发现,vision 核对抓到的。

正解:字符流 + split run 精确定位

# 1) 拼接段落所有 w:t 成 full,建 map: full每个字符 -> (t_element, idx_in_t)
# 2) end = full.find(anchor) + len(anchor) - 1   # 锚点最后一个字符
# 3) t_end, k_end = map[end];把 t_end 文本 split:head=s[:k_end+1], tail=s[k_end+1:]
# 4) t_end.text=head;在 t_end 所在 run 之后 addnext 一个新 run(脚注引用);
#    若 tail 非空,再 addnext 一个同 rPr 的 run 承载 tail

这样上标精确落在锚点最后一字之后,不受 run 边界影响。容错:第五十一条第二款 找不到时退化找 第五十一条

4. 款数存疑时,脚注放全条原文

Doro 引「第五十一条第二款」,但权威原文里"普通程序不少于十五日"实际在第一款不擅改他的款数——脚注内容放该条全文(含两款),无论款数对错,原文都完整覆盖、不断章;款数是否要改回原文里报给 Doro 定,不自己动。


二、母版克隆建新诉讼文书(保证与同案既有文书同源)

新建一份配套文书(情况反映 vs 已有的监督申请书),要让字体/字号/页边距/样式与同案既有文书完全同源——直接拿那份已交付的 docx 当母版。

  • 段落模板克隆:从母版 body 抓代表性段落各一份 deepcopy 当模板——title(居中 bold sz30)、body(首行缩进 fl480 sz24)、recip(机关名顶格 bold sz24)、sign(右对齐 sz24)、date(右对齐)、attt(附件标题顶格 bold)、att(附件项 fl480)。mk(模板, 文本, bold, no_indent):克隆模板→清空其 run/ins/del→(按需删 numPr/ind)→force_font(eastAsia=仿宋, ascii/hAnsi=Times)→写新 run。
  • 清空原 body 段落,把新段落 insert 到 sectPr 之前(保页边距/分节设置不变)。
  • 关 trackRevisions:新建文书是全新成稿、非修订态,settings.xml 删 <w:trackRevisions/>
  • 页眉错配必须清(本次踩坑):母版(监督申请书)的 header1.xml 带"申请监督民事诉讼案号/受理法院"这种本文书类型专属抬头,套到情况反映上不对路。处理:清空 header 所有 run 的文字。
  • 页眉横线 = pBdr,单清文字不够:清了页眉文字后 OnlyOffice 仍渲出一条横线——来自页眉段落的 <w:pBdr>(段落下边框)。遍历 header 所有 pPrpBdr(本例 2 段),并去掉可能带边框的 pStyle 引用。styles.xml 里的 Header 样式若也挂 pBdr 一并清。重渲确认顶部纯白到标题。

三、字体规范化:源文档丢了显式 eastAsia 字体

症状:用户编辑过的 docx,正文中文 run 的 rFonts 没有 eastAsia 属性(eastAsia=None),docDefaults 也没设。OnlyOffice 靠底层回退仍渲成仿宋,但显式字体属性缺失不符合"中文必须显式仿宋"的交付标准。本次 Doro 改的情况反映 1283 个中文字符全是 eastAsia=None。

判断边界(重要):先比对用户原版——若原版本就是 eastAsia=None(不是你的编辑引入的),补齐属于格式规范化(不改字形、不改一个文字、不动他的内容编辑),与历史上的字体规范化同类,可做。若是你的操作把字体搞丢的,那是 bug 要修源头。

修法:遍历所有含文字的 run,rFontseastAsia=仿宋,缺 ascii/hAnsi 则补 Times New Roman;再给 docDefaults/rPrDefault/rPr/rFonts 补 eastAsia=仿宋 兜底。改完 OnlyOffice 重渲确认无字形回退(字体改动必重渲,vision 核"全文仿宋、无方框、无回退乱码")。核验:zipfile 统计 CJK→仿宋、LATIN→Times New Roman 计数全覆盖。


验收三件套(脚注版)

  1. 正文脚注引用数 == 预期(sum(r.find(footnoteReference) for r in runs))。
  2. footnotes.xml 内容数 == 引用数,逐条 print 前 50 字核法名+条号+原文。
  3. OnlyOffice x2t 渲染逐页 vision 核:每个上标在正确法条号正后方(重点查多 run 锚点那条没错位)、页脚脚注区原文完整无截断、脚注字号 < 正文、法名加粗、无乱码。脚注主要落在前两页,逐页都要看。

一句话

法条脚注:格式克隆同族文书的 footnotes.xml(separator+内容模板,mark/bold/plain 三 rPr),引用标用 split-run 精确插在条号后(多 run 锚点必踩坑),款数存疑放全条原文不擅改。建新文书:克隆母版段落模板保同源,清错配页眉+pBdr 横线。字体:源档丢 eastAsia 时补齐属于规范化(先确认是原档状态不是自己搞丢的),改完必重渲。