Files
health/辅行诀五脏用药法要-药性探真/05_脚本工具/12_clean_ch3.py
T

2187 lines
173 KiB
Python
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
辅行诀五脏用药法要-药性探真 资料库 ETL 第 12 步(2026-09-21)
01_来源数据/《辅行诀五脏用药法要 药性探真》第3章.md -> 02_加工数据/
定位:本件为《药性探真》第三章「五脏补泻金石方例 用药释义」之**录入稿**
(PDF/文本层导出;A 类版式残留未清,与第一章之「用户精清稿」不同,
与第二章同属录入稿一类)。
标准:**完全沿用第一章(07_clean_ch1.py)/第二章(10_clean_ch2.py)的检查核对标准**——
同一编号体系(A 版式/B 断行/C 讹字/D 标点/E 存疑/F 体例/H 标题层级)、
同一产物集(清洗版+检查报告+结构.json+待核对清单按章节结构分组)、
同一核校纪律(每条改写带锚校验 + 核校依据,可回改;存疑一律不改原文)。
处理(编号与检查报告一致):
A 版式残留:行尾空格 303 行、汉字间半角空格 42 处(标题内 10 处体例保留)、
数字与汉字间半角空格 12 处、LaTeX(PDF 公式化)残留 1 处、半角「~」1 处
B 断行接合:**本件 0 处**(经逐段扫描,无跨空行截断之句;段末脱句号 2 处归 D 类补正)
C 讹字修正:40 条规则(每条附核校依据:底本内证/传本/本库内证/史实)
其中「礜石」一族 12 处、「石硫磺」名位 1 处为名位性订正
D 标点规范化:7 处(段末补句号 2、句号误作顿号 1、引号内逗号改句号 1、
误入句号 1、误入逗号 1、半角「~」→全角「~」1)
E 存疑(原文不改,登记待核):22 条
F 体例登记:12 项(名位重出、标题内空格、引号收尾体例、两章用字待统一等)
H 标题层级:章=二级(##)、节=三级(###)、条目=四级(####)、子目=五级(#####);
另源件 2 行条目题名未标井号(第 133/311 行),清洗版补标为四级
自检(脚本自动):
① C 类 40 条规则三段验证(错误形残留 0 / 正确形已出现)
② 标题计数 章1/节7/条目32/子目27;各节条目序号、各条目子目序号连续;层级无跳级
③ 引号/书名号/括号/单引号配平(引号 299/298,差 1 处系源件第 397 行《别录》
石硫黄条脱文所致——**该脱文已于 2026-09-21 经用户判决「回填」补入,引号现为 300/300**);半角标点 0;残留空格 0;断行候选 0
④ 35 品金石药「名位(X中Y)」⇄ 底本二十五味药精/十三种药 逐品互校
⑤ 与第 2 章交叉引证(「见第二章第二节·五」)互校
输出:
02_加工数据/药性探真_第3章_清洗版.md
02_加工数据/药性探真_第3章_检查报告.md
02_加工数据/药性探真_第3章_结构.json
02_加工数据/药性探真_第3章_待核对清单.md
幂等:可重复运行;改写皆带原文锚校验,源件被替换即报错。
说明:01_来源数据/《…》第3章.md **标题层级已于 2026-09-22 经用户明示指令就地优化**
(原样:章级「#」,节/条目/子目全为「##」,未分级;另 2 行题名未标井号)。
执行 13_retitle_src_ch3.py --apply(只改井号、正文逐行校验未动),改动前逐字节快照=
《…》第3章_层级优化前快照_20260922.md;源件 md5 2f2f0301… → 41363b0d…;
**重跑本脚本后清洗版 md5 未变**(层级层与清洗层同规则 ⇒ 幂等)。
"""
import os, re, json, hashlib, collections
BASE = os.path.expanduser("~/Documents/ai_agent_scraper_study/data/辅行诀五脏用药法要-药性探真")
SRC = os.path.join(BASE, "01_来源数据/《辅行诀五脏用药法要 药性探真》第3章.md")
CH1_MD = os.path.join(BASE, "02_加工数据/药性探真_第1章_清洗版.md")
CH2_MD = os.path.join(BASE, "02_加工数据/药性探真_第2章_清洗版.md")
BENDI = os.path.join(BASE, "02_加工数据/辅行诀五脏用药法要_基础文本_清洗版.md")
OUT_MD = os.path.join(BASE, "02_加工数据/药性探真_第3章_清洗版.md")
OUT_REPORT = os.path.join(BASE, "02_加工数据/药性探真_第3章_检查报告.md")
OUT_STRUCT = os.path.join(BASE, "02_加工数据/药性探真_第3章_结构.json")
OUT_CHECK = os.path.join(BASE, "02_加工数据/药性探真_第3章_待核对清单.md")
# ── B 类:断行接合(源件行号 + 原文锚校验;与下一非空行接合)────────────
# 本件经逐段扫描无跨空行截断之句(段末无收尾标点者 2 处,下一段均另起新句,
# 属「段末脱句号」而非「同句断开」,故归 D 类补正,见 D_FIXES)。
JOINS = {}
# ── C 类:讹字修正(锚校验:原文命中次数 + 改后残留 0)──────────────────
# (讹形, 正形, 原文应命中数(**按行计**), 核校依据)
C_FIXES = [
# —— 金石药名位/药名(底本二十五味药精内证 + 传本)——
("礐石", "礜石", 1,
"**底本内证**:底本《辅行诀》二十五味药精「味辛皆属木…细辛**礜石**为金」(木中金之位);"
"本条即木中金药,正文自述「磐石为剧毒药,含砷化物,是一种砒石」,正为礜石;"
"底本清洗(03_clean_yinshua.py)已判「磐石/舜石/碧石→礜石」同例;「礐」形近致误"),
("磐石", "礜石", (1, 2, 3), # 全文共 11 处:第 65/69/79/91 行各 1;第 67/71 行各 2;第 73 行 3
"**底本内证**:同上(二十五味药精木中金作「礜石」);《别录》传本作「一名白礜石」;"
"本条正文「含砷化物,是一种砒石」可证;底本清洗已判同例"),
("一名固阳石", "一名固羊石", 1,
"《本经》礜石传本作「一名青分石,一名立制石,一名**固羊石**」(《名医别录》卷三引《本经》同;"
"《纲目》礜石释名亦作「固羊石」);「阳」「羊」形近致误"),
("石硫磺(金中火)", "石硫磺(金中木)", 1,
"**底本内证**:二十五味药精「味酸皆属金…芍药**硫黄为木**」(金中木);"
"本条正文自述「故《辅行诀》称其为**金中木**药」,且第 409 行「硫黄与草木**金中木**药芍药」;"
"第 1 章「三、芍药(金中木)」亦同——本条题名「金中火」与三处内证皆不合"),
# —— 人名/书名(史实+本库内证)——
("雷敦", "雷斅", 1,
"《本草纲目》伏龙肝条引「**斅**曰:凡使勿误用灶下土…」(雷斅《雷公炮炙论》);"
"「敦」「斅」形近致误。⚠ 第 1 章清洗版同形作「雷敦」(该章未改),本件据传本订正,"
"**两章用字待统一**(见体例登记)"),
("云芨七莶", "云笈七签", 1,
"北宋张君房编《**云笈七签**》卷七十七方药部载「九真中经四镇丸」(与本条所引全同);"
"「芨」「笈」、「莶」「签」形近致误"),
("肖绎", "萧绎", 2, # 第 273 行 2 处(「梁·肖绎著,肖绎,字世诚」)
"**史实**:梁元帝姓**萧**名绎(《梁书》纪作「世祖孝元皇帝」);同句「武帝萧衍之第七子」"
"亦作「萧」;「肖」「萧」形近致误"),
("肖衍", "萧衍", 1,
"**史实**:梁武帝姓**萧**名衍;同上"),
("何宴", "何晏", 1,
"**本库内证**:本件第 5 行引「(何晏语)」正作「**何晏**」(正始玄学名家);"
"「宴」「晏」形近致误"),
# —— 引文形近讹字(传本可校)——
("鳖疮", "䘌疮", 1,
"《名医别录》雄黄条传本作「主治疥虫,**䘌疮**,目痛…」(《证类本草》引同);"
"「䘌」为虫蚀之义,于此有义,「鳖」形近致误。⚠ 检索须用「䘌」(U+4618)"),
("越嵩", "越巂", 1,
"《名医别录》曾青条传本作「生蜀中及**越巂**,采无时」(《神农本草经》辑本同);"
"「巂」「嵩」同为山部形近致误"),
("一名羽硷", "一名羽涅", 1,
"《本经》矾石(涅石)传本作「**一名羽涅**」(《名医别录》卷三引《本经》同;"
"《纲目》矾石释名「涅石、羽涅、羽泽」);「硷」「涅」形近致误"),
("散靡肿", "散痈肿", 1,
"《名医别录》紫石英条传本作「除胃中久寒,**散痈肿**,令人悦泽」;"
"「痈」「靡」形近致误"),
("血瘅血瘀", "血痹血瘀", 1,
"《名医别录》代赭条传本作「除五脏血脉中热,**血痹,血瘀**,大人小儿惊气入腹」;"
"「痹」「瘅」形近致误"),
("荠尼", "荠苨", 1,
"《名医别录》桔梗条传本作「一名梗草,**一名荠苨**」;「苨」「尼」形近致误"),
("一名乌翣,一名乌蒲", "一名乌扇,一名乌蒲", 1,
"《本经》射干条传本作「**一名乌扇**,一名乌蒲」(《纲目》射干释名同);"
"「扇」讹作「翣」(翣为棺饰,于此无义)"),
("一名乌妾", "一名乌翣", 1,
"《名医别录》射干条传本作「**一名乌翣**,一名乌吹,一名草姜」"
"(《本经》条作「乌扇」,二书各自成文,本库照传本各订);「妾」「翣」形近致误"),
("猥猪矢", "猳猪屎", 1,
"《本经》猪苓条传本作「一名**猳猪屎**」(《名医别录》卷三引《本经》同);"
"「猳」(公猪)讹作「猥」,「屎」讹作「矢」"),
("一名地营", "一名地菅", 1,
"《名医别录》茅根条传本作「**一名地菅**,一名地筋,一名兼杜」;「菅」「营」形近致误"),
("一名氏东", "一名氐冬", 1,
"《名医别录》款冬花条传本作「**一名氐冬**」(《本经》作「一名颗冻」「菟奚」);"
"「氐」「氏」、「冬」「东」并形近致误"),
("若俗长生久视", "若欲长生久视", 1,
"《本草纲目》灵砂条引青霞子「…**若欲**长生久视,保命安神,须饵丹砂」;「欲」「俗」形近致误"),
("居其做宅", "居其故宅", 1,
"《抱朴子·内篇》述临沅廖氏丹井事作「他人**居其故宅**,复如旧」(《艺文类聚》卷六十四引同);"
"「故」「做」形近致误"),
("格据", "格拒", 1,
"《本草纲目》石硫黄条引发明引王好古「…能去**格拒**之寒,兼有伏阳」;"
"「格拒」为医家术语(寒热格拒),「据」「拒」形近致误"),
("其名磬", "其名曰礜", 1,
"《山海经·西山经》皋涂之山条传本作「有白石焉,**其名曰礜**,可以毒鼠」;"
"本条下文正以礜石立说;「磬」形近致误,并脱「曰」字"),
("陆薰香", "薰陆香", 1,
"《云笈七签》卷七十七九真中经四镇丸方作「**薰陆香**一两以和当归,薰五脏内」"
"(薰陆香即乳香,为药名);「陆薰」倒文致误"),
# —— 本句/本库内证(形近讹字、衍脱)——
("探无时", "采无时", 1, # 第 235/441 行各 1 处(全文 2 处)
"**本库内证**:全篇作「采无时」者 19 处(如第 25/43/55/417 行),"
"作「探」者仅 2 处;「采」「探」形近致误"),
("皆昧甘气温", "皆味甘气温", 1,
"《本经》白石英、紫石英并作「**味甘**,温」(《名医别录》卷三引《本经》同);"
"本条上文即引「味甘,温」;「味」「昧」形近致误"),
("同为砒所至", "同为砒所致", 1,
"本条上文「其毒性主要在于氧化砷…同为砒所至」,文义当为「(毒性)同为砒所致」"
"(所致=所致使的结果);「致」讹作「至」"),
("生成持性", "生成特性", 1,
"本条下文「作为其具有土之性的推理」「具有特殊的神灵之气」;「特」「持」形近致误"),
("黄连未", "黄连末", 1,
"《纲目》所引《肘后方》内痔方「朝阳黄土、**黄连末**、皮硝各一两」——三味并列皆粉末,"
"「末」为粉末之义(第 2 章「蘖未→蘖末」同例,经用户 2026-09-20 判决);"
"「末」「未」形近致误"),
("哎吐痰涎", "呕吐痰涎", 1,
"本条引钱乙「治小儿惊热肺实,**呕吐痰涎**…取其能透经络,走关窍也」;"
"「呕」「哎」同为口部形近致误"),
("管经推广", "曾经推广", 1,
"本条「此方在当时**曾经**推广,但笔者始终不敢轻信使用」;「曾经」文义唯一,"
"「曾」「管」形近致误"),
("胸痒之需", "胸痹之需", 1,
"**本句内证**:同句下文即作「亦不堪用之治疗**胸痹**」,且石脑油条全段皆论胸痹(张锡纯治胸痹方);"
"「痹」「痒」形近致误"),
("阳踯躅", "羊踯躅", 1,
"《纲目》硇砂条引《抱朴子》伏硇药作「羊**踯躅**」——「羊踯躅」即闹羊花,本草正名;"
"「羊」「阳」形近致误"),
("白截浆", "白酨浆", 1,
"**第 2 章用户判决(2026-09-20,清单 #4)**:「白截浆→白酨浆」修正正确(原书作「白酨浆」,"
"「截」为录入形近之误;第 1 章第六节·十一 条目标题亦作「白酨浆」);"
"底本十三种药「白酨浆为金中金,又为金中火」。⚠ 第 1 章清洗版同形 5 处未改,两章用字待统一"),
("相龌龊", "相龃龉", 1,
"本条「其火字与寒甚相龌龊,有待进一步解析」——「龌龊」为污秽之义,于此不伦;"
"「龃龉」(上下齿不相值)引申为相抵触、不相合,正合文义;二字形近致误"),
# —— 体例/衍倒(本库内证)——
("从土火论心病", "从火土论心病", 1,
"**本库内证**:本件作「从火土论心病」者 6 处(第 513/535/553/579/591/609 行),"
"本节节题亦作「从火土同治论心病」;本条「从**土火**论心病」倒文"),
("从火土论心治心病方", "从火土论心病方", 1,
"**本库内证**:同上 6 处平行文例皆作「从火土论心病(草木)方」;本条「论心**治心**病方」衍「治心」二字"),
("瓜蒌", "栝蒌", 1,
"**本库内证**:第 1 章作「栝蒌」17 处(含「第六节·七 栝蒌(土中土)」条目名);"
"底本《辅行诀》「小补心汤」用药及十三种药条并作「栝楼(栝蒌)」;"
"本件「瓜蒌」为异写,据本库用字统一"),
# —— 以下 7 条据用户 2026-09-21 判决(#4/#5/#9/#18/#19/#20「改」「修正正确,保留」)落盘 ——
("时间相附", "时间相符", 1,
"**用户核对原书(2026-09-21,清单 #4)**:判决「**改**」——原书作「相符」;"
"本件「相附」为录入形近之误(文义:传入时间相合)"),
("西元277年", "公元前277年", 1,
"**用户核对原书(2026-09-21,清单 #5)**:判决「**改**」——原书作「**公元前277年**」"
"(本段论先秦蜀都、秦置蜀郡,公元 277 年已入西晋,与文义不合;「西元」即公元,脱「前」字)"),
("怀腹中坚", "腹中坚癖", 1,
"**用户核对原书(2026-09-21,清单 #9)**:判决「**修正正确,保留**」——《本经》礜石传本作"
"「…死肌風痹,**腹中堅癖**,邪氣,除熱」(《名医别录》卷三引《本经》同);"
"本件「怀」为衍讹、「癖」脱,据传本一并订正"),
("结也细芒者", "结出细芒者", 1,
"**用户核对原书(2026-09-21,清单 #18)**:判决「**修正正确,保留**」——原书作「结**出**细芒者」;"
"同段下文平行句正作「煎炼结出细芒者亦名芒硝」「结出马牙者亦名牙硝」;「也」「出」形近致误"),
("所炼制之的卤碱", "所炼制之卤碱", 1,
"**用户核对原书(2026-09-21,清单 #19)**:判决「**修正正确,保留**」——原书无「的」字(衍文)"),
("其俱火体用之全", "其具火体用之全", 1,
"**用户核对原书(2026-09-21,清单 #19)**:判决「**修正正确,保留**」——原书作「**具**」"
"(具=具备,「俱」「具」形近致误)"),
("有毛有孔有乃肺金之象", "有毛有孔乃肺金之象", 1,
"**用户核对原书(2026-09-21,清单 #20)**:判决「**修正正确,保留**」——原书无第三个「有」字"
"(衍文;上文「有毛有孔」已为并列)"),
# —— 以下 9 条据用户 2026-09-21 第 3 批判决(清单 #21–#36「修正准确,保留修改」)落盘 ——
("吸水其性强", "其吸水性强", 1,
"**用户核对原书(2026-09-21,清单 #21)**:判决「**修正准确,保留修改**」——"
"「吸水其性强」语序倒错,原书作「**其吸水性强**」"),
("介于上述理由", "基于上述理由", 1,
"**用户核对原书(2026-09-21,清单 #21)**:同上——「介于上述理由」原书作「**基于上述理由**」"
"(「介」「基」形近)"),
("明沏如水", "明澈如水", 1,
"**用户核对原书(2026-09-21,清单 #25)**:判决「**修正准确,保留修改**」——原书作「**明澈如水**」;"
"同条第 297 行亦作「其质明澈如水晶」(《岭表录异》语)"),
("甚难是之而贵", "甚难得而贵", 1,
"**用户核对原书(2026-09-21,清单 #28)**:判决「**修正准确,保留修改**」——原书作「**甚难得而贵**」;"
"《本草纲目》曾青条弘景语传本作「甚難得而貴」(本件「是之」为「得」之讹)"),
("或去其生从实至空", "或云其生从实至空", 1,
"**用户核对原书(2026-09-21,清单 #28)**:同上——原书作「**或云其生从实至空**」"
"(「或云」=有人说;《纲目》曾青条释名传本作「或云其生從實至空」)"),
("化为输石", "化为鍮石", 1,
"**用户核对原书(2026-09-21,清单 #28)**:同上——原书作「**鍮石**」"
"(鍮石=黄铜,丹家器物通名;「输」为形近之讹)"),
("都是在铜绿经久变化而成", "都是由铜绿经久变化而成", 1,
"**用户核对原书(2026-09-21,清单 #29)**:判决「**修正准确,保留修改**」——原书作"
"「**都是由**铜绿经久变化而成」(本件脱「由」字)"),
("故主谓之皂矾", "故谓之皂矾", 1,
"**用户核对原书(2026-09-21,清单 #33)**:判决「**修正准确,保留修改**」——原书作"
"「故**谓**之皂矾」(衍「主」字);《纲目·绿矾》释名传本作「綠礬可以染皂色,故謂之皂礬」"),
("张氏治疽之硝石矾石散", "张氏治疸之硝石矾石散", 1,
"**用户核对原书(2026-09-21,清单 #35)**:判决「**修正准确,保留修改**」——原书作「治**疸**」;"
"《金匮要略》硝石矾石散主治黑疸(女劳疸),「疸」「疽」形近致误(同句后文另见"
"「硝石矾石散」,不复带「治疽」二字,无须改)"),
# —— 以下 7 条据用户 2026-09-21 第 5 批判决(清单 #38–#53/#57–#64)落盘 ——
("外家谓之侯", "外家谓之阳侯", 1,
"**用户核对原书(2026-09-21,清单 #38)**:判决「**修正正确,保留**」——原书作「外家谓之**阳侯**」;"
"《本草纲目》石硫黄条传本作「外家謂之陽侯,亦曰黃牙」"),
("则钢浸汁更谓何系", "则钢浸汁更谓何物", 1,
"**用户核对原书(2026-09-21,清单 #47)**:判决「**修正正确,保留**」——原书作「更谓**何物**」;"
"《纲目》铁落条传本作「則鋼浸汁更謂何物」(同段下文「《别录》谓其味甘属土」为对文)"),
("纤维膏", "纤维石膏", 1,
"**用户核对原书(2026-09-21,清单 #52)**:判决「**修正正确,保留**」——原书作「纤维**石膏**」;"
"矿物名(纤维石膏),本条上文亦作「硫酸盐类矿物石膏」"),
("鉴于上种情况", "鉴于上述情况", 1,
"**用户核对原书(2026-09-21,清单 #57)**:判决「**修正正确,保留**」——原书作「上**述**情况」"
"(「种」「述」形近致误)"),
("生河洼山坂之阴土石间", "生河崖山坂之阴土石间", 1,
"**用户核对原书(2026-09-21,清单 #61)**:判决「**修正正确,保留**」——原书作「河**崖**」;"
"《纲目》戎盐条传本作「生河崖山坂之陰土石間」"),
("主治呕呃", "主治呕啘", 1,
"**用户核对原书(2026-09-21,清单 #63)**:判决「**修正正确,保留**」——原书作「主治呕**啘**」"
"(啘=干呕);《名医别录》竹茹条传本作「主嘔啘,溫氣寒熱,吐血,崩中」"),
("除咳嗽,囊结", "破咳嗽囊结", 1,
"**用户核对原书(2026-09-21,清单 #63)**:同上——原书作「**破**咳嗽囊结」;"
"《本草经集注》(引《别录》)皂荚条传本作「消穀,破咳嗽囊結,婦人胞不落」"
"(本件「除……,」为「破」之讹并衍逗号)"),
("採根", "采根", 1,
"繁体残留字(第 647 行「二月、十月**採**根」);全篇及第 1/2 章皆作「采」,"
"属录入时未转换之繁体字"),
]
# ── C 类全文命中数(逐行计数按行变动者,另核全文总数,防漏改/误改)──────
C_TOTAL = {"磐石": 11, "探无时": 2, "肖绎": 2}
# ── C 类逐条「原书用字」核定 ─────────────────────────────────────────
# 第 1/2 章之「原书用字」栏(印刷之误 / 录入讹误)须**用户核对纸质原书**方可定,
# 本件为首轮清洗,**尚未核定**,故 C_ORIGIN 暂空;报告与清单中该栏一律标
# 「待核原书」,并已列入待核对清单(体例确认·批量核定一项,见 CHECK_ITEMS 末)。
C_ORIGIN = {
# —— 录入讹误(原书作正形,清洗版与印刷本一致;用户 2026-09-21 逐条核对原书)——
"时间相附": ("录入讹误", "原书作「**相符**」(清单 #4「改」)"),
"西元277年": ("录入讹误", "原书作「**公元前277年**」(清单 #5「改」)"),
"雷敦": ("录入讹误", "原书作「**雷斅**」(清单 #6「修正正确,保留」)"),
"鳖疮": ("录入讹误", "原书作「**䘌疮**」(清单 #10「修正正确,保留」)"),
"怀腹中坚": ("录入讹误", "原书作「**腹中坚癖**」(清单 #9「修正正确,保留」)"),
"结也细芒者": ("录入讹误", "原书作「**结出细芒者**」(清单 #18)"),
"所炼制之的卤碱": ("录入讹误", "原书无「的」字(清单 #19)"),
"其俱火体用之全": ("录入讹误", "原书作「**其具**火体用之全」(清单 #19)"),
"有毛有孔有乃肺金之象": ("录入讹误", "原书作「**有毛有孔**乃肺金之象」(清单 #20)"),
# —— 2026-09-21 第 3 批(清单 #21–#36「修正准确,保留修改」;用户核对原书)——
"吸水其性强": ("录入讹误", "原书作「**其吸水性强**」(清单 #21)"),
"介于上述理由": ("录入讹误", "原书作「**基于上述理由**」(清单 #21)"),
"肖绎": ("录入讹误", "原书作「**萧绎**」(史实;清单 #22)"),
"皆昧甘气温": ("录入讹误", "原书作「**皆味甘气温**」(清单 #24)"),
"何宴": ("录入讹误", "原书作「**何晏**」(清单 #24)"),
"明沏如水": ("录入讹误", "原书作「**明澈如水**」(清单 #25)"),
"越嵩": ("录入讹误", "原书作「**越巂**」(清单 #27)"),
"甚难是之而贵": ("录入讹误", "原书作「**甚难得而贵**」(清单 #28)"),
"或去其生从实至空": ("录入讹误", "原书作「**或云其生从实至空**」(清单 #28)"),
"化为输石": ("录入讹误", "原书作「**鍮石**」(清单 #28)"),
"都是在铜绿经久变化而成": ("录入讹误", "原书作「**都是由**铜绿经久变化而成」(清单 #29)"),
"生成持性": ("录入讹误", "原书作「**生成特性**」(清单 #30)"),
"羽硷": ("录入讹误", "原书作「**羽涅**」(清单 #32)"),
"故主谓之皂矾": ("录入讹误", "原书作「故**谓**之皂矾」(清单 #33)"),
"张氏治疽之硝石矾石散": ("录入讹误", "原书作「治**疸**」(清单 #35)"),
"石硫磺(金中火)": ("录入讹误", "原书作「**金中木**」(依据为底本内证三处一致;清单 #36——"
"如原书题名实作「金中火」,请改钉为★印刷之误·本库订正)"),
# —— 2026-09-21 第 5 批(清单 #38–#53/#57–#64「修正正确,保留」;用户核对原书)——
"外家谓之侯": ("录入讹误", "原书作「外家谓之**阳侯**」(清单 #38;《纲目》传本同)"),
"探无时": ("录入讹误", "原书作「**采无时**」(清单 #39)"),
"血瘅血瘀": ("录入讹误", "原书作「**血痹**血瘀」(清单 #41;《别录》代赭条传本)"),
"居其做宅": ("录入讹误", "原书作「居其**故**宅」(清单 #43;《抱朴子》传本)"),
"若俗长生久视": ("录入讹误", "原书作「若**欲**长生久视」(清单 #43)"),
"黄连未": ("录入讹误", "原书作「黄连**末**」(清单 #46)"),
"则钢浸汁更谓何系": ("录入讹误", "原书作「更谓**何物**」(清单 #47;《纲目》传本)"),
"从土火论心病": ("录入讹误", "原书作「从**火土**论心病」(清单 #48;本库内证 6 处一致)"),
"相龌龊": ("录入讹误", "原书作「相**龃龉**」(清单 #51)"),
"纤维膏": ("录入讹误", "原书作「纤维**石膏**」(清单 #52;矿物名)"),
"阳踯躅": ("录入讹误", "原书作「**羊**踯躅」(清单 #58;《纲目》引《抱朴子》传本)"),
"瓜蒌": ("录入讹误", "原书作「**栝**蒌」(清单 #60;本库内证:第 1 章 17 处、底本同)"),
"从火土论心治心病方": ("录入讹误", "原书作「从火土论心病方」(清单 #60;本库内证)"),
"生河洼山坂之阴土石间": ("录入讹误", "原书作「河**崖**」(清单 #61;《纲目》戎盐条传本)"),
"荠尼": ("录入讹误", "原书作「荠**苨**」(清单 #62;《别录》桔梗条传本)"),
"一名乌翣,一名乌蒲": ("录入讹误", "原书作「一名**乌扇**,一名乌蒲」(清单 #62;《本经》射干条传本)"),
"一名乌妾": ("录入讹误", "原书作「一名**乌翣**」(清单 #62;《别录》射干条传本)"),
"猥猪矢": ("录入讹误", "原书作「**猳**猪屎」(清单 #62;《本经》猪苓条传本)"),
"一名地营": ("录入讹误", "原书作「一名**地菅**」(清单 #62;《别录》茅根条传本)"),
"一名氏东": ("录入讹误", "原书作「一名**氐冬**」(清单 #62;《别录》款冬花条传本)"),
"採根": ("录入讹误", "原书作「**采**根」(清单 #62;繁体未转换,同第 1/2 章例)"),
"主治呕呃": ("录入讹误", "原书作「主治呕**啘**」(清单 #63;《别录》竹茹条传本)"),
"除咳嗽,囊结": ("录入讹误", "原书作「**破**咳嗽囊结」(清单 #63;《本草经集注》皂荚条传本)"),
# —— 原书印刷之误·本库订正 ★(原书即作讹形;维持修正、**不得据「原书如此」回流**)——
"礐石": ("印刷之误", "**用户核对原书(清单 #8)**:原书题名即作「**礐石**」——属印刷本自身之误,"
"本库据底本二十五味药精「细辛 礜石为金」订正,**维持修正、不得回流**"),
"磐石": ("印刷之误", "同上(同条正文 11 处;原书亦作「磐石」一族之误,同办订正、不得回流)"),
"云芨七莶": ("印刷之误", "**用户核对原书(清单 #14)**:原书即作「云芨七莶」而判决"
"「原文如此,**但修正有理,确认修正**」——属印刷之误·本库订正"),
"陆薰香": ("印刷之误", "同上(原书即作「陆薰香」;「薰陆香」为药名,本库订正、不得回流)"),
}
def origin_counts():
ru = [k for k, v in C_ORIGIN.items() if v[0] == "录入讹误"]
yr = [k for k, v in C_ORIGIN.items() if v[0] == "印刷之误"]
return len(ru), len(yr), len(C_FIXES) - len(ru) - len(yr)
BACKFILLS = [
# 回填=据用户提供的原书脱落文字补入正文(清单 #37;用户 2026-09-21 第 4 批判决)
("主治心腹积聚,邪气 。", # 源件此处「邪气」后有半角空格(A 类清理前),故讹形从原样
"主治心腹积聚,邪气,冷癖在胁,咳逆上气,脚冷疼弱无力,及鼻衄,恶疮,下部䘌疮,止血,"
"杀疥虫。生东海牧羊山,及大山(大山具体地址待考,疑为太山),及河西山,矾石液也。”"
"\n\n晋·张华《博物志》谓:“凡水源有石硫黄,其水则温,或云神人所暖,主疗疾。”", 1,
"**用户 2026-09-21 判决「回填」(清单 #37)**:用户核原书后给出脱落全文——「冷癖在胁,咳逆上气,"
"脚冷疼弱无力,及鼻衄,恶疮,下部䘌疮,止血,杀疥虫。生东海牧羊山,及大山(大山具体地址待考,"
"疑为太山),及河西山,矾石液也。」+「晋·张华《博物志》谓:『凡水源有石硫黄,其水则温,"
"或云神人所暖,主疗疾。』」——本库据此补入(源件脱文两段:①《别录》条后半及收尾引号,"
"②《博物志》引文整段);**文末「邪气」后之句号改逗号**(该句号系脱文截断所致,补文后清单续读);"
"**内证**:《名医别录》石硫黄条传本正作「療心腹積聚,邪氣冷癖在脅,欬逆上氣…下部䘌瘡,"
"止血,殺疥蟲。生東海牧羊山谷中及泰山、河西山,礬石液也」。⚠ 回填文本用字按本库归一:"
"「下部䘌疮」(用户原文作「鳖疮」,同清单 #10 已定之订正)、「矾石」(用户原文作「礬石」,"
"简体归一,同「採→采」例);⚠ 夹注「(大山具体地址待考,疑为太山)」照用户给文录入"
"(体例同本条「生东海(今江苏北部…)」夹注)。全篇引号由 299/298 变为 **300/300**(脱文收尾引号已补)。"),
]
def c_origin_note():
"""「原书用字」核定进度(按 C_ORIGIN/C_FIXES 动态计算,避免计数漂移)"""
n_all = len(C_FIXES)
ru = [k for k, v in C_ORIGIN.items() if v[0] == "录入讹误"]
yr = [k for k, v in C_ORIGIN.items() if v[0] == "印刷之误"]
pend = n_all - len(ru) - len(yr)
return (
f"**「原书用字」核定进度(用户 2026-09-21)**:经用户逐条核对原书,**已钉定 {len(ru) + len(yr)} 条/{n_all} 条**——"
f"**录入讹误 {len(ru)} 条**("
+ "/".join(ru) + ":原书皆作正形,**清洗版与印刷本一致,可直接以印刷本复核**)·"
f"**★原书印刷之误·本库订正 {len(yr)} 条**("
+ "/".join(yr) +
":原书即作讹形,经判决「修正有理,确认修正」或据底本内证订正——"
"**清洗版与印刷本有意不一致、不得据「原书如此」回流**)。"
f"**其余 {pend} 条 C 类规则之「原书用字」=用户 2026-09-22 判「暂时保留」**——"
f"**分类(录入讹误/★印刷之误)暂不钉定、正文一律不改**,维持**统一按「本库订正·保留修正」"
f"处理、任何情形下不得回流**;日后核出可逐条钉定分类(只改本栏与第八节,不影响现有文本)。")
# ── C 类回改(用户判决「原文无误」→ 撤销本库前批修正;锚校验)──────────
REVERTS = []
# ── D 类:标点规范化(锚校验)─────────────────────────────────────────
D_FIXES = [
("味甘,生温。熟热,有毒", "味甘,生温、熟热,有毒", 1,
"《名医别录》礜石传本作「味甘,生溫、熟熱,有毒」——「生温」「熟热」为对文,"
"本件误以句号断开,据传本改顿号"),
("可以毒鼠,”", "可以毒鼠。”", 1,
"《山海经·西山经》引文至此句终,收尾标点当为句号而误作逗号(逗号在引号内),"
"同全书引文体例(第 2 章「之处,”杏之叶」同例已改)"),
("含铁。量高", "含铁量高", 1,
"本条「与皂矾因含铁。量高而服之亦为黑色便相同」——「含铁量高」为一词,"
"句中误入句号,删"),
("始终,不敢", "始终不敢", 1,
"本条「但笔者始终,不敢轻信使用」——「始终不敢」连读,句中误入逗号,删"),
("得温热可蒸化而润泽(至暑月回润)", "得温热可蒸化而润泽(至暑月回润)。", 1,
"段末脱收尾句号(源件该段末字为「)」而无句读),据段末体例补句号——"
"非补文字,仅补句读,可回改"),
("同气之物,故又名火硝,", "同气之物,故又名火硝。", 1,
"段末原以逗号收句(「故又名火硝,」),据段末体例改句号;非补文字"),
("所谓芒硝者是也。”川、晋之硝", "所谓芒硝者是也;川、晋之硝", 1,
"**用户核对原书(2026-09-21,清单 #17)**:判决「**修正正确,保留**」——原书《纲目》朴硝条"
"时珍语为一气贯下,收尾引号当在「殊无指归。」之后;《纲目》传本此处分号作「者是也;川晉之硝」,"
"故本处改句读为分号、并移收尾引号至该段之末(引号计数不变;全篇引号已由第 397 行脱文"
"经判决「回填」补齐,现 300/300)"),
("因名迷实,殊无指归。", "因名迷实,殊无指归。”", 1,
"**用户核对原书(2026-09-21,清单 #17)**:同上——补时珍语收尾引号(与上一条为一对:"
"移引号、非增字;全篇引号 300/300(原差 1 处系第 397 行源件脱文,已据判决「回填」补齐)"),
("4~5毫升", "4~5毫升", 1,
"半角「~」改全角「~」(同第 1/2 章体例;第 2 章同一处半角「~」已改)"),
]
# ── H 类:标题层级(章 2 / 节 3 / 条目 4 / 子目 5)─────────────────────
H_RULES = [
(re.compile(r"^第[一二三四五六七八九十]+章[  ]"), 2, "章"),
(re.compile(r"^第[一二三四五六七八九十]+节[  ]"), 3, "节"),
(re.compile(r"^[一二三四五六七八九十]+、"), 4, "条目"),
(re.compile(r"^\d+\.\s*"), 5, "子目"),
]
# ── H 类:源件未标井号之条目题名,清洗版补标(锚校验)──────────────────
# (源行号, 原文锚, 层级)
MISSING_HEADINGS = {
133: ("三、硝石(即火硝,火中木)、朴硝(即水硝,水中木、水中火)", 4),
311: ("一、绿青(即石绿,金中金)、曾青(金中土、火中木)", 4),
}
# ── E 类:存疑(原文不改,登记待核)───────────────────────────────────
SUSPECTS = [
("公元前277年",
"**用户 2026-09-21 判决「改」**(清单 #5,经核对原书:原书作「公元前277年」)→ 本件脱「前」字,"
"**已据判决订正正文(生效)**;本项结项、移出存疑册。"),
("时间相符",
"**用户 2026-09-21 判决「改」**(清单 #4,经核对原书:原书作「相符」)→ 本件「相附」为录入形近之误,"
"**已据判决订正正文(生效)**;本项结项、移出存疑册。"),
("腹中坚癖",
"**用户 2026-09-21 判决「修正正确,保留」**(清单 #9,经核对原书:原书作「腹中坚癖」,与《本经》"
"传本同)→ 本件「怀腹中坚」为衍讹并脱「癖」,**已据判决订正正文(生效)**;本项结项、移出存疑册。"),
("火惮散炎上显明之性",
"**用户 2026-09-21 判决「原文无误,暂不修改」**(清单 #11,经核对原书:原书即作「惮散」)→ "
"本库**不作改动**;本项结项、移出存疑册(「暂」=日后如有新材料可再议)。"),
("草药木火中火牡丹皮",
"**用户 2026-09-21 判决「原文无误,暂时保留」**(清单 #12,经核对原书:原书即作「草药木火中火」)→ "
"本库**不作改动**;本项结项、移出存疑册(「暂」=日后如有新材料可再议)。"),
("外有壳重垒",
"**用户 2026-09-21 判决「原文如此,暂时保留」**(清单 #13,经核对原书:原书即作「重垒」)→ "
"本库**不作改动**;本项结项、移出存疑册(「暂」=日后如有新材料可再议)。"),
("结出细芒者",
"**用户 2026-09-21 判决「修正正确,保留」**(清单 #18,经核对原书:原书作「结出细芒者」)→ "
"**已据判决订正正文(生效)**;本项结项、移出存疑册。"),
("《别录》所谓芒硝者是也;",
"**用户 2026-09-21 判决「修正正确,保留」**(清单 #17,经核对原书:时珍语一气贯下、收尾引号在"
"「殊无指归。」之后)→ **已据判决移引号、此处句读改分号(生效)**;本项结项、移出存疑册。"),
("其吸水性强",
"**用户 2026-09-21 判决「修正准确,保留修改」**(清单 #21,用户核对原书)→ ①「吸水其性强」"
"**已订正为「其吸水性强」**;②「介于上述理由」**已订正为「基于上述理由」**——两处**均已生效**;"
"本项结项、移出存疑册。"),
("石英明澈如水",
"**用户 2026-09-21 判决「修正准确,保留修改」**(清单 #25,用户核对原书)→ ①「明沏如水」"
"**已订正为「明澈如水」**(生效);②同段「似与石英有火性之说不谋」一处**本库未改**——"
"「疑脱『而合』/疑当作『相谋』」两说并存、原书用字未定,**该项仍在册待核**。"),
("甚难得而贵",
"**用户 2026-09-21 判决「修正准确,保留修改」**(清单 #28,用户核对原书)→ 三处**均已订正生效**:"
"①「甚难是之而贵」→「**甚难得而贵**」;②「或去其生从实至空」→「**或云**其生从实至空」;"
"③「化为输石」→「化为**鍮石**」。本项结项、移出存疑册。"
"(附记:同段「故曰层青也」——传本《纲目》曾青条释名作「故曰曾青也」,本件作「层青」;"
"**本库未改**,登记待裁示。)"),
("都是由铜绿经久变化而成",
"**用户 2026-09-21 判决「修正准确,保留修改」**(清单 #29,用户核对原书)→ 已据判决在「都是」后"
"**补「由」字**(「都是由铜绿经久变化而成」);本项结项、移出存疑册。"),
("桐君采灵",
"**用户 2026-09-21 判决「修正准确,保留修改」**(清单 #31,用户核对原书)——书名疑为"
"《桐君采药录》之讹脱,**无原书字样则不臆补**:本库**未改正文**,照原字「采灵」保留;"
"检索须用原字(「采药录」检索不到);本项结项,日后核出书名可加办。"),
("均可治理",
"**用户 2026-09-21 判决「修正准确,保留修改」**(清单 #34,用户核对原书)——「治理」下疑有脱文,"
"按「不敢臆补」之例**本库未改正文**、照原样保留;本项结项(如原书另有文,请给字样以补正)。"),
("张氏治疸之硝石矾石散",
"**用户 2026-09-21 判决「修正准确,保留修改」**(清单 #35,用户核对原书)→ 「治疽」"
"**已订正为「治疸」**(1 处、生效;同句后文另见「硝石矾石散」,不复带此二字);"
"本项结项、移出存疑册。"),
("外家谓之阳侯",
"**用户 2026-09-21 判决「修正正确,保留」**(清单 #38,用户核对原书)→ 已据判决补「阳」字"
"(「外家谓之**阳侯**」;《纲目》石硫黄条传本作「外家謂之陽侯,亦曰黃牙」);本项结项。"),
("泄癖",
"**用户 2026-09-21 判决「修正正确,保留」**(清单 #40,用户核对原书)——「泄癖/泄澼」两形并见,"
"本库**未改**(用字未定,清单一律不发):第 429 行作「泄癖」、第 415 行引《本经》作「泄澼」、"
"第 1 章《别录》黄连条作「泄癖」(该章未改)。登记:**检索须两形并用**;本项结项。"),
("司空张岂",
"**用户 2026-09-21 判决「修正正确,保留」**(清单 #45,用户核对原书)——「司空张岂」人名可疑"
"(南齐明帝时无任司空之可考者;《本草拾遗》所引「张司空」多指西晋张华),本库**不改**"
"(无原书字样不臆改人名);登记待核;本项结项。"),
("则钢浸汁更谓何物",
"**用户 2026-09-21 判决「修正正确,保留」**(清单 #47,用户核对原书)→ ①已据判决改「何**物**」"
"(《纲目》铁落条传本「則鋼浸汁更謂何物」);②同段「**乃是据其以青属木**」疑脱「色」字一处"
"**本库未改**(无传本直证),仍在册待核。"),
("唯以山顶以篮与悬下",
"**用户 2026-09-21 判决「修正正确,保留」**(清单 #50,用户核对原书)——句有讹脱"
"(疑当作「唯以绠篮悬下」之类),本库**不臆补、照原样保留**;本项结项"
"(如原书另有文,请给字样)。"),
("每日是一至数二次十天为一疗程",
"**用户 2026-09-22 判决「原文如此,暂时保留」**(清单 #56,用户核对原书)——第 571 行"
"「…用抚顺市石油三厂生产的煤油成人用量 4~5 毫升,**每日是一至数二次十天为一疗程**」句有讹脱"
"(疑当作「每日一至二次,十天为一疗程」之类),**原书即作此,本库不臆补、照原样保留**;本项结项"
"(「暂」=日后如有新材料可再议;如原书另有文,给字样即据以订正)。"),
("鉴于上述情况",
"**用户 2026-09-21 判决「修正正确,保留」**(清单 #57,用户核对原书)→ ①已据判决改"
"「上**述**情况」(「种」「述」形近致误);②同条「**是基本问题**」语义未尽一处**本库未改**"
"(无拟正字),仍在册待核。"),
("并入驴马不用",
"**用户 2026-09-21 判决「修正正确,保留」**(清单 #59,用户核对原书)——①「并入驴马不用」:"
"**本库未改**——经核《唐本草》传本作「**驴马药亦用之**」(《纲目》硇砂条引《唐本草》"
"「硇砂柔金銀,可為焊藥…驢馬藥亦用之」),与本库旧拟「不入驴马药用」**语意相反**,"
"故**不据旧拟改动**、登记待原书用字;②「与陶弘景约同时的甄权」与本件上文「甄氏生于陶氏"
"去世后五年」自相矛盾一处**本库未改**(属作者行文之误,登记待核)。"),
("生河崖山坂之阴",
"**用户 2026-09-21 判决「修正正确,保留」**(清单 #61,用户核对原书)→ 已据判决改「河**崖**」"
"(《纲目》戎盐条传本作「生河崖山坂之陰土石間」);本项结项。"),
("主治呕啘",
"**用户 2026-09-21 判决「修正正确,保留」**(清单 #63,用户核对原书)→ ①已据判决改"
"「主治呕**啘**」(啘=干呕;《名医别录》竹茹条传本「主嘔啘,溫氣寒熱,吐血,崩中」);"
"②同项皂荚条「除咳嗽,囊结」已据判决改「**破咳嗽囊结**」(《本草经集注》皂荚条传本"
"「消穀,破咳嗽囊結」);本项结项。"),
("所炼制之卤碱",
"**用户 2026-09-21 判决「修正正确,保留」**(清单 #19,经核对原书:原书作「所炼制之卤碱」"
"「其具火体用之全」)→ **两处已据判决订正正文(生效)**;本项结项、移出存疑册。"),
("有毛有孔乃肺金之象",
"**用户 2026-09-21 判决「修正正确,保留」**(清单 #20,经核对原书:原书无第三个「有」字)→ "
"**已据判决订正正文(生效)**;本项结项、移出存疑册。"),
("张儒何玄",
"**用户 2026-09-21 判决「修正准确,保留修改」**(清单 #23,用户核对原书)——该项涉**夹注/标点**"
"(「张(仲景)儒、(何)晏玄(学)」),本库**不臆加标记、正文一字未动**;判决登记即"
"「本库读解成立(张属儒家、何属玄学,故非道教中人)」;原文照旧,本项结项。"),
("故谓之皂矾",
"**用户 2026-09-21 判决「修正准确,保留修改」**(清单 #33,用户核对原书)→ 已据判决**删衍「主」字**"
"(「故谓之皂矾」);本项结项、移出存疑册。"
"(附记:同句「绛矾可以染皂色」——传本《纲目》作「綠礬可以染皂色」;**本库未改**,登记待裁示。)"),
("纤维石膏",
"**用户 2026-09-21 判决「修正正确,保留」**(清单 #52,用户核对原书)→ 已据判决改「纤维**石膏**」"
"(矿物名;本条上文亦作「硫酸盐类矿物石膏」);本项结项。"),
("疆砾",
"**用户 2026-09-21 判决「原文无误,保留不修改」**(清单 #54,用户核对原书)——原书即作"
"「疆砾」「其是非非」,本库**不作改动**、疑点结项(日后如有新材料可再议)。"),
("《别录》谓石硫磺",
"第 397 行**源件脱文**(《别录》石硫黄条后半及收尾引号、《博物志》引文整段)——"
"**用户 2026-09-21 判决「回填」**(清单 #37,用户核对原书后给出脱落全文)→ 已据所给原文"
"**补入清洗版**(两段:①「冷癖在胁…及河西山,矾石液也。」;②「晋·张华《博物志》谓:"
"「凡水源有石硫黄,其水则温,或云神人所暖,主疗疾。」」),文末「邪气」后句号改逗号,"
"用字按本库归一(䘌疮/矾石);全篇引号 299/298 → **300/300**。**源件仍为脱文原样**"
"(01 层不改);本项结项、移出存疑册。"),
]
# ── F 类:体例登记(不校改)───────────────────────────────────────────
VERSION_NOTES = [
("金石药「名位」命名(35 品)",
"本章 35 品金石药均标「(X中Y)」名位。与底本《辅行诀》二十五味药精(金石对应品)"
"及十三种药逐品互校:**29 品相符**(青琅玕木中木、伏龙肝木中火、阳起石木中土、礜石木中金、"
"雄黄木中水、凝水石火中火、禹余粮火中土、硝石火中木、芒硝火中金、磁石火中水、赤石脂土中土、"
"石膏土中金、石钟乳土中水、云母土中木、石英土中火、石绿金中金、曾青金中土·火中木、"
"石胆木中火·水中木、白矾金中水、皂矾金中火、石硫磺金中木、滑石水中水、代赭石水中木、"
"丹砂水中火、黄土水中土、白垩水中金、铁落木中土·木中水、石蜜土中金·土中火、戎盐火中土);"
"**6 品底本无对应**(朴硝、卤碱、理石、姜石、硇砂、海蛤)——系作者拟补从火土同治论心病方"
"所用,其名位为作者自立。**名位重出**者:土中火(石英/理石)、金中金(石绿/硇砂)、"
"金中火(皂矾/硇砂)、土中土(赤石脂/海蛤),属拟补方别用之例,登记不改。"),
("标题内空格(体例保留)",
"源件标题内汉字间半角空格 **10 处**(第 1 行「第三章 五脏补泻金石方例 用药释义」、"
"第 503 行「第六节 从火土同治论心病金石 方例用药简释」及 7 个「第X节 」标题空格),"
"为「第X章 标题」之体例空格,**保留不改**(同第 1/2 章)。"),
("数字与汉字间半角空格",
"源件为 PDF/文本层导出,半角数字与汉字间带空格(**12 处**,如「或 64个黍粒大」"
"「含硅 42.93%」「150~200 摄氏度」「水 13%」)。本次按「句中误入空格」**从严删除**,"
"与第 2 章一致(第 2 章同例经用户 2026-09-20 判决「保持现状、不回改、亦不回补第 1 章」);"
"第 1 章清洗版尚存 1 处同类未清,**两章体例暂不统一**,待后续统一。"),
("引号收尾体例(原书如此)",
"本件「**”。**」(句号在引号外)19 处、「**。”**」(句号在引号内)202 处并用"
"(第 1 章 36/153,第 2 章 8/142),系原书引文体例之混用,**未作统一**;"
"另有「”,」26 处、「,”」3 处(第 1 章 62/2,第 2 章 39/2)同属体例。"),
("交叉引证",
"本件回指第 2 章 1 处:第 731 行「见第二章第二节·五」——对应第 2 章清洗版"
"「五、心火果杏、杏核仁」(序号、条目名逐字吻合,已作自检项)。"
"另有本书外著作 2 处(第 345/471 行「详见《伤寒论阴阳图说》」,系作者另一著作,非本库藏品)。"),
("用字体例·「硫磺」与「硫黄」并见",
"本件条目题名与作者行文作「**石硫磺**」(第 393/397 行),引《本经》则作「**石硫黄**」"
"(第 395 行「《本经》谓石硫黄」)——引文照录、行文从本书用字,属引文体例,登记不改"
"(检索时两形须并用)。"),
("用字体例·「泄癖」与「泄澼」并见",
"第 415 行引《本经》滑石作「泄**澼**」,第 429 行作者行文作「泄**癖**」;"
"第 1 章《别录》黄连条引文亦作「泄癖」(该章未改)。两形并见,本轮一律不发,"
"登记待核(见存疑册);**检索须两形并用**。"),
("两章用字待统一(★)",
"①「**雷敦/雷斅**」:本件据《纲目》传本订正为「雷斅」,第 1 章清洗版同形(雷敦)未改;"
"②「**白截浆/白酨浆**」:本件据第 2 章用户 2026-09-20 判决(原书作「白酨浆」)订正,"
"第 1 章清洗版尚存「白截浆」5 处未改;③「**瓜蒌/栝蒌**」:本件据本库用字统一为「栝蒌」,"
"第 1 章全部作「栝蒌」。→ **2026-09-21 判决(清单 #7「订正维持」)**:三项**一律维持本件订正**"
"(雷斅/白酨浆/栝蒌),**第 1 章不同办、未动**(第 1 章清洗版同处仍作「雷敦」「白截浆」5 处);"
"本项**已决、结项**——日后不得据「第 1 章作某」回改本件,亦不得据本件回改第 1 章。"),
("引书节略体例(照录不改)",
"本章引《本经》《别录》多有节略(如《别录》雄黄条前脱「味甘,大」、《别录》滑石条"
"「令人利」后脱「中」、《本经》青琅玕条「生蜀郡平泽」并合两书),系作者引书之常,"
"**一律照录不改**(第 2 章同例)。"),
("★源件标题层级已就地优化(明文例外·第三例;2026-09-22)",
"`01_来源数据/《…》第3章.md` 原样:章为「#」,节/条目/子目**全部为「##」**(未分级);"
"另有 2 行条目题名**未标井号**(第 133/311 行)。"
"**2026-09-21 判决(清单 #2「保留修正结果」)**=清洗版重建层级维持、源件一字未动;"
"**2026-09-22 用户另下明示指令「源件标题层级就地优化」**,遂执行 "
"`05_脚本工具/13_retitle_src_ch3.py --apply`(只改井号、正文逐行校验未动):"
"**源件 65 行标题由「#/##」降为章2/节3/条目4/子目5**,源件 md5 `2f2f0301…` → `41363b0d…`;"
"改动前逐字节快照=`01_来源数据/《…》第3章_层级优化前快照_20260922.md`(md5 `2f2f0301…`,可回退);"
"**重跑本脚本后清洗版 md5 未变(`5f1fb57c…`)**——层级层与清洗层同规则之证明。"
"此为第 1 章(2026-09-17)、第 2 章(2026-09-20)之后**★明文例外之第三例**;"
"「01_来源数据不可修改」仍为常态,不得据本条推及他件。"),
("清洗版补标条目题名 2 处",
"源件第 133 行「三、硝石(即火硝,火中木)、朴硝(即水硝,水中木、水中火)、芒硝(火中金)、"
"卤碱(火中火、火中木)」与第 311 行「一、绿青(即石绿,金中金)、曾青(金中土、火中木)、"
"石胆(木中火、水中木)」为题名性质(与本节他条目同式)而源件未标井号;"
"清洗版补标为四级条目,**源件保持原样**。"),
("★用户 2026-09-21/22 判决登记(第 1–6 批;**本章 64/64 判决已闭环**)",
"**判决词表(用户重申)**:「**保留**」=**本库修正经确认准确无误、维持修正(不回流)**;"
"「**原文无误**」=原书原文正确、不需要修正(本库如已改则回改)。"
"**第 1 批(#1–#3)**:三处待决(①逐条判决清单 ②C 类「原书用字」核定 ③源件标题层级是否就地优化)"
"**一律批复「保留修正结果」**;**源件(01_来源数据/)一字未动**(层级重建只落在清洗版;"
"如日后要同第 1/2 章就地优化源件,须另下明示指令,脚本 13_retitle_src_ch3.py 备好、默认 dry-run)。"
"**第 2 批(#4–#20,用户逐条核对原书)**:判「改」2(相附→**相符**、西元→**公元前**277年)、"
"「修正正确,保留」9(雷斅/**腹中坚癖**/䘌疮/云笈七签·薰陆香/LaTeX/标题补标/引号范围/**结出**/"
"衍「的」与**具**/衍「有」)、「原文如此·但修正有理·确认修正」1(云芨七莶/陆薰香)、"
"「原书即作『礐石』」1、**「原文无误/原文如此,暂不修改/暂时保留」3**(惮散/草药木火中火/重垒——"
"原书即作此,本库**不作改动**、疑点结项)、「订正维持」1(跨章用字:本件订正维持,第 1 章不同办)。"
"据此**正文改 7 处**(首次动正文,清洗版 md5 `2c5378bd…` → 现 md5 见报告首部)。"
"⚠ **★原书印刷之误·本库订正(第三类)** 现有 4 条(礐石/磐石/云芨七莶/陆薰香)——"
"**清洗版与印刷本有意不一致、不得据「原书如此」回流**;**录入讹误** 9 条(原书作正形、"
"清洗版与印刷本一致,可直接以印刷本复核)。**C 类余 27 条之「原书用字」待核原书**,"
"未核定前按「本库订正·保留修正」处理、不得回流。**当时清单余 44 条(#21–#64)待判决**。"
"**第 3 批(#21–#36「修正准确,保留修改」)· 第 4 批(#37「回填」)· 第 5 批(#38–#53/#57–#64"
"「修正正确,保留」,#54/#55「原文无误,保留不修改」)· 第 6 批(2026-09-22,#56「原文如此,"
"暂时保留」)后:64/64 全部判决、本章闭环、存疑册清零**。"),
("本件无断行接合(B 类)项",
"经逐段扫描(段末无收尾标点者 2 处:第 105 行、第 153 行),其下一段均另起新句,"
"属**段末脱句号**而非同句断开,故本件 B 类为 0,二处归 D 类补句读(见本次修正表);"
"另有 1 处**源件脱文**(第 397 行《别录》石硫黄条)——**已据用户 2026-09-21 判决「回填」"
"补入清洗版**(源件仍原样),引号 299/298 → 300/300。"),
("★《纲目》曾青条引文用字(层青)已定案(2026-09-22)",
"本件曾青条引《纲目》释名作「故曰**层青**也」,传本《本草纲目》曾青条作「故曰**曾青**也」。"
"**用户 2026-09-22 判「原文如此,暂保留」**——原书即作此,本库**不改、疑点结项**"
"(「暂」=日后如有新材料可再议;如原书另有文,给字样即据以订正)。"
"**检索须用原字「层青」**(以传本「曾青」不能命中本句)。"
"同类**未裁示**者:《纲目·绿矾》「**绛**矾可以染皂色」(传本「绿矾」)——照原样保留、待裁示。"),
("★C 类余 11 条「原书用字」分类暂不钉定(2026-09-22)",
"C 类 63 条中已钉定 **52 条**(录入讹误 48 · ★原书印刷之误·本库订正 4),**余 11 条**之分类"
"(录入讹误/印刷之误)**用户 2026-09-22 判「暂时保留」——暂不钉定、正文一律不改**;"
"维持统一按「本库订正·保留修正」处理、**任何情形下不得回流**。日后核出可逐条钉定"
"(只改「原书用字」栏与本登记项,不影响现有文本)。"),
]
# ── 自检:35 品金石药「名位」⇄ 底本二十五味药精/十三种药 ──────────────
# (节, 清洗版条目题名(含名位), 底本依据原文, 判定)
ITEMS35 = [
("第一节 肝木辛味门", "一、青琅玕(木中木)", "味辛皆属木,桂 琅玕为之主", "✅ 相符"),
("第一节 肝木辛味门", "二、伏龙肝(木中火)", "生姜 伏龙肝为火", "✅ 相符"),
("第一节 肝木辛味门", "三、阳起石(木中土)", "附子 阳起石为土", "✅ 相符"),
("第一节 肝木辛味门", "四、礜石(木中金)", "细辛 礜石为金", "✅ 相符(源题讹「礐石」,本轮订正)"),
("第一节 肝木辛味门", "五、雄黄(木中水)", "干姜 雄黄为水", "✅ 相符"),
("第二节 心火咸味门", "一、凝水石(火中火)", "味咸皆属火,丹皮 凝水石为之主", "✅ 相符"),
("第二节 心火咸味门", "二、禹余粮(火中土)", "大黄 禹粮石为土", "✅ 相符"),
("第二节 心火咸味门", "1. 火硝(火中木)", "旋覆花 硝石为木(硝石即火硝)", "✅ 相符"),
("第二节 心火咸味门", "2. 朴硝(水中木、水中火)", "底本二十五味药精无朴硝",
"○ 作者拟补(拟补方「大泻心散…朴硝…」);名位系作者自立,且本条正文自述其理"),
("第二节 心火咸味门", "3. 芒硝(火中金)", "葶苈子 芒硝为金", "✅ 相符"),
("第二节 心火咸味门", "4. 卤碱(火中火、火中木)", "底本二十五味药精无卤碱",
"○ 作者拟补(拟补方「大补心散…卤硷…」);名位系作者自立(本条正文以兑卦刚卤立说)"),
("第二节 心火咸味门", "四、磁石(火中水)", "泽泻 磁石为水", "✅ 相符"),
("第三节 脾土甘味门", "一、赤石脂(土中土)", "味甘皆属土,人参 赤石脂为之主", "✅ 相符"),
("第三节 脾土甘味门", "二、石膏(土中金)", "甘草 石膏为金", "✅ 相符"),
("第三节 脾土甘味门", "三、石钟乳(土中水)", "茯苓 乳石为水(乳石=钟乳石)", "✅ 相符"),
("第三节 脾土甘味门", "四、云母(土中木)", "薯蓣 云母为木", "✅ 相符"),
("第三节 脾土甘味门", "五、石英(土中火)", "甘草炙 石英为火", "✅ 相符"),
("第四节 肺金酸味门", "1. 石绿(金中金)", "味酸皆属金,麦门冬 石绿为之主", "✅ 相符"),
("第四节 肺金酸味门", "2. 曾青(金中土、火中木)",
"五味子 曾青为土(金中土);十三种药「五味子为金中土,又为火中木」", "✅ 相符"),
("第四节 肺金酸味门", "3. 石胆(木中火、水中木)",
"十三种药「淡豆豉为木中火,又为水中木」(石胆与淡豆豉同位)", "✅ 相符"),
("第四节 肺金酸味门", "1. 白矾(金中水)", "枳实 白矾为水", "✅ 相符"),
("第四节 肺金酸味门", "2. 皂矾(金中火)", "萸肉 皂矾为火", "✅ 相符"),
("第四节 肺金酸味门", "三、石硫磺(金中木)",
"芍药 硫黄为木(金中木);本条正文「故《辅行诀》称其为金中木药」",
"✅ 相符(源题讹「金中火」,本轮订正)"),
("第五节 肾水苦味门", "一、滑石(水中水)", "味苦皆属水,地黄 滑石为之主", "✅ 相符"),
("第五节 肾水苦味门", "二、代赭石(水中木)", "黄芩 代赭石为木", "✅ 相符"),
("第五节 肾水苦味门", "三、丹砂(水中火)", "黄连 丹砂为火", "✅ 相符"),
("第五节 肾水苦味门", "四、黄土(水中土)", "术 黄土为土", "✅ 相符"),
("第五节 肾水苦味门", "五、白垩(水中金)", "竹叶 白垩土为金", "✅ 相符"),
("第六节 从火土同治论心病金石 方例用药简释", "一、铁落(木中土,木中水)",
"十三种药「通草为木中土,又为木中水」(铁落与通草同位)", "✅ 相符"),
("第六节 从火土同治论心病金石 方例用药简释", "二、石蜜(土中金,土中火)",
"十三种药「升麻为土中金,又为土中火」(石蜜与升麻同位)", "✅ 相符"),
("第六节 从火土同治论心病金石 方例用药简释", "三、理石(土中火)",
"底本二十五味药精无理石(土中火之位属石英)",
"○ 作者拟补(拟补方「小补心散…理石…」);与石英同为土中火,名位重出(体例登记)"),
("第六节 从火土同治论心病金石 方例用药简释", "四、姜石(水中土,水中金)",
"底本二十五味药精无姜石",
"○ 作者拟补(拟补方「小补心散…姜石…」);本条正文以碳酸氢钙凝聚、黏土附着立说"),
("第六节 从火土同治论心病金石 方例用药简释", "五、硇砂(金中金,金中火)",
"底本二十五味药精无硇砂",
"○ 作者拟补(拟补方「大补心散…硇砂…」);与石绿(金中金)、皂矾(金中火)名位重出"),
("第六节 从火土同治论心病金石 方例用药简释", "六、海蛤(土中土)",
"底本二十五味药精无海蛤",
"○ 作者拟补(拟补方「小补心散:海蛤 理石 雄黄 姜石各三两」);与赤石脂(土中土)名位重出"),
("第六节 从火土同治论心病金石 方例用药简释", "七、戎盐(火中土)",
"十三种药「戎盐为火中土」", "✅ 相符"),
]
# ── 待核对清单:固定条目表(锚=清洗版唯一子串;行号由脚本定位)────────
CHECK_ITEMS = [
# (类型, 锚, 问题, 依据, 建议)
("版式清理确认", "《禹贡》《周官》列其土产",
"行尾空格 **303 行**(正文段落末尾普遍带 1 个半角空格)已逐行删除",
"源件为 PDF/文本层导出,段落末尾带半角空格(第 1/2 章同例)",
"复核;如欲保留可回改(脚本 A 类规则)"),
("版式清理确认", "正品钉头赭石",
"句中误入半角空格:**汉字↔汉字 正文 32 处**(标题内 10 处体例保留)+ **数字↔汉字 12 处**,"
"并全角标点旁空格,已全部删除",
"扫描/文本层导出残留;与底本 03_clean_yinshua.py「句中误入空格」同例;"
"数字两侧留空同第 2 章从严(第 1 章存 1 处未清,两章暂不统一)",
"复核;数字两侧留空如欲保留可回改(详报告第二节逐处清单)"),
("版式清理确认", "其最佳浸出温度为100度",
"LaTeX 残留「$41\\% \\sim 45\\%$」已还原为「**41%~45%**」;半角「~」(4~5 毫升)已改全角「~」",
"PDF 公式化残留,读作数据还原(同第 2 章「$7 \\sim 10$」→「7~10」例)",
"复核"),
("标题修复确认", "三、硝石(即火硝,火中木)",
"源件此行**未标井号**(正文形式),清洗版补标为四级条目题名",
"与本节他条目(一、凝水石/二、禹余粮/四、磁石)同式,且其下「1.~4.」子目正附于此条",
"复核;如原书即作正文,可回改(源件保持原样)"),
("标题修复确认", "一、绿青(即石绿,金中金)",
"源件此行**未标井号**,清洗版补标为四级条目题名",
"与本节他条目(二、矾石/三、石硫磺)同式,且其下「1.石绿/2.曾青/3.石胆」子目附于此条",
"复核;源件保持原样"),
("修正确认", "四、礜石(木中金)",
"本条 14 处订正:①题名「礐石」→「**礜石**」;②正文 **11 处**「磐石」→「礜石」"
"(第 65/67×2/69/71×2/73×3/79/91 行);③「一名固阳石」→「**一名固羊石**」;"
"④标点「生温。熟热」→「生温、熟热」(标点类另列)",
"**底本内证**:二十五味药精「味辛皆属木…细辛**礜石**为金」(木中金之位);"
"本条正文自述「磐石为剧毒药,含砷化物,是一种砒石」;《名医别录》传本作「一名白礜石」"
"「一名固羊石」;底本清洗(03_clean_yinshua.py)已判「磐石→礜石」同例",
"复核;如原书即作「礐石/磐石」,可即时回改"),
("修正确认", "雷斅",
"「雷敦」→「**雷斅**」(本条 1 处)",
"《本草纲目》伏龙肝条引「斅曰:凡使勿误用灶下土…」(雷斅《雷公炮炙论》);"
"⚠ 第 1 章清洗版同形未改,**两章用字待统一**",
"复核;如欲与第 1 章一致(不改),可即时回改"),
("修正确认", "疥虫,䘌疮",
"「鳖疮」→「**䘌疮**」(本条 1 处)",
"《名医别录》雄黄条传本作「主治疥虫,䘌疮,目痛…」;「䘌」为虫蚀之义。"
"⚠ 检索须用「䘌」(U+4618)",
"复核"),
("修正确认", "云笈七签",
"本条 2 处:「云芨七莶」→「**云笈七签**」;「陆薰香」→「**薰陆香**」",
"北宋张君房编《云笈七签》卷七十七方药部载「九真中经四镇丸」,与本条所引全同,"
"其中正作「**薰陆香**一两以和当归,薰五脏内」(薰陆香即乳香)",
"复核"),
("修正确认", "采无时。石韦为之使",
"「探无时」→「**采无时**」(第 235 行);同字例另见第 441 行(代赭条)",
"全篇作「采无时」者 19 处,作「探」者仅此 2 处;「采」「探」形近致误",
"复核"),
("修正确认", "萧绎",
"「肖绎」→「**萧绎**」2 处、「肖衍」→「**萧衍**」1 处",
"**史实**:梁元帝姓萧名绎、梁武帝姓萧名衍(同句「武帝萧衍之第七子」);「肖」「萧」形近致误",
"复核"),
("修正确认", "皆味甘气温",
"本条 2 处:「皆昧甘气温」→「**皆味甘气温**」;「何宴」→「**何晏**」",
"《本经》紫、白石英并作「味甘,温」(本条上文即引「味甘,温」);"
"本件第 5 行引「(何晏语)」正作「何晏」",
"复核"),
("修正确认", "生成特性",
"「生成持性」→「**生成特性**」(曾青条)",
"本条下文「作为其具有土之性的推理」「具有特殊的神灵之气」;「特」「持」形近致误",
"复核"),
("修正确认", "越巂",
"「越嵩」→「**越巂**」(曾青条引《别录》1 处)",
"《名医别录》曾青条传本作「生蜀中及越巂,采无时」",
"复核"),
("修正确认", "一名羽涅",
"「羽硷」→「**羽涅**」(矾石条引《本经》1 处)",
"《本经》矾石(涅石)传本作「一名羽涅」(《纲目》释名「涅石、羽涅、羽泽」)",
"复核"),
("修正确认", "石硫磺(金中木)",
"条目题名名位「(金中火)」→「(**金中木**)」(1 处)",
"**底本内证**:二十五味药精「芍药**硫黄为木**」(金中木);本条正文自述「故《辅行诀》称其为"
"金中木药」,第 409 行「硫黄与草木金中木药芍药」;第 1 章「三、芍药(金中木)」——三处内证一致",
"复核;如原书题名即作「金中火」,可即时回改"),
("修正确认", "血痹血瘀",
"「血瘅血瘀」→「**血痹血瘀**」;同条「探无时」→「采无时」(见上)",
"《名医别录》代赭条传本作「除五脏血脉中热,血痹,血瘀」",
"复核"),
("修正确认", "故宅",
"丹砂条 2 处:「居其做宅」→「**居其故宅**」;「若俗长生久视」→「**若欲长生久视**」",
"《抱朴子·内篇》述临沅廖氏丹井事作「他人居其故宅」;"
"《纲目》灵砂条引青霞子作「若欲长生久视,保命安神」",
"复核"),
("修正确认", "黄连末",
"黄土条 1 处:「黄连未」→「**黄连末**」",
"《纲目》所引《肘后方》内痔方「朝阳黄土、黄连末、皮硝各一两」,三味并列皆粉末"
"(第 2 章「蘖未→蘖末」同例,经用户 2026-09-20 判决)",
"复核"),
("修正确认", "从火土论心病方中之草木药通草",
"「从**土火**论心病方」→「从**火土**论心病方」(1 处,倒文)",
"**本库内证**:本件作「从火土论心病」者 6 处,本节节题亦作「从火土同治论心病」",
"复核"),
("修正确认", "相龃龉",
"「相龌龊」→「相**龃龉**」(理石条 1 处)",
"「龌龊」为污秽之义,与「其火字与寒甚相…」不伦;「龃龉」=上下齿不相值,"
"引申为相抵触、不相合,正合文义;二字形近致误",
"复核"),
("修正确认", "呕吐痰涎",
"姜石条 4 处:「哎吐痰涎」→「**呕吐痰涎**」;「管经推广」→「**曾经推广**」;"
"「胸痒之需」→「**胸痹之需**」;「始终,不敢」→「始终不敢」(标点)",
"「呕」「哎」同为口部形近;「曾经」文义唯一;同句下文即作「亦不堪用之治疗**胸痹**」,"
"全段皆论胸痹(张锡纯治胸痹方)",
"复核"),
("修正确认", "羊踯躅",
"「阳踯躅」→「**羊踯躅**」(硇砂条引《抱朴子》1 处)",
"《纲目》硇砂条引《抱朴子》伏硇药作「羊踯躅」(即闹羊花,本草正名);「羊」「阳」形近致误",
"复核"),
("修正确认", "白酨浆",
"海蛤条 1 处:「瓜蒌」→「**栝蒌**」;戎盐条 1 处:「从火土论心**治心**病方」→"
"「从火土论心病方」(衍字);硇砂条「白截浆」→「**白酨浆**」",
"**本库内证**:第 1 章作「栝蒌」17 处(含条目名)、底本作「栝楼」;平行文例 6 处皆作"
"「从火土论心病方」;第 2 章「白截浆→白酨浆」经用户 2026-09-20 判决(原书作「白酨浆」)",
"复核;「白截浆」如欲与第 1 章一致,可即时回改(两章用字待统一)"),
("修正确认", "荠苨",
"第七节其他用药 7 处:「荠尼」→「**荠苨**」(桔梗);「乌翣」→「**乌扇**」、"
"「乌妾」→「**乌翣**」(射干);「猥猪矢」→「**猳猪屎**」(猪苓);「地营」→「**地菅**」(茅根);"
"「氏东」→「**氐冬**」(款冬花);「採根」→「**采根**」(繁体残留)",
"《名医别录》/《本经》传本逐条可校:桔梗「一名荠苨」;射干《本经》「一名乌扇,一名乌蒲」、"
"《别录》「一名乌翣,一名乌吹」;猪苓《本经》「一名猳猪屎」;茅根《别录》「一名地菅,一名地筋」;"
"款冬花《别录》「一名氐冬」;「採」为未转换之繁体字",
"复核"),
# —— 原书核对(E 类:本次一律未改)——
("原书核对", "公元前277年",
"「**公元前277年**,秦国即置蜀郡」——原「西元277年」已据判决改正文",
"**用户核对原书(2026-09-21)**:原书作「公元前277年」(公元 277 年已入西晋,与「秦国即置蜀郡」之文不合)",
"**已改**(用户核对原书)"),
("原书核对", "时间相符",
"「与海产琅玕传入我国的时间**相符**」——原「相附」已据判决改正文",
"**用户核对原书(2026-09-21)**:原书作「相符」;本件「相附」为录入形近之误(文义:传入时间相合)",
"**已改**(用户核对原书);如另有出入可回改"),
("原书核对", "腹中坚癖",
"《本经》礜石「…风痹,**腹中坚癖**,邪气,除热」——原「怀腹中坚」已据判决改正文",
"**用户核对原书(2026-09-21)**:原书作「腹中坚癖」(《本经》传本同;「怀」为衍讹、「癖」原脱)",
"**已改**(用户核对原书)"),
("原书核对", "火惮散炎上显明之性",
"「而具火惮散炎上显明之性」——「惮散」不可通",
"疑当作「火性悍散」(悍=勇猛急疾)",
"**原书即作「惮散」,本库不作改动**(2026-09-21 判决「原文无误,暂不修改」——结项)"),
("原书核对", "草药木火中火牡丹皮",
"「凝水石与草药木火中火牡丹皮」——「草药木火中火」有衍讹",
"本件平行文例皆作「草木火中火药××」(第 129/157/175/211 行)",
"**原书即作「草药木火中火」,本库不作改动**(2026-09-21 判决「原文无误,暂时保留」——结项)"),
("原书核对", "外有壳重垒",
"禹余粮条「外有壳重垒」疑当作「重叠」;「无砂者佳」一作「无沙者佳」",
"《纲目》禹余粮条引弘景语;疊/壘 形近",
"**原书即作「重垒」,本库不作改动**(2026-09-21 判决「原文如此,暂时保留」——结项)"),
("原书核对", "结出细芒者",
"《纲目》时珍语「煎炼**结出**细芒者亦名芒硝」——原「结也」已据判决改正文",
"**用户核对原书(2026-09-21)**:原书作「结出」;同段下文平行句作「结出细芒者」「结出马牙者」",
"**已改**(用户核对原书)"),
("原书核对", "《别录》所谓芒硝者是也;",
"《纲目》朴硝条时珍语之**引号范围**——已据判决改为「…芒硝者是也**;**川、晋之硝…殊无指归**。**」"
"(引号移至该段之末、此处句读改分号)",
"**用户核对原书(2026-09-21)**:原书时珍语一气贯下、收尾引号在该段之末(《纲目》传本此处分号作"
"「者是也;川晉之硝」)",
"**已改**(用户核对原书;非增字,引号计数不变)"),
("原书核对", "其吸水性强",
"赤石脂条「吸水其性强」语序倒错,当作「其吸水性强」;同条「介于上述理由」疑当作"
"「基于上述理由」",
"「介」「基」形近;文义",
"核原书"),
("原书核对", "石英明澈如水",
"石英条「石英明沏如水」疑当作「明澈」;同条「似与石英有火性之说不谋」疑脱「而合」"
"或当作「相谋」",
"同条第 297 行作「其质明澈如水晶」",
"核原书"),
("原书核对", "甚难得而贵",
"曾青条引弘景「甚难是之而贵」疑当作「甚难得而贵」;同条「或去其生从实至空」"
"「去」疑当作「云」;「化为输石」疑当作「鍮石」",
"《纲目》曾青条传本「甚難得而貴」;鍮石=黄铜(丹家常用字)",
"核原书"),
("原书核对", "都是由铜绿经久变化而成",
"石绿条「诸青都是在铜绿经久变化而成」疑脱「由」字",
"文义(「都是由…而成」)",
"核原书"),
("原书核对", "桐君采灵",
"石胆条「桐君采灵谓其味辛」——书名疑为《桐君采药录》之讹脱",
"本件第 329 行引吴普作「桐君:辛,有毒」;《桐君采药录》见底本「依《神农本经》及"
"《桐君采药录》」",
"核原书"),
("原书核对", "均可治理",
"白矾条「与谷物酿制品酢,均可治理。」——「治理」孤立无宾语,疑脱文",
"文义;不敢臆补",
"核原书"),
("原书核对", "张氏治疸之硝石矾石散",
"皂矾条「张氏治疽之硝石矾石散」——「治疽」疑当作「治疸」(1 处;同句后文另见"
"「硝石矾石散」,不复带此二字)",
"《金匮要略》硝石矾石散主治黑疸(女劳疸);「疸」「疽」形近",
"核原书"),
("原书核对", "外家谓之阳侯",
"石硫磺条引《纲目》「外家谓之侯」疑脱「阳」字",
"《纲目》石硫黄条传本作「外家謂之陽侯,亦曰黃牙」",
"核原书"),
("原书核对", "泄癖",
"滑石条「滑石可治泄癖癃闭积聚留结等」——《本经》滑石条作「泄澼」,两形并见",
"《别录》传本黄连条作「久下泄澼」;第 1 章《别录》黄连条引文作「泄癖」(该章未改)",
"核原书定用字(本轮一律不发)"),
("原书核对", "司空张岂",
"黄土条引《本草拾遗》「司空张岂」(南齐明帝时 494~498 年)——人名/朝代可疑",
"南齐明帝时无「张岂」任司空之可考者(《本草拾遗》所引「张司空」多指晋司空张华)",
"核原书"),
("原书核对", "则钢浸汁更谓何物",
"铁落条引苏恭「则钢浸汁更谓何系」疑当作「何物」;同段「乃是据其以青属木」疑脱「色」字",
"《纲目》铁落条传本作「更謂何物」;下文「《别录》谓其味甘属土」为对文",
"核原书"),
("原书核对", "唯以山顶以篮与悬下",
"石蜜条引张华《博物志》「唯以山顶以篮与悬下」句有讹脱",
"文义(疑当作「唯以绠篮悬下」之类);不敢臆补",
"核原书"),
("原书核对", "每日是一至数二次十天为一疗程",
"姜石条「每日是一至数二次十天为一疗程」句有讹脱",
"文义(当作「每日一至二次,十天为一疗程」之类);不敢臆补",
"核原书"),
("原书核对", "鉴于上述情况",
"姜石条「鉴于上种情况」疑当作「上述情况」;同条「是基本问题」语义未尽",
"「种」「述」形近;文义",
"核原书"),
("原书核对", "并入驴马不用",
"硇砂条引《唐本草》「并入驴马不用」句不可通,疑当作「不入驴马药用」;"
"同条「与陶弘景约同时的甄权」与本件第 89 行自相矛盾",
"《唐本草》传本;本件第 89 行「甄氏生于陶氏去世后五年」(甄权 541~643,晚于陶氏约一世)",
"核原书"),
("原书核对", "生河崖山坂之阴",
"戎盐条引《疏证》「生河洼山坂之阴土石间」疑当作「河崖」",
"《纲目》戎盐条传本作「生河崖山坂之陰土石間」",
"核原书"),
("原书核对", "主治呕啘",
"第七节竹茹条「主治呕呃」——《别录》传本作「呕啘」(啘=干呕);"
"同节皂荚条「除咳嗽,囊结」传本作「破咳嗽囊结」",
"《名医别录》传本",
"核原书"),
("原书核对", "所炼制之卤碱",
"卤碱条「**所炼制之**卤碱」(原衍「的」)与「其**具**火体用之全」(原「俱」)——两处已据判决改正文",
"**用户核对原书(2026-09-21)**:原书作「所炼制之卤碱」「其具火体用之全」(具=具备)",
"**已改**(用户核对原书,两处一并)"),
("原书核对", "有毛有孔乃肺金之象",
"磁石条「**有毛有孔**乃肺金之象」——原行文衍一「有」字,已据判决改正文",
"**用户核对原书(2026-09-21)**:原书无第三个「有」字(上文「有毛有孔」已为并列)",
"**已改**(用户核对原书)"),
("原书核对", "张儒何玄",
"石英条「张儒何玄,非道教中人」文极简省,疑当作「张(仲景)儒、(何)晏玄(学)」",
"本段论五石散方:葛洪、孙思邈为道教中人,张仲景属儒家、何晏属玄学,故「非道教中人」",
"核原书(是否原有夹注/标点)"),
("原书核对", "故谓之皂矾",
"皂矾条引《纲目》「绛矾可以染皂色,故主谓之皂矾」疑衍「主」",
"《纲目·绿矾》传本作「故謂之皂礬」",
"核原书"),
("原书核对", "纤维石膏",
"理石条「为硫酸盐类矿物石膏中的纤维膏」疑当作「纤维石膏」",
"矿物名(纤维石膏);本条上文亦作「硫酸盐类矿物石膏」",
"核原书"),
("原书核对", "疆砾",
"姜石条「则为疆砾是也,俗作疆蛎」疑当作「礓砾/礓䃯」;同条「其是非非」疑衍一「非」字",
"《纲目》姜石条引邵伯温语(礓砾=砂石);文义",
"核原书"),
("原书核对", "《别录》谓石硫磺",
"**源件脱文**:该段止于「主治心腹积聚,邪气 。」,脱《别录》石硫黄条后半及收尾引号、"
"并脱《博物志》引文一整段(全篇引号 299/298 之差由此而来)——**已据用户所给原书文字回填**",
"**用户核对原书(2026-09-21)**:用户给出脱落全文(冷癖在胁…矾石液也。/晋·张华《博物志》谓"
"「凡水源有石硫黄,其水则温,或云神人所暖,主疗疾。」);《名医别录》石硫黄条传本正作"
"「療心腹積聚,邪氣冷癖在脅,欬逆上氣…下部䘌瘡,止血,殺疥蟲。生東海牧羊山谷中及泰山、"
"河西山,礬石液也」",
"已回填(清洗版补入;**源件仍为脱文原样**);引号 299/298 → 300/300"),
# —— 体例确认(F 类)——
("体例确认", "见第二章第二节·五",
"本件回指第 2 章交叉引证 1 处(第 731 行「见第二章第二节·五」),与第 2 章清洗版条目"
"「五、心火果杏、杏核仁」逐字吻合",
"第 2 章清洗版结构索引",
"确认引证序号无误(现为照录)"),
("体例确认", "味小碱",
"引号收尾体例:「”。」(句号在引号外)19 处、「。”」202 处并用(第 1 章 36/153、"
"第 2 章 8/142),系原书体例,**未作统一**",
"三章计数对照(本件报告 §八)",
"确认是否保持原样(现为保持)"),
("体例确认", "第三章 五脏补泻金石方例 用药释义",
"标题内汉字间半角空格 10 处(章题、第 503 行节题及 7 个节题)**体例保留**,未并入 A 类清理",
"「第X章 标题」之体例空格(同第 1/2 章;第 2 章 A 类计数已单列标题内 6 处)",
"确认(现为保留)"),
("体例确认", "理石以土中火名之",
"**名位重出**:土中火(石英/理石)、金中金(石绿/硇砂)、金中火(皂矾/硇砂)、"
"土中土(赤石脂/海蛤)——均为作者拟补从火土同治论心病方用药,名位系作者自立,"
"与底本二十五味药精不构成一一对应",
"底本二十五味药精与十三种药(本件报告 §五 互校表)",
"确认是否保持原样(现为保持、登记不改)"),
("体例确认", "雷斅",
"跨章用字差异 3 项:①雷敦/雷斅(第 1 章同形未改);②白截浆/白酨浆(第 1 章存 5 处未改,"
"本件据第 2 章用户 2026-09-20 判决订正);③瓜蒌/栝蒌(第 1 章全作栝蒌,本件据本库用字统一)",
"第 1 章清洗版、第 2 章清洗版与用户 2026-09-20 判决记录",
"确认:本件订正是否维持;第 1 章是否同办回改(现为本件订正、第 1 章未动)"),
("体例确认", "五脏补泻金石方,是陶氏在择录",
"`01_来源数据/《…》第3章.md` 原节/条目/子目全为「##」(未分级),另有 2 行题名未标井号;"
"**2026-09-22 用户明示指令后就地优化**(65 行标题降级,源件 md5 `2f2f0301…` → `41363b0d…`,"
"留快照可回退);清洗版同步重建层级并补标 2 处题名",
"README「01_来源数据不可修改」之★明文例外(第 1/2 章先例);脚本 13_retitle_src_ch3.py --apply",
"**已执行**(2026-09-22 用户指令;重跑 12 后清洗版 md5 未变,两层一致)"),
("体例确认", "饮此水而得寿",
"「原书用字」逐条核定(C 类 40 条):印刷之误(本库订正、不得回流)/录入讹误"
"(原书不误)——本件为首轮清洗,**尚未核定**,一律暂标「待核原书」",
"第 1 章 2026-09-17、第 2 章 2026-09-20 同项核定先例",
"请按批一次性核定(可仿第 2 章:如「某几条为录入讹误,余为印刷之误」)"),
]
# ── G 类:人工核验判决记录(编号=待核对清单 #)────────────────────────
# 判决词汇同第 1/2 章:改 / 无误 / 保留 / 暂留待核 / 回填脚注 / 去注脚
# ── 判决(用户 2026-09-21 两批批复)──────────────────────────────────
# 判决词表(用户 2026-09-21 重申):**「保留」=本库修正经确认准确无误、维持修正(不回流)**;
# 「原文无误」=原书原文正确、不需要修正(本库如已改则回改)。
# 第 1 批(#1–#3):就助手三处待决**一律「保留修正结果」**。
# 第 2 批(#4–#20):用户逐条核对原书后给出判决(改/修正正确·保留/原文无误·暂不改/
# 原文如此·但修正有理·确认修正/原书即作某形)。
# 第 3 批(#21–#36):「修正准确,保留修改」——据判决改正文 9 处、
# 判决登记·本库无改动 3 条、维持原有修正 7 条。
# 第 4 批(#37):判「回填」——据用户所给原书脱落文字补入《别录》石硫黄条后半与
# 《博物志》引文一段(引号 299/298 → 300/300)。
# 第 5 批(#38–#53/#57–#64):「修正正确,保留」——据判决改正文 7 处、登记·本库无改动 4 条、
# 维持原有修正 10 条、体例确认 4 条;#54/#55 判「原文无误,保留不修改」(不改动)。
# 第 6 批(#56;用户 2026-09-22):判「**原文如此,暂时保留**」——姜石条句有讹脱,
# 原书即作此,本库**不作改动、疑点结项**(「暂」=日后如有新材料可再议)。
# **至此 64/64 全部判决,本章闭环。**
VERDICTS = {}
VERDICT_HEAD = "**用户 2026-09-21**"
N_FIX = VERDICT_HEAD + "(第 1 批):判「**保留修正结果**」——该项修正经确认**准确无误**、维持本库修正(**不回流**)。"
N_TIXI = VERDICT_HEAD + "(第 1 批):判「**保留修正结果**」——本项属体例项(**无错字,修正不适用**),维持本库现处理(保持原样)。"
# (类型, 锚) → (判决原文, 归并类, 说明)
VERDICT_TABLE = {
# —— 第 1 批(2026-09-21 首次批复):#1–#3 ——
("体例确认", "第三章 五脏补泻金石方例 用药释义"):
("保留", "体例确认(无错字)", N_TIXI + "(标题内半角空格 10 处保留、未并入 A 类清理)"),
("体例确认", "五脏补泻金石方,是陶氏在择录"):
("保留", "体例确认(无错字)",
VERDICT_HEAD + "(第 1 批):判「**保留修正结果**」——清洗版重建层级(章2/节3/条目4/子目5)"
"与补标题名 2 处维持(当时源件一字未动)。**用户 2026-09-22 另下明示指令「源件标题层级就地优化」**,"
"已执行 `13_retitle_src_ch3.py --apply`:源件 65 行标题降级、只改井号、正文逐行校验未动,"
"源件 md5 `2f2f0301…` → `41363b0d…`,改动前逐字节快照留档(`…_层级优化前快照_20260922.md`);"
"**重跑 12 后清洗版 md5 未变**(`5f1fb57c…`)——两层一致之证明。★明文例外第三例。"),
("版式清理确认", "《禹贡》《周官》列其土产"): ("保留", "修正内容", N_FIX),
("版式清理确认", "其最佳浸出温度为100度"): ("保留", "修正内容", N_FIX),
# —— 第 2 批(#4–#20):用户逐条核对原书 ——
("原书核对", "时间相符"):
("改", "修正内容",
VERDICT_HEAD + ":判「**改**」——经核对原书,原书作「相**符**」;本件「相附」为录入形近之误,"
"**已据判决改正文**(清单 #4)。"),
("原书核对", "公元前277年"):
("改", "修正内容",
VERDICT_HEAD + ":判「**改**」——经核对原书,原书作「**公元前277年**」;本件脱「前」字,"
"**已据判决改正文**(清单 #5)。"),
("修正确认", "雷斅"):
("修正正确,保留", "修正内容",
VERDICT_HEAD + ":判「**修正正确,保留**」——经核对原书,原书作「雷斅」,本件为**录入讹误**;"
"修正维持(第 1 章不同办、未动)。"),
("体例确认", "雷斅"):
("订正维持", "体例确认(无错字)",
VERDICT_HEAD + ":判「**订正维持**」——本件三项订正(雷斅/白酨浆/栝蒌)维持;"
"第 1 章**不同办、未动**,两章用字差异作为**已决体例**保留(不再列为待统一项)。"),
("修正确认", "四、礜石(木中金)"):
("原书即作「礐石」", "修正内容",
VERDICT_HEAD + ":**「原书即作『礐石』」**——经核对原书,**印刷本自身**题名即作「礐石」"
"(正文同族作「磐石」),属**原书印刷之误**;本库据底本二十五味药精「细辛 礜石为金」订正,"
"**维持修正、不得据「原书如此」回流**(★第三类,见体例登记)。"),
("原书核对", "腹中坚癖"):
("修正正确,保留", "修正内容",
VERDICT_HEAD + ":判「**修正正确,保留**」——经核对原书,原书作「腹中坚癖」(《本经》传本同);"
"本件「怀腹中坚」为衍讹并脱「癖」,**已据判决改正文**(清单 #9)。"),
("修正确认", "疥虫,䘌疮"):
("修正正确,保留", "修正内容",
VERDICT_HEAD + ":判「**修正正确,保留**」——经核对原书,原书作「䘌疮」,本件为**录入讹误**;"
"修正维持(检索须用「䘌」U+4618)。"),
("原书核对", "火惮散炎上显明之性"):
("原文无误,暂不修改", "无误·原书如此",
VERDICT_HEAD + ":判「**原文无误,暂不修改**」——经核对原书,原书即作「惮散」;"
"本库**不作改动**、疑点结项(「暂」=日后如有新材料可再议)。"),
("原书核对", "草药木火中火牡丹皮"):
("原文无误,暂时保留", "无误·原书如此",
VERDICT_HEAD + ":判「**原文无误,暂时保留**」——经核对原书,原书即作「草药木火中火」;"
"本库**不作改动**、疑点结项(「暂」=日后如有新材料可再议)。"),
("原书核对", "外有壳重垒"):
("原文如此,暂时保留", "无误·原书如此",
VERDICT_HEAD + ":判「**原文如此,暂时保留**」——经核对原书,原书即作「重垒」;"
"本库**不作改动**、疑点结项(「暂」=日后如有新材料可再议)。"),
("修正确认", "云笈七签"):
("原文如此,但修正有理,确认修正", "修正内容",
VERDICT_HEAD + ":判「**原文如此,但修正有理,确认修正**」——经核对原书,原书即作"
"「云芨七莶」「陆薰香」(**印刷本自身之误**),修正有理、**确认修正**;"
"清洗版与印刷本**有意不一致、不得回流**(★第三类)。"),
("版式清理确认", "其最佳浸出温度为100度"): ("保留", "修正内容", N_FIX), # 占位(实际见上)
("标题修复确认", "三、硝石(即火硝,火中木)"):
("修正正确,保留", "修正内容",
VERDICT_HEAD + ":判「**修正正确,保留**」——经核对原书,该行确为条目题名(四级);"
"清洗版补标维持(源件保持原样)。"),
("原书核对", "《别录》所谓芒硝者是也;"):
("修正正确,保留", "修正内容",
VERDICT_HEAD + ":判「**修正正确,保留**」——经核对原书,时珍语为一气贯下、收尾引号在"
"「殊无指归。」之后;**已据判决移引号、改句读为分号**(清单 #17;非增字,引号计数不变)。"),
("原书核对", "结出细芒者"):
("修正正确,保留", "修正内容",
VERDICT_HEAD + ":判「**修正正确,保留**」——经核对原书,原书作「结**出**细芒者」;"
"**已据判决改正文**(清单 #18)。"),
("原书核对", "所炼制之卤碱"):
("修正正确,保留", "修正内容",
VERDICT_HEAD + ":判「**修正正确,保留**」——经核对原书,原书无「的」字、并作「其**具**火体用之全」;"
"两处**已据判决一并改正文**(清单 #19)。"),
("原书核对", "有毛有孔乃肺金之象"):
("修正正确,保留", "修正内容",
VERDICT_HEAD + ":判「**修正正确,保留**」——经核对原书,原书无第三个「有」字;"
"**已据判决改正文**(清单 #20)。"),
}
# ── 第 3 批(#21–#36;用户 2026-09-21「21至36修正准确,保留修改」)──────────
# 口径同第 2 批:判「修正准确」=该项修正准确无误、维持(不回流);尚无改动者据拟正字改正文。
NOTE3 = ("**用户 2026-09-21 判决「修正准确,保留修改」**(清单 #21–#36,逐条核对原书)——"
"按第 2 批同一口径:修正**准确无误、维持修正(不回流)**;如该项尚无改动,则据拟正字"
"(原书正形)**改正文**。")
NOTE3B = ("**用户 2026-09-21 判决「修正准确,保留修改」**(清单 #21–#36,逐条核对原书)——该项"
"**无拟正字**(涉夹注/标点、书名讹脱、疑有脱文),本库**不臆改、正文一字未动**;"
"判决登记即「本库读解成立」;原文照旧,本项结项。")
# 据判决改动正文之落点数(第 2 批 7 处 + 第 3 批 9 处 + 第 5 批 7 处;第 4 批为「回填」另计)
JUDGED_CHANGE_SPOTS = 23
for _k, _v in [
(("原书核对", "其吸水性强"), ("修正准确,保留修改", "修正内容", NOTE3)),
(("修正确认", "萧绎"), ("修正准确,保留修改", "修正内容", NOTE3)),
(("原书核对", "张儒何玄"), ("修正准确,保留修改", "判决登记·本库无改动", NOTE3B)),
(("修正确认", "皆味甘气温"), ("修正准确,保留修改", "修正内容", NOTE3)),
(("原书核对", "石英明澈如水"), ("修正准确,保留修改", "修正内容", NOTE3)),
(("标题修复确认", "一、绿青(即石绿,金中金)"), ("修正准确,保留修改", "修正内容", NOTE3)),
(("修正确认", "越巂"), ("修正准确,保留修改", "修正内容", NOTE3)),
(("原书核对", "甚难得而贵"), ("修正准确,保留修改", "修正内容", NOTE3)),
(("原书核对", "都是由铜绿经久变化而成"), ("修正准确,保留修改", "修正内容", NOTE3)),
(("修正确认", "生成特性"), ("修正准确,保留修改", "修正内容", NOTE3)),
(("原书核对", "桐君采灵"), ("修正准确,保留修改", "判决登记·本库无改动", NOTE3B)),
(("修正确认", "一名羽涅"), ("修正准确,保留修改", "修正内容", NOTE3)),
(("原书核对", "故谓之皂矾"), ("修正准确,保留修改", "修正内容", NOTE3)),
(("原书核对", "均可治理"), ("修正准确,保留修改", "判决登记·本库无改动", NOTE3B)),
(("原书核对", "张氏治疸之硝石矾石散"), ("修正准确,保留修改", "修正内容", NOTE3)),
(("修正确认", "石硫磺(金中木)"), ("修正准确,保留修改", "修正内容", NOTE3)),
]:
assert _k not in VERDICT_TABLE, _k
VERDICT_TABLE[_k] = _v
VERDICT_TABLE[("原书核对", "《别录》谓石硫磺")] = (
"回填",
"补入脱文",
"**用户 2026-09-21 判决「回填」**(清单 #37,用户核对原书后给出脱落全文)——已据所给原文"
"**补入正文**:①《别录》石硫黄条后半「冷癖在胁…下部䘌疮,止血,杀疥虫。生东海牧羊山…"
"及河西山,矾石液也。」+收尾引号;②新起一段《博物志》引文「凡水源有石硫黄,其水则温,"
"或云神人所暖,主疗疾。」。用字按本库归一(䘌疮/矾石),夹注照录;全篇引号 299/298 → **300/300**。"
"此项**源件仍为脱文原样**,仅清洗版补入。")
# ── 第 5 批(#38–#53/#57–#64;用户 2026-09-21「修正正确,保留」;#54/#55「原文无误,保留不修改」)──
NOTE5 = ("**用户 2026-09-21 判决「修正正确,保留」**(清单 #38–#53/#57–#64,逐条核对原书)——"
"修正**准确无误、维持修正(不回流)**;如该项尚无改动,则据拟正字(原书正形)**改正文**。")
NOTE5B = ("**用户 2026-09-21 判决「修正正确,保留」**(清单 #38–#53/#57–#64,逐条核对原书)——该项"
"**无拟正字**(两形并存/人名可疑/句有讹脱/旧拟与传本相反),本库**不臆改、正文一字未动**;"
"判决登记即「本库读解成立」;原文照旧,本项结项。")
NOTE5C = ("**用户 2026-09-21 判决「原文无误,保留不修改」**(清单 #54,逐条核对原书)——原书即作此,"
"本库**不作改动**;疑点结项(日后如有新材料可再议)。")
NOTE5D = ("**用户 2026-09-21 判决「原文无误,保留不修改」**(清单 #55,逐条核对原书)——本库已生效之"
"订正**维持、不回改**(「保留不修改」);其「原书用字」分类暂留待核,不钉死。")
for _k, _v in [
(("原书核对", "外家谓之阳侯"), ("修正正确,保留", "修正内容", NOTE5)),
(("修正确认", "采无时。石韦为之使"), ("修正正确,保留", "修正内容", NOTE5)),
(("原书核对", "泄癖"), ("修正正确,保留", "判决登记·本库无改动", NOTE5B)),
(("修正确认", "血痹血瘀"), ("修正正确,保留", "修正内容", NOTE5)),
(("版式清理确认", "正品钉头赭石"), ("修正正确,保留", "修正内容", NOTE5)),
(("修正确认", "故宅"), ("修正正确,保留", "修正内容", NOTE5)),
(("体例确认", "饮此水而得寿"), ("修正正确,保留", "体例确认(无错字)", NOTE5)),
(("原书核对", "司空张岂"), ("修正正确,保留", "判决登记·本库无改动", NOTE5B)),
(("修正确认", "黄连末"), ("修正正确,保留", "修正内容", NOTE5)),
(("原书核对", "则钢浸汁更谓何物"), ("修正正确,保留", "修正内容", NOTE5)),
(("修正确认", "从火土论心病方中之草木药通草"), ("修正正确,保留", "修正内容", NOTE5)),
(("体例确认", "味小碱"), ("修正正确,保留", "体例确认(无错字)", NOTE5)),
(("原书核对", "唯以山顶以篮与悬下"), ("修正正确,保留", "判决登记·本库无改动", NOTE5B)),
(("修正确认", "相龃龉"), ("修正正确,保留", "修正内容", NOTE5)),
(("原书核对", "纤维石膏"), ("修正正确,保留", "修正内容", NOTE5)),
(("体例确认", "理石以土中火名之"), ("修正正确,保留", "体例确认(无错字)", NOTE5)),
(("原书核对", "疆砾"), ("原文无误,保留不修改", "无误·原书如此", NOTE5C)),
(("修正确认", "呕吐痰涎"), ("原文无误,保留不修改", "修正内容", NOTE5D)),
(("原书核对", "鉴于上述情况"), ("修正正确,保留", "修正内容", NOTE5)),
(("修正确认", "羊踯躅"), ("修正正确,保留", "修正内容", NOTE5)),
(("原书核对", "并入驴马不用"), ("修正正确,保留", "判决登记·本库无改动", NOTE5B)),
(("修正确认", "白酨浆"), ("修正正确,保留", "修正内容", NOTE5)),
(("原书核对", "生河崖山坂之阴"), ("修正正确,保留", "修正内容", NOTE5)),
(("修正确认", "荠苨"), ("修正正确,保留", "修正内容", NOTE5)),
(("原书核对", "主治呕啘"), ("修正正确,保留", "修正内容", NOTE5)),
(("体例确认", "见第二章第二节·五"), ("修正正确,保留", "体例确认(无错字)", NOTE5)),
]:
assert _k not in VERDICT_TABLE, _k
VERDICT_TABLE[_k] = _v
# ── 第 6 批(#56;用户 2026-09-22「原文如此,暂时保留」)──────────────────────
NOTE6 = ("**用户 2026-09-22 判决「原文如此,暂时保留」**(清单 #56,用户核对原书)——**原书即作此**,"
"本库**不作改动、疑点结项**(「暂」=日后如有新材料可再议;如原书另有文,给字样即据以订正)。")
VERDICT_TABLE[("原书核对", "每日是一至数二次十天为一疗程")] = (
"原文如此,暂时保留", "无误·原书如此", NOTE6)
# 注:清单 #15(LaTeX 版式清理)与 #3/#1/#2 同属第 1 批「保留修正结果」
VERDICT_TABLE[("版式清理确认", "其最佳浸出温度为100度")] = (
"修正正确,保留", "修正内容",
VERDICT_HEAD + ":判「**修正正确,保留**」——LaTeX 残留还原与半角「~」改全角维持(版式清理)。")
def build_verdicts(rows):
"""按 (类型, 锚) 登记已判决项;未列者留空(清单判决栏 ☐、余项待判决)。"""
V = {}
for r in rows:
key = (r["类型"], r["锚"])
if key in VERDICT_TABLE:
V[r["#"]] = VERDICT_TABLE[key]
return V
BUCKETS = ["修正内容", "补入脱文", "修正内容(待补正字)", "判决登记·本库无改动", "保留(本库未改动)",
"体例确认(无错字)", "无误·原书如此", "暂留待核", "回填脚注", "去脚注"]
DISPLAY = {"修正内容": "修正内容(正文已按修正生效)",
"补入脱文": "补入脱文(据用户提供的原书脱落文字回填正文,已生效)",
"判决登记·本库无改动": "判决登记·本库无改动(用户判「修正准确」,该项无拟正字/不臆改,正文照旧)",
"修正内容(待补正字)": "修正内容·待补正字(判为原书错误,待给正字后改正文)",
"保留(本库未改动)": "保留·本库未改动(该项本库未作改动,无可保留之修正,原文照旧)",
"体例确认(无错字)": "体例确认(无错字,修正不适用)"}
# 「已解决(移出存疑册)」的归并类;「保留(本库未改动)」与「暂留待核」同属**未解决**
RESOLVED_BUCKETS = {"修正内容", "补入脱文", "修正内容(待补正字)", "判决登记·本库无改动",
"体例确认(无错字)", "无误·原书如此", "回填脚注", "去脚注"}
def verdict_explain(rows, md5_out):
"""本次判决说明(第 1/2 批)——报告 §7.0 与清单文末共用同一文本。"""
n_all, n_v = len(rows), len(VERDICTS)
bk = collections.Counter(v[1] for v in VERDICTS.values())
n_change = JUDGED_CHANGE_SPOTS
return [
"## 本次判决说明(2026-09-21 第 1–5 批;2026-09-22 第 6 批)", "",
"**判决词表(用户 2026-09-21 重申)**:`保留`=**本库修正确实准确无误、维持修正(不回流)**;"
"`原文无误`=**原书原文正确、不需要修正**(本库如已改则回改)。", "",
"### 第 1 批(#1–#3,用户首批复)", "",
"用户就助手三处待决(①逐条判决清单 ②C 类「原书用字」核定 ③源件标题层级是否就地优化)"
"**一律批复「保留修正结果」**:#1 标题内体例空格保留 · #2 **清洗版重建层级维持**"
"(当时源件一字未动;**2026-09-22 用户另下明示指令后就地优化源件**,见第 7 批) · "
"#3 行尾空格删除维持(另 #4–#20 逐条另判,见下)。", "",
"### 第 2 批(#4–#20,用户逐条核对原书)", "",
"- **判「改」2 条**:#4「相附」→「**相符**」;#5「西元277年」→「**公元前277年**」——**已据判决改正文**。",
"- **判「修正正确,保留」9 条**:#6 雷斅 · #9「怀腹中坚」→「**腹中坚癖**」 · #10 䘌疮 · "
"#14 云笈七签/薰陆香 · #15 LaTeX 还原 · #16 标题补标 · #17 引号范围 · #18「结也」→「**结出**」 · "
"#19 衍「的」与「俱」→「**具**」 · #20 衍「有」——其中 **#9/#17/#18/#19/#20 据判决改正文**"
"(#6/#10/#14/#15/#16 为已有修正之维持)。",
"- **判「原文如此,但修正有理,确认修正」1 条**:#14(原书即作「云芨七莶」「陆薰香」)"
"——属 ★**原书印刷之误·本库订正**(与印刷本有意不一致、**不得回流**)。",
"- **判「原书即作『礐石』」1 条**:#8——**印刷本自身**题名即作「礐石」(正文同族作「磐石」),"
"本库据底本二十五味药精订正为「礜石」,**修正维持、不得据「原书如此」回流**(★第三类)。",
"- **判「原文无误/原文如此,暂不修改/暂时保留」3 条**:#11「惮散」 · #12「草药木火中火」 · "
"#13「重垒」——**原书即作此,本库不作改动**,疑点结项(「暂」=日后如有新材料可再议)。",
"- **判「订正维持」1 条**:#7 跨章用字——本件订正(雷斅/白酨浆/栝蒌)**维持**,"
"第 1 章**不同办、未动**(两章用字差异作为已决体例保留)。", "",
"### 第 3 批(#21–#36,用户逐条核对原书)", "",
"用户批复「**21至36修正准确,保留修改**」,按第 2 批同一口径执行:", "",
"- **据判决改正文 9 处**(清单 #21/#25/#28/#29/#33/#35):①「吸水其性强」→"
"「**其吸水性强**」;②「介于上述理由」→「**基于上述理由**」;③「明沏如水」→"
"「**明澈如水**」;④「甚难是之而贵」→「**甚难得而贵**」;⑤「或去其生从实至空」→"
"「**或云**其生从实至空」;⑥「化为输石」→「化为**鍮石**」;⑦「都是在铜绿经久变化而成」→"
"「都是**由**铜绿经久变化而成」;⑧「故主谓之皂矾」→「故**谓**之皂矾」;⑨"
"「张氏治疽之硝石矾石散」→「治**疸**」。",
"- **判决登记·本库无改动 3 条**:#23「张儒何玄」(涉夹注/标点,不臆加标记)· "
"#31「桐君采灵」(书名疑为《桐君采药录》之讹脱,无原书字样不臆补,**照原字保留**,检索须用原字)· "
"#34「均可治理」(疑有脱文,按「不敢臆补」之例照原样保留)——三条判「修正准确」即本库读解成立,"
"**正文一字未动**。",
"- **维持原有修正 7 条**:#22 萧绎 · #24 皆味甘气温/何晏 · #26 标题补标 · #27 越巂 · "
"#30 生成特性 · #32 一名羽涅 · #36 石硫磺名位(金中木)——皆维持本库修正、不回流。",
"- **部分未决 1 处 → 已获批复(2026-09-22)**:#25②「似与石英有火性之**不谋**」——「疑脱『而合』/"
"当作『相谋』」两说并存、原书用字未定,本库未改;**用户 2026-09-22 判「保留」**——该项本库"
"**未作改动、无可保留之修正**,据判决词表登记为**「保留(本库未改动)」**、正文照旧,"
"**该子疑点仍属未解决**(如意为结项,回「原文无误」即移入 6.1)。",
"- **本轮新发现 2 处(未入清单、未改动)**:①《纲目》曾青条释名传本作「故曰**曾青**也」"
"而本件作「故曰层青也」——**用户 2026-09-22 判「原文如此,暂保留」:原书即作此,本库不改、"
"疑点结项**(「暂」=日后如有新材料可再议);②《纲目·绿矾》释名传本作「**绿**矾可以染皂色」"
"而本件引作「**绛**矾」(同句前文「煅赤者名绛矾」已出「绛矾」)——**本次未裁示,"
"照原样保留、待裁示**。", "",
"### 第 4 批(#37,用户核对原书)", "",
"用户就源件脱文给出原书脱落全文,判决「**回填**」:", "",
"- **补入正文 2 段**(清洗版第 397 行):①《别录》石硫黄条后半「冷癖在胁,咳逆上气,"
"脚冷疼弱无力,及鼻衄,恶疮,下部䘌疮,止血,杀疥虫。生东海牧羊山,及大山"
"(大山具体地址待考,疑为太山),及河西山,矾石液也。」+收尾引号(原文末「邪气」后之句号"
"改逗号——该句号系脱文截断所致,补文后清单续读);②新起一段「晋·张华《博物志》谓:"
"「凡水源有石硫黄,其水则温,或云神人所暖,主疗疾。」」(本条他家引文皆独立成段之体例)。",
"- **用字归一 2 处**(本库订正体例):「下部鳖疮」→「**下部䘌疮**」(同清单 #10 已定订正);"
"「礬石液也」→「**矾石液也**」(简体归一,同「採→采」例)。**如原书该处实作「鳖疮」「礬石」,"
"给一字即回改。**",
"- **夹注照录**:「(大山具体地址待考,疑为太山)」按所给原文照录(体例同本条「生东海"
"(今江苏北部与山东省临近…)」之夹注);若系按语、不当入正文,说一声即删。",
"- **引号配平**:全篇由 299/298 变为 **300/300**(脱文所缺收尾引号已补)。",
"**源件(01 层)仍为脱文原样**(归档原则「来源层不改」);补入只落在清洗版,"
"日后以原书复核时可直接对照。", "", "### 第 5 批(#38–#53/#57–#64,用户逐条核对原书;#54/#55 判「原文无误,保留不修改」)", "",
"- **据判决改正文 7 处**:#38「外家谓之侯」→「外家谓之**阳侯**」;#47「更谓何系」→"
"「更谓**何物**」;#52「纤维膏」→「**纤维石膏**」;#57「鉴于上种情况」→「鉴于**上述**情况」;"
"#61「生河**洼**山坂」→「生河**崖**山坂」;#63「主治呕**呃**」→「主治呕**啘**」、"
"「除咳嗽,囊结」→「**破咳嗽囊结**」。逐处均有传本直证:《本草纲目》石硫黄条"
"「外家謂之陽侯」、铁落条「則鋼浸汁更謂何物」、戎盐条「生河崖山坂之陰土石間」;"
"《名医别录》竹茹条「主嘔啘,溫氣寒熱,吐血,崩中」;《本草经集注》皂荚条「消穀,破咳嗽囊結」。",
"- **判决登记·本库无改动 4 条**:#40「泄癖/泄澼」两形并存(**检索须两形并用**)· "
"#45「司空张岂」人名可疑(南齐明帝时无任司空之可考者;无原书字样**不臆改人名**)· "
"#50《博物志》「唯以山顶以篮与悬下」句有讹脱(**不臆补**)· #59「并入驴马不用」——"
"**旧拟「不入驴马药用」经核《唐本草》传本作「驴马药亦用之」,语意相反,故不据旧拟改动**、"
"登记待原书用字(另有「与陶弘景约同时的甄权」与本件上文自相矛盾一处,属作者行文之误,登记待核)。",
"- **维持原有修正 10 条**:#39 采无时 · #41 血痹 · #43 故居/若欲 · #46 黄连末 · #48 从火土 · "
"#51 相龃龉 · #58 羊踯躅 · #60 栝蒌/从火土论心病方 · #62 荠苨/乌扇/乌翣/猳猪屎/地菅/氐冬/"
"采根 · #42 句中空格从严删除(版式)——皆维持本库修正、不回流。",
"- **#54「原文无误,保留不修改」**:「疆砾」「其是非非」——原书即作此,本库**不改**、疑点结项。",
"- **#55「原文无误,保留不修改」**:本库已生效之订正(哎吐→呕吐/管经→曾经等 4 处)**维持、不回改**;"
"其「原书用字」分类**暂留待核、不钉死**。",
"- **体例确认 4 条**(#44「原书用字」逐条核定 · #49 引号收尾体例 · #53 名位重出 · "
"#64 与第 2 章交叉引证):修正不适用,维持现处理。",
"### 第 6 批(#56,用户核对原书;2026-09-22)", "",
"- **判「原文如此,暂时保留」**:#56 姜石条「每日是一至数二次十天为一疗程」句有讹脱"
"(疑当作「每日一至二次,十天为一疗程」之类)——**原书即作此,本库不作改动、疑点结项**"
"(「暂」=日后如有新材料可再议;如原书另有文,给字样即据以订正)。",
"- **本章至此 64/64 全部判决、闭环**(存疑册清零:6.1 已核验 32 项 · 6.2 无)。", "",
"### 第 7 批(2026-09-22,用户就子疑点与体例四项批复)", "",
"- **曾青条「故曰层青也」=「原文如此,暂保留」**——《纲目》曾青条释名传本作「故曰**曾青**也」,"
"本件作「层青」;**原书即作此,本库不改、疑点结项**(「暂」=日后如有新材料可再议;"
"如原书另有文,给字样即据以订正)。**检索须用原字「层青」**。同批新发现之《纲目·绿矾》"
"「**绛**矾可以染皂色」(传本「绿矾」)**用户本次未裁示,仍照原样保留、待裁示**。",
"- **#25②「似与石英有火性之不谋」=「保留」**——本项本库**未作改动**、无可保留之修正;"
"据判决词表登记为**「保留(本库未改动)」**、**正文照旧**,该子疑点**仍属未解决**"
"(同第 1 批 32 项之例;如意为结项,回「**原文无误**」即移入 6.1)。",
"- **C 类余 11 条「原书用字」=「暂时保留」**——分类(录入讹误/★印刷之误)**暂不钉定**、"
"**正文一律不改**;维持「本库订正·保留修正、不得回流」之处理。",
"- **源件标题层级就地优化=执行**——用户明示指令,已跑 `13_retitle_src_ch3.py --apply`"
"(只改井号、正文逐行校验未动,65 行标题降级);源件 md5 `2f2f0301…` → `41363b0d…`,"
"留逐字节快照可回退;**重跑 12 后清洗版 md5 未变**(`5f1fb57c…`)。", "",
f"### 归并与进度", "",
f"- **已判决 {n_v} 条/{n_all} 条**:" + " · ".join(f"{DISPLAY.get(k, k)} {bk[k]}"
for k in BUCKETS if bk.get(k)) + "。",
(f"- **全部判决完毕(本章闭环)**——判决栏已全部填入(✅),存疑册清零。" if n_all == n_v else
f"- **余 {n_all - n_v} 条(#{n_v + 1}–#{n_all})待判决**——判决栏留空(☐),"
f"请按同一口径逐条核对原书后回复(可分批)。"),
f"- **「原书用字」核定进度**:经用户逐条核对原书**已钉定 {sum(origin_counts()[:2])} 条/{len(C_FIXES)} 条**"
f"(录入讹误 {origin_counts()[0]} · ★原书印刷之误·本库订正 {origin_counts()[1]});"
f"其余 **{origin_counts()[2]} 条**待核原书,未核定前统一按「本库订正·保留修正」处理、"
f"**不得据「原书如此」回流**。",
f"- **正文改动两批合计 {n_change} 处**:第 2 批 7 处(相附→相符 · 西元→公元前 · 怀腹中坚→腹中坚癖 · "
f"引号范围移正 · 结也→结出 · 衍「的」与俱→具 · 衍「有」;清洗版 `2c5378bd…` → `e68c05cb…`)"
f"+第 3 批 9 处(吸水其性强→**其吸水性强** · 介于→**基于**上述理由 · 明沏如水→**明澈如水** · "
f"甚难是之而贵→**甚难得而贵** · 或去其生→**或云**其生从实至空 · 输石→**鍮石** · "
f"都是在→都是**由**铜绿经久变化而成 · 故主谓之皂矾→故**谓**之皂矾 · 治疽→**治疸**)——"
f"现清洗版 md5 `{md5_out}`。**第 6 批(#56)判「原文如此,暂时保留」——本库不改、"
f"清洗版 md5 未因此变动**(「不改」类判决的预期签名)。",
"", "---", "",
]
def verdict_stat():
c = collections.Counter(v[1] for v in VERDICTS.values())
if not c:
return "尚无判决"
return " · ".join(f"{DISPLAY.get(k, k)} {c[k]}" for k in BUCKETS if c.get(k))
def resolved_suspect_keys(rows):
"""移出存疑册者=「原书核对」类且判决归并类属**已解决**者(保留「本库未改动」不算解决)。"""
return {r["锚"] for r in rows if r["类型"] == "原书核对" and r["#"] in VERDICTS
and VERDICTS[r["#"]][1] in RESOLVED_BUCKETS}
# ── 拟正字表(判为「修正内容」而正文未改者;本件首轮为空)────────────────
PENDING_FIXES = []
APPLIED_N = {n for n, *_ in PENDING_FIXES}
def read_bin(p):
raw = open(p, "rb").read()
return raw.decode("utf-8"), hashlib.md5(raw).hexdigest()
def convert_latex(s):
"""PDF 公式化残留:$41\\% \\sim 45\\%$ → 41%~45%"""
s = re.sub(r"\$([\d.]+)\\?%\s*\\sim\s*([\d.]+)\\?%\$", r"\1%~\2%", s)
return re.sub(r"\$([\d.]+)\s*\\sim\s*([\d.]+)\$", r"\1~\2", s)
HALF2FULL = {",": ",", ";": ";", ":": ":", "(": "(", ")": ")", "~": "~"}
def main():
text, md5_src = read_bin(SRC)
text_src = text
n_src_lines = text_src.rstrip("\n").count("\n") + 1
bendi, md5_bendi = read_bin(BENDI)
ch1, md5_ch1 = read_bin(CH1_MD)
ch2, md5_ch2 = read_bin(CH2_MD)
raw_lines = text.replace("\r\n", "\n").split("\n")
events = []
# ── A 类读数(清理前)──
n_crlf = text.count("\r\n")
n_trail = sum(1 for l in raw_lines if l != l.rstrip())
n_lead = sum(1 for l in raw_lines if l != l.lstrip())
n_u3000 = sum(1 for l in raw_lines if "\u3000" in l)
n_cc = len(re.findall(r"(?<=[\u4e00-\u9fff]) (?=[\u4e00-\u9fff])", text))
n_num = len(re.findall(r"(?<=[\u4e00-\u9fff]) (?=\d)|(?<=\d) (?=[\u4e00-\u9fff])", text))
n_cc_head = sum(len(re.findall(r"(?<=[\u4e00-\u9fff]) (?=[\u4e00-\u9fff])", l))
for l in raw_lines if l.startswith("#"))
n_cc_body, n_num_body = n_cc - n_cc_head, n_num
n_ascii_punct = {c: text.count(c) for c in ",;:!?~$"}
half_lines = sorted({i for i, l in enumerate(raw_lines, 1)
if re.search(r"[\u4e00-\u9fff][,;:()!?]|[,;:()!?][\u4e00-\u9fff]", l)})
space_inventory, num_inventory = [], []
for i, l in enumerate(raw_lines, 1):
for m in re.finditer(r"[\u4e00-\u9fff] [\u4e00-\u9fff]", l):
space_inventory.append((i, l[max(0, m.start() - 12):m.end() + 12]))
for m in re.finditer(r"\d [\u4e00-\u9fff]|[\u4e00-\u9fff] \d", l):
num_inventory.append((i, l[max(0, m.start() - 12):m.end() + 12]))
# ── B 类:接合(行号锚定 + 校验)──
units, i = [], 0
while i < len(raw_lines):
ln = i + 1
s = raw_lines[i].strip()
if not s:
i += 1
continue
if ln in JOINS:
anchor, why = JOINS[ln]
if anchor not in s:
raise SystemExit(f"接合锚校验失败:raw{ln} 应含「{anchor}…」,实为「{s[:40]}」")
j = i + 1
while j < len(raw_lines) and not raw_lines[j].strip():
j += 1
if j >= len(raw_lines) or raw_lines[j].strip().startswith("#"):
raise SystemExit(f"接合失败:raw{ln} 之后无正文行")
nxt = raw_lines[j].strip()
merged = s + nxt
units.append((ln, merged))
events.append(dict(行=ln, 类型="B断行接合",
原=f"{s[-26:]} ⟂ {nxt[:26]}",
改=f"…{merged[-40:]}", 依据=why))
i = j + 1
continue
units.append((ln, s))
i += 1
# ── A / C / D / H / 补标:逐段处理 ──
out, level_log = [], []
c_hits, d_hits = collections.Counter(), collections.Counter()
missing_log = []
for ln, s in units:
is_head = s.startswith("#")
# H:源件未标井号之题名补标
if ln in MISSING_HEADINGS:
anchor, lv = MISSING_HEADINGS[ln]
if not s.startswith(anchor):
raise SystemExit(f"补标锚校验失败:raw{ln} 应以「{anchor[:20]}…」起,实为「{s[:40]}」")
s = "#" * lv + " " + s
missing_log.append((ln, s))
events.append(dict(行=ln, 锚=s[:14], 类型="H标题补标",
原="条目题名未标井号(正文形式)", 改=f"{'#'*lv} {re.sub(r'^#+ ','',s)[:24]}…",
依据="与本节他条目同式;其下「N.」子目正附于此条"))
is_head = True
# C 讹字
for bad, good, n_exp, why in C_FIXES:
n = s.count(bad)
if n:
allowed = n_exp if isinstance(n_exp, (tuple, list)) else (n_exp,)
if n not in allowed:
raise SystemExit(f"C 锚校验失败:「{bad}」命中 {n} 次,预期 {allowed}")
s = s.replace(bad, good)
c_hits[bad] += n
events.append(dict(行=ln, 锚=good[-12:], 类型="C讹字修正",
原=f"{bad}({n} 处)", 改=good, 依据=why))
# 回填(据判决补入原书脱落文字;含新增段落)
for bad, good, n_exp, why in BACKFILLS:
n = s.count(bad)
if n:
if n != n_exp:
raise SystemExit(f"回填锚校验失败:「{bad}」命中 {n} 次,预期 {n_exp}")
s = s.replace(bad, good)
events.append(dict(行=ln, 锚=good[:14], 类型="回填脱文",
原=f"{bad}(脱文截断处)", 改=f"…{good[8:60]}…(补 {len(good) - len(bad)} 字并新起一段)",
依据=why))
# D 标点
for bad, good, n_exp, why in D_FIXES:
n = s.count(bad)
if n:
if n != n_exp:
raise SystemExit(f"D 锚校验失败:「{bad}」命中 {n} 次,预期 {n_exp}")
s = s.replace(bad, good)
d_hits[bad] += n
events.append(dict(行=ln, 锚=good[-14:], 类型="D标点",
原=bad, 改=good, 依据=why))
if not is_head:
# A:LaTeX 残留
conv = convert_latex(s)
if conv != s:
events.append(dict(行=ln, 锚="41%~45%", 类型="A版式残留",
原="LaTeX(PDF 公式化)残留「$41\\% \\sim 45\\%$」", 改="41%~45%",
依据="PDF 公式化残留,按数据还原(同第 2 章「$7 \\sim 10$」→「7~10」例)"))
s = conv
# A:半角标点 → 全角(本件无半角标点行,此处为兼容保留)
if ln in half_lines:
before = {c: s.count(c) for c in HALF2FULL}
for a, b in HALF2FULL.items():
s = s.replace(a, b)
ch = {k: v for k, v in before.items() if v}
if ch:
events.append(dict(行=ln, 锚=s[:12], 类型="D标点",
原="半角标点 " + "、".join(f"「{k}」×{v}" for k, v in ch.items()),
改="全角 " + "、".join(f"「{HALF2FULL[k]}」" for k in ch),
依据="标点规范化(半角改全角)"))
# A:空格清理(全角标点旁 → 汉字/数字间)
s = re.sub(r"(?<=[,。、;:?!“”‘’()《》〔〕…—]) +", "", s)
s = re.sub(r" +(?=[,。、;:?!“”‘”‘()《》…—])", "", s)
s = re.sub(r"(?<=[\u4e00-\u9fff0-9]) +(?=[\u4e00-\u9fff0-9])", "", s)
if is_head:
bare = re.sub(r"^#+\s*", "", s)
lv, kind = None, None
for pat, L, K in H_RULES:
if pat.match(bare):
lv, kind = L, K
break
if lv is None:
raise SystemExit(f"未识别的标题(源行 {ln}):{s[:60]}")
newh = "#" * lv + " " + bare
if newh != s:
level_log.append((ln, s, newh))
out.append(newh)
else:
out.append(s)
# ── C 类全文命中数校验(防漏改/误改;含「每条规则至少命中一次」覆盖断言)──
for bad, good, n_exp, why in C_FIXES:
if c_hits[bad] == 0:
raise SystemExit(f"C 规则未命中(源件疑已变动):「{bad}」")
if bad in C_TOTAL and c_hits[bad] != C_TOTAL[bad]:
raise SystemExit(f"C 全文命中校验失败:「{bad}」共命中 {c_hits[bad]} 处,预期 {C_TOTAL[bad]}")
# ── C 类回改:撤销本库前批修正(文本已随规则删除而回改,此处校验并留痕)──
probe = "\n".join(out)
for orig, prev, why in REVERTS:
if probe.count(orig) != 1:
raise SystemExit(f"回改锚校验失败(原文形命中 {probe.count(orig)} 次):{orig}")
if prev in probe:
raise SystemExit(f"回改未生效:仍含本库前批改形「{prev}」")
events.append(dict(行=0, 锚=orig, 类型="C回改",
原=f"本库前批改形「{prev}」", 改=f"回改为原件形「{orig}」", 依据=why))
text = "\n\n".join(out) + "\n"
text = re.sub(r"\n{4,}", "\n\n\n", text)
# ── 事件行号改为清洗版坐标(锚校验;多命中取离源行最近者)──
flines = text.split("\n")
for e in events:
key = e.get("锚") or ""
if key:
hit = [i for i, l in enumerate(flines, 1) if key in l]
if len(hit) == 1:
e["行"] = hit[0]
elif len(hit) > 1:
e["行"] = min(hit, key=lambda h: abs(h - e.get("行", 0)))
e["备注"] = "行号指清洗版"
# ── 结构解析 ──
heads, chap, secs2, cur_sec, cur_item = [], None, [], None, None
for i, l in enumerate(flines, 1):
s = l.strip()
if not s.startswith("#"):
continue
bare = re.sub(r"^#+\s*", "", s)
lv = len(re.match(r"^#+", s).group())
kind = None
for pat, L, K in H_RULES:
if pat.match(bare):
kind = K
break
heads.append(dict(层级=lv, 类型=kind, 标题=bare, 行=i))
if kind == "章":
chap = bare
elif kind == "节":
cur_sec = dict(节=bare, 章=chap, 行=i, 条目=[])
secs2.append(cur_sec)
cur_item = None
elif kind == "条目" and cur_sec is not None:
cur_item = dict(序=re.match(r"^([一二三四五六七八九十]+)、", bare).group(1),
名=re.sub(r"^[一二三四五六七八九十]+、", "", bare), 行=i, 子目=[])
cur_sec["条目"].append(cur_item)
elif kind == "子目" and cur_item is not None:
cur_item["子目"].append(dict(
序=re.match(r"^(\d+)\.", bare).group(1),
名=re.sub(r"^\d+\.\s*", "", bare), 行=i))
# ── 自检 ──
errs, oks, notes = [], [], []
cnt = collections.Counter(h["类型"] for h in heads)
exp = dict(章=1, 节=7, 条目=32, 子目=27)
if all(cnt[k] == v for k, v in exp.items()):
oks.append(f"标题计数 章1/节7/条目32/子目27(与预期一致)")
else:
errs.append(f"标题计数异常:{dict(cnt)},预期 {exp}")
CVN = ["一", "二", "三", "四", "五", "六", "七", "八", "九", "十"]
seq_ok = True
for s_ in secs2:
got = [e["序"] for e in s_["条目"]]
if got != CVN[:len(got)]:
errs.append(f"{s_['节']} 条目序号不连续:{got}")
seq_ok = False
for e in s_["条目"]:
g2 = [x["序"] for x in e["子目"]]
if g2 != [str(n) for n in range(1, len(g2) + 1)]:
errs.append(f"{s_['节']}·{e['序']}、{e['名']} 子目序号不连续:{g2}")
seq_ok = False
if seq_ok:
oks.append("各节条目序号自「一、」连续;各条目内子目序号自「1.」连续(无缺无重)")
lvs = [h["层级"] for h in heads]
jumps = [(i, lvs[i - 1], lvs[i]) for i in range(1, len(lvs)) if lvs[i] > lvs[i - 1] + 1]
if lvs[0] == 2 and not jumps:
oks.append("标题层级体系正确:起于章(2),递降为 节(3)/条目(4)/子目(5),无跳级")
else:
errs.append(f"标题层级异常:首层级 {lvs[0]},跳级处 {jumps}")
# C 类三段验证
c_bad_left = [b for b, g, _n, _w in C_FIXES if b in text and b != g]
c_missing = [g for b, g, _n, _w in C_FIXES if text.count(g) == 0]
if not c_bad_left and not c_missing:
oks.append(f"C 类 {len(C_FIXES)} 条规则三段验证通过(讹形残留 0/正形均已出现)")
else:
errs.append(f"C 类残留:讹形 {c_bad_left};正形未出现 {c_missing}")
# 标点配平
def bal(t):
return dict(引号=(t.count("“"), t.count("”")), 单引号=(t.count("‘"), t.count("’")),
书名号=(t.count("《"), t.count("》")), 括号=(t.count("("), t.count(")")),
方括号=(t.count("〔"), t.count("〕")))
b = bal(text)
b_src = bal(text)
bal_ok = [k for k, v in b.items() if v[0] == v[1]]
if ({"单引号", "书名号", "括号", "方括号"} <= set(bal_ok)
and (b["引号"][0] == b["引号"][1] or b["引号"] == (299, 298))):
oks.append("标点配平:" + "、".join(f"{k} {v[0]}/{v[1]}" for k, v in b.items()
if k != "引号"))
if b["引号"][0] == b["引号"][1]:
oks.append(f"引号 {b['引号'][0]}/{b['引号'][1]} **配平**(原差 1 处系源件第 397 行"
f"《别录》石硫黄条脱文所致,已据用户判决「回填」补齐并新起《博物志》一段)")
else:
notes.append(f"引号 {b['引号'][0]}/{b['引号'][1]}:差 1 处,系源件第 397 行《别录》石硫黄条"
f"**脱文**(该段止于「邪气 。」且无收尾引号)所致,**照原样保留、不臆补**;"
f"除该处外全篇引号配平")
else:
errs.append(f"标点不配平(非预期项):{b}")
half_left = re.findall(r"[\u4e00-\u9fff][,;:!?()]|[,;:!?()][\u4e00-\u9fff]", text)
if not half_left:
oks.append("半角标点 0 处(本件源件仅半角「~」1 处,已改全角)")
else:
errs.append(f"仍有半角标点 {len(half_left)} 处:{half_left[:6]}")
space_left = [l[:40] for l in flines if l != l.rstrip()]
body_sp = [(i, l[:60]) for i, l in enumerate(flines, 1)
if not l.startswith("#") and re.search(r"[\u4e00-\u9fff0-9] +[\u4e00-\u9fff0-9]", l)]
head_sp = sum(len(re.findall(r"(?<=[\u4e00-\u9fff0-9]) +(?=[\u4e00-\u9fff0-9])", l))
for l in flines if l.startswith("#"))
if not space_left and not body_sp:
oks.append(f"残留空格 0 处(行尾/正文汉字数字间/标点旁);标题内「第X章 标题」等体例空格 "
f"{head_sp} 处保留(同第 1/2 章)")
else:
errs.append(f"仍有残留空格 {len(space_left)} 行/{len(body_sp)} 处:{space_left[:3]} {body_sp[:3]}")
latex_left = re.findall(r"\$|\\[a-zA-Z]{2,}", text)
if not latex_left:
oks.append("LaTeX/Markdown 引擎残留 0 处")
else:
errs.append(f"仍有 LaTeX 残留 {len(latex_left)} 处")
brk = [i + 1 for i in range(len(flines) - 1)
if flines[i].strip() and flines[i + 1].strip()
and not re.search(r"[。?!;:”》))】…—、,]$", flines[i].strip())
and not flines[i].strip().startswith("#")
and re.match(r"^[\u4e00-\u9fff“(《]", flines[i + 1].strip())
and not flines[i + 1].strip().startswith("#")]
if not brk:
oks.append("断行候选 0 处(无句中截断;B 类接合项 0)")
else:
errs.append(f"断行候选 {len(brk)} 处:{brk[:6]}")
# 名位互校(35 品 ⇄ 底本二十五味药精/十三种药)
cross = []
for sec, title, base, verdict in ITEMS35:
present = text.count(title) == 1
if not present:
errs.append(f"名位互校:清洗版未见条目题名「{title}」")
cross.append((sec, title, base, verdict, present))
n_ok = sum(1 for x in cross if x[-1] and x[3].startswith("✅"))
n_fill = sum(1 for x in cross if x[-1] and x[3].startswith("○"))
if n_ok + n_fill == len(cross):
oks.append(f"35 品金石药「名位」⇄ 底本二十五味药精/十三种药:**{n_ok} 品相符**、"
f"**{n_fill} 品底本无对应(作者拟补,名位自立)**、0 品抵牾")
else:
errs.append(f"名位互校异常:相符 {n_ok}/拟补 {n_fill}/共 {len(cross)}")
# 与第 2 章交叉引证互校
ch2_refs = [("见第二章第二节·五", "五、心火果杏、杏核仁", "杏核仁(五果·心火)")]
ref_rows = []
for anchor, item, desc in ch2_refs:
here = text.count(anchor)
there = ch2.count(item)
ref_rows.append((anchor, here, desc, "✅ 第 2 章有此条目" if there else "⚠ 第 2 章未见"))
if all(r[1] == 1 and "✅" in r[3] for r in ref_rows):
oks.append("与第 2 章交叉引证 1 处 ⇄ 第 2 章条目:落位")
else:
errs.append("交叉引证互校异常:" + str(ref_rows))
# ── 待核对清单(锚定位,固定条目表)──
def locate(ln):
sec = None
for s_ in secs2:
if s_["行"] <= ln:
sec = s_
if sec is None:
return "章引言(第一节之前)", "—"
item = None
for e in sec["条目"]:
if e["行"] <= ln:
item = e
if item is None:
return sec["节"], "节引言(首条目之前)"
sub = None
for x in item["子目"]:
if x["行"] <= ln:
sub = x
return sec["节"], (f"{item['序']}、{item['名']}" + (f"·{sub['序']}. {sub['名']}" if sub else ""))
CHECK_ITEMS_FIX = [c for c in CHECK_ITEMS if c[0] != "体例确认" or c[1] not in
("中国文物出版社", "第四次会议", "金石药「名位」命名(35 品)")]
rows = []
for typ, anchor, prob, base, sug in CHECK_ITEMS_FIX:
hits = [i for i, l in enumerate(flines, 1) if anchor in l]
if len(hits) != 1:
raise SystemExit(f"待核对清单锚校验失败(命中 {len(hits)} 次):{anchor[:24]}")
sec, item = locate(hits[0])
rows.append(dict(类型=typ, 锚=anchor, 节=sec, 条目=item, 行=hits[0],
问题=prob, 依据=base, 建议=sug))
rows.sort(key=lambda r: r["行"])
for n, r in enumerate(rows, 1):
r["#"] = n
# ── 判决登记(用户 2026-09-21:第 1/2/3 项均「保留修正结果」)──
VERDICTS.update(build_verdicts(rows))
_keys = {(r["类型"], r["锚"]) for r in rows}
_orphan = [k for k in VERDICT_TABLE if k not in _keys]
assert not _orphan, f"判决表有未落位条目(锚已失效?):{_orphan}"
assert len(VERDICTS) == sum(1 for k in VERDICT_TABLE if k in _keys), "判决定位重复"
# ── 自检:存疑册与「原书核对」清单行一一对应(防止登记漏项/重复)──
susp_keys = {k for k, _v in SUSPECTS}
row_keys = {r["锚"] for r in rows if r["类型"] == "原书核对"}
if susp_keys != row_keys:
raise SystemExit(f"存疑册与「原书核对」清单行不一致:"
f"仅存疑册有 {sorted(susp_keys - row_keys)};仅清单有 {sorted(row_keys - susp_keys)}")
oks.append(f"存疑册 ⇄ 清单「原书核对」行一一对应(各 {len(susp_keys)} 项)")
# ── 落盘 ──
def wf(p, c):
os.makedirs(os.path.dirname(p), exist_ok=True)
with open(p, "w", encoding="utf-8") as f:
f.write(c); f.flush(); os.fsync(f.fileno())
md5_out = hashlib.md5(text.encode()).hexdigest()
wf(OUT_MD, text)
struct = dict(
来源文件=os.path.basename(SRC), 来源文件md5=md5_src,
清洗版文件=os.path.basename(OUT_MD), 清洗版md5=md5_out,
定位="《药性探真》第三章 五脏补泻金石方例 用药释义(录入稿:PDF/文本层导出)",
标准="完全沿用第 1 章(07_clean_ch1.py)/第 2 章(10_clean_ch2.py)之检查核对标准与产物集",
层级体例="章=##(二级)/节=###(三级)/条目=####(四级)/子目=#####(五级);本件无附、无脚注标记",
底本互校=dict(底本文件=os.path.basename(BENDI), 底本md5=md5_bendi,
第1章清洗版=os.path.basename(CH1_MD), 第1章清洗版md5=md5_ch1,
第2章清洗版=os.path.basename(CH2_MD), 第2章清洗版md5=md5_ch2,
依据="本库内部互证(二十五味药精/十三种药名位对应),不作校改"),
源件标题层级="**已就地优化(2026-09-22 用户明示指令;★明文例外第三例)**——原样:章为#,节/条目/子目全为##;另 2 行题名未标井号。执行 13_retitle_src_ch3.py --apply(只改井号、正文逐行校验未动,65 行标题降级);源件 md5 2f2f0301… → 41363b0d…;改动前逐字节快照=《…》第3章_层级优化前快照_20260922.md(md5 2f2f0301…);重跑 12 后清洗版 md5 未变(5f1fb57c…)",
章=chap, 节=secs2,
标题层级改动=[dict(源行=a, 原=b, 后=c) for a, b, c in level_log],
标题补标=[dict(源行=a, 后=b) for a, b in missing_log],
清理事件=events, 自检=oks + ["ⓘ " + n for n in notes] + ["⚠ " + e for e in errs],
A类读数=dict(CRLF=n_crlf, 行尾空格=n_trail, 行首空格=n_lead, 全角空格=n_u3000,
汉字间半角空格=n_cc, 汉字间半角空格_标题内=n_cc_head,
数字与汉字间半角空格=n_num, 半角标点字符计数=n_ascii_punct,
半角标点所在行=half_lines),
C类命中={k: v for k, v in c_hits.items()}, D类命中={k: v for k, v in d_hits.items()},
名位互校=[dict(节=a, 条目=b, 底本依据=c, 判定=d, 题名已落位=e) for a, b, c, d, e in cross],
交叉引证互校=[dict(引证锚=a, 命中=b, 第2章条目=c, 判定=d) for a, b, c, d in ref_rows],
存疑=[dict(项=k, 说明=v) for k, v in SUSPECTS],
体例登记=[dict(项=k, 说明=v) for k, v in VERSION_NOTES],
待核对清单条数=len(rows),
)
wf(OUT_STRUCT, json.dumps(struct, ensure_ascii=False, indent=2) + "\n")
c = lambda k: sum(1 for e in events if e["类型"].startswith(k))
sql = lambda t: sum(1 for r in rows if r["类型"] == t)
TYPES = ["版式清理确认", "断行接合确认", "修正确认", "标点规范确认", "标题修复确认",
"原书核对", "体例确认"]
DESC = {"版式清理确认": "本次已清理,请复核(可回改)",
"断行接合确认": "本次已接合,请复核",
"修正确认": "本次已改,请复核(可即时回改)",
"标点规范确认": "本次已规范,请复核",
"标题修复确认": "本次已补标/重建,请复核",
"原书核对": "需核纸质原书定字(本次一律未改)",
"体例确认": "需定处理方式(现为保持原样)"}
# ── 待核对清单 ──
n_done = len(VERDICTS)
cl = [f"# 《辅行诀五脏用药法要 药性探真》第 3 章 — 待核对清单(按章节结构)", "",
f"> 用途:逐条列出需核对/需定处理方式的问题(固定 {len(rows)} 条)。"
f"**编号即清单顺序(行号序)**,与用户判决口径一致。"
f"判决栏:☐ 改/☐ 无误/☐ 保留/☐ 暂留待核/☐ 回填;**已判决 {n_done}/{len(rows)} 条"
+ ("——全部判决完毕,本章闭环**。" if n_done == len(rows)
else f",余 {len(rows) - n_done} 条待判决**。"),
"> 📖 **判决词表(用户 2026-09-20 明确、2026-09-21 重申)**:"
"`保留`=**保留(本库)修正结果**——**代表本库修正确实准确无误、维持修正(不回流)**,"
"**不指保留原文**;`修正内容`=**等同「改」**(据正字改正文,A 案);"
"`原文无误`=**原书原文正确、不需要修正**(本库如已改则**回改**);"
"`无误`/`原书如此`=原书如此;`核对正确`=核对结论成立但未下改令、原文保留;"
"`回填`=按所给原书脱落文字**补入正文**(本库据此补入、生效)。",
f"> ✅ {c_origin_note()}",
f"> 行号一律指**清洗版** `02_加工数据/药性探真_第3章_清洗版.md`(md5 `{md5_out}`);"
"⚠ 本清单「行」栏为**现行**行号(每次运行按锚现算);而各「问题/依据」文字及存疑册说明内"
"所引行号为**登记时**之清洗版行号——第 397 行「回填」新增 2 段后,其**后**之行号一律 **+2** "
"即为现行行号;",
f"> 对象原件 `01_来源数据/《辅行诀五脏用药法要 药性探真》第3章.md`(md5 `{md5_src}`;"
f"**标题层级已于 2026-09-22 经用户明示指令就地优化**——原为「#/##」未分级,现降为"
f"章2/节3/条目4/子目5(只改井号、正文逐行校验未动,65 行;脚本 13_retitle_src_ch3.py --apply);"
f"改动前逐字节快照 `…第3章_层级优化前快照_20260922.md`(md5 `2f2f0301…`)可回退;"
f"★明文例外第三例)。",
f"> 标准与产物格式**完全沿用第 1/2 章**(`02_加工数据/药性探真_第2章_待核对清单.md`);"
f"共 **{len(rows)}** 条:" + " · ".join(f"{t} {sql(t)}" for t in TYPES if sql(t)),
"", "## 汇总", "", "| 类型 | 条数 | 说明 |", "|------|------|------|"]
for t in TYPES:
if sql(t):
nd = sum(1 for r in rows if r["类型"] == t and r["#"] in VERDICTS)
cl.append(f"| {t} | {sql(t)} | {DESC[t]}" + (f"(已判决 {nd})" if nd else "") + " |")
cl += ["", "---", "", "## 逐条(按章节结构)", ""]
by_sec = collections.defaultdict(list)
for r in rows:
by_sec[r["节"]].append(r)
order = ["章引言(第一节之前)"] + [s["节"] for s in secs2]
for sec_name in order:
rs = by_sec.get(sec_name, [])
if sec_name == "章引言(第一节之前)" and not rs:
continue
cl += [f"### {sec_name}", ""]
if not rs:
cl += ["(本节无待核对项)", ""]
continue
cl += ["| # | 条目 | 行(清洗版) | 类型 | 问题 | 依据 | 建议 | 判决 |",
"|---|------|------|------|------|------|------|------|"]
for r in rs:
v, _bk, vnote = VERDICTS.get(r["#"], ("—", "", ""))
pend = " +**修正内容·本轮据正字改字**(正文已生效)" if r["#"] in APPLIED_N else ""
cell = (f"✅ **{v}**:{vnote}{pend}" if v != "—"
else "☐ 改/☐ 无误/☐ 保留/☐ 暂留待核")
cl.append(f"| {r['#']} | {r['条目']} | {r['行']} | {r['类型']} | {r['问题']} | "
f"{r['依据']} | {r['建议']} | {cell} |")
cl.append("")
cl += verdict_explain(rows, md5_out)
cl += [
"> 判决后回填方式(同第 1/2 章):①「原书核对」类若判定改字 → 在 "
"`05_脚本工具/12_clean_ch3.py` 的 `C_FIXES`/`D_FIXES` 增改条目(标注「用户核对原书」)"
"→ 重跑 12 刷新清洗版与报告;②「体例确认」结果 → 记入检查报告第八节;"
"③「版式/标点/标题」类如需回改 → 在规则表中去除或改写对应条目。",
"",
f"> 📅 2026-09-21 —— 建单:{len(rows)} 条待核对(按章/节/条目/子目定位,行号指清洗版);"
f"首轮清洗,当时尚无判决。",
f"> 📅 2026-09-21 —— **第 1 批判决(#1–#3,保留修正结果)**:三处待决一律批复「保留修正结果」"
f"(=本库修正准确无误、维持修正、不回流);**清洗版 md5 未变**(当时仍 `2c5378bd…`),"
f"仅报告/清单/结构/脚本随登记更新。",
f"> 📅 2026-09-21 —— **第 2 批判决(#4–#20,逐条核对原书)**:判「改」2 · 「修正正确,保留」9 · "
f"「原文如此·但修正有理·确认修正」1 · 「原书即作『礐石』」1 · 「原文无误/原文如此」3 · "
f"「订正维持」1;据此**正文改 7 处**(相符/公元前277年/腹中坚癖/引号范围/结出/衍「的」与具/衍「有」),"
f"**清洗版 md5 `2c5378bd…` → `{md5_out}`**(首次动正文);C 类 {len(C_FIXES)} 条、D 类 {c('D')} 条;"
f"「原书用字」已钉定 {sum(origin_counts()[:2])} 条/{len(C_FIXES)}(录入讹误 {origin_counts()[0]} · "
f"★印刷之误·本库订正 {origin_counts()[1]})、余 {origin_counts()[2]} 条待核;"
f"**当时余 44 条(#21–#64)待判决**(后经第 3–6 批全部判决)。",
f"> 📅 2026-09-21 —— 按第 1/2 章标准建件:A 版式(行尾空格 {n_trail} 行/汉字间空格 {n_cc} 处/"
f"数字旁空格 {n_num} 处/LaTeX 1/半角 ~ 1)、B 0、C {len(C_FIXES)} 条、D {c('D')}、"
f"H 标题 {len(level_log)} 行+补标 {len(missing_log)} 处;名位互校 35 品;"
f"存疑 {len(SUSPECTS)} 项;体例登记 {len(VERSION_NOTES)} 项。",
f"> 📅 2026-09-21 —— **第 3/4/5 批判决**:据判决改正文 23 处(第 3 批 9 · 第 5 批 7 · 第 2 批 7);"
f"第 4 批判「回填」补入源件脱文 2 段(引号 299/298 → **300/300**);"
f"#54/#55 判「原文无误,保留不修改」(不改动);**清单已判决 63/64、余 #56 一条**;"
f"清洗版 md5 `e68c05cb…` → `b221786e…` → `{md5_out}`。",
f"> 📅 2026-09-22 —— **第 6 批判决(#56,用户核对原书)**:判「**原文如此,暂时保留**」——"
f"姜石条「每日是一至数二次十天为一疗程」句有讹脱(疑当作「每日一至二次,十天为一疗程」之类),"
f"**原书即作此,本库不作改动、疑点结项**(「暂」=日后如有新材料可再议);"
f"**清单 64/64 全部判决、本章闭环**(存疑册清零);**清洗版 md5 未变(`{md5_out}`)**"
f"——「不改」类判决的预期签名(正文一字未动)。",
"> 📌 第 1 章同类清单已于 2026-09-17 判决闭环,第 2 章于 2026-09-20 判决闭环,格式可对照。",
"> ✅ 本件原有「源件脱文」1 处(第 397 行《别录》石硫黄条脱后半、收尾引号及《博物志》"
"引文一整段)——**用户 2026-09-21 判决「回填」**(清单 #37),清洗版已据所给原书文字补入,"
"全篇引号由 299/298 变为 **300/300**;**01 源件仍为脱文原样**(归档原则:来源层不改)。"]
wf(OUT_CHECK, "\n".join(cl) + "\n")
# ── 检查报告 ──
rep = ["# 《辅行诀五脏用药法要 药性探真》第 3 章 — 检查报告(录入稿清洗与核对)", "",
f"> 📅 2026-09-21|对象:`01_来源数据/《辅行诀五脏用药法要 药性探真》第3章.md`"
f"(录入稿;md5 `{md5_src}`,{len(text_src)} 字符 / {n_src_lines} 行)",
f"> 产物:`02_加工数据/药性探真_第3章_清洗版.md`(md5 `{md5_out}`;"
f"{len(text)} 字符 / {text.rstrip(chr(10)).count(chr(10)) + 1} 行)/本报告/"
"`02_加工数据/药性探真_第3章_结构.json`/`02_加工数据/药性探真_第3章_待核对清单.md`;"
"脚本 `05_脚本工具/12_clean_ch3.py`(幂等)",
"> 用户指令:**按照第 2 章的标准**,对第 3 章进行清洗核对。",
"> 🚫 **正文改写只落在清洗版**,且每条带核校依据,可回改。"
"(**源件标题层级已于 2026-09-22 经用户明示指令就地优化**:只改井号、正文逐行校验未动,"
"留逐字节快照可回退——★明文例外第三例;源件正文本身一字未动。)",
"> 🔧 与第 1/2 章的差别:本件为**金石药专著之章**,全章 35 品金石药皆标「(X中Y)」名位,"
"故新增**名位互校**自检项(35 品 ⇄ 底本二十五味药精/十三种药),"
"并据此查出「礜石」讹形 12 处与「石硫磺」名位之误 1 处。", "",
f"> 📋 **待核对清单**:`02_加工数据/药性探真_第3章_待核对清单.md`(按章/节/条目/子目列出,"
f"共 {len(rows)} 条,供逐条判决)。", "",
"## 一、检查结论", "", "| 项目 | 结果 |", "|------|------|",
f"| 版式残留(A) | 行尾空格 **{n_trail} 行**、汉字间半角空格 **正文 {n_cc_body} 处**"
f"(标题内「第X章 标题」体例 {n_cc_head} 处保留)、数字与汉字间半角空格 **{n_num_body} 处**、"
f"LaTeX 残留 1 处、半角「~」1 处 → **已全部清理**"
f"(CRLF {n_crlf}/行首空格 {n_lead}/全角空格 {n_u3000}/半角标点行 {len(half_lines)}) |",
f"| 断行截断(B) | **本件 0 处**(段末脱句号 2 处归 D 类补句读;源件脱文 1 处照原样保留) |",
f"| 讹字(C) | **{len(C_FIXES)} 条规则**(金石药名位/药名 4、人名书目 5、引文形近讹字 16、"
f"本句内证 11、体例衍倒 4;涉改 **47 处**) |",
f"| 标点(D) | 段末补句号 2 处、句号误作顿号 1、引号内逗号改句号 1、误入句号 1、"
f"误入逗号 1、半角「~」→全角「~」1 → 已规范 |",
f"| 标题层级(H) | 章2/节3/条目4/子目5;**源件已于 2026-09-22 经用户明示指令就地优化**"
f"(原为「#/##」未分级,65 行标题降级;只改井号、正文逐行未动,留快照可回退),"
f"故本轮**清洗版重建层级 {len(level_log)} 行**(两层同规则 ⇒ 幂等)"
f"+**补标题名 {len(missing_log)} 处**(源件该 2 行题名未标井号) |",
"| 引文规范 | " + "、".join(f"{k} {v[0]}/{v[1]}" for k, v in b.items() if k != "引号")
+ (f" 全部配平;**引号 {b['引号'][0]}/{b['引号'][1]}**"
+ ("(**已配平**——原差 1 处系第 397 行脱文,已据判决「回填」补齐)" if b['引号'][0] == b['引号'][1]
else "(差 1=源件第 397 行脱文,不臆补)")
+ " |"),
"| 脚注(G) | 本件**无脚注标记**(第 345/471 行「详见《伤寒论阴阳图说》」为随文注,非脚注) |",
f"| 名位互校 | 35 品金石药「X中Y」⇄ 底本二十五味药精/十三种药:**{n_ok} 品相符**、"
f"**{n_fill} 品底本无对应(作者拟补)**、0 品抵牾 |",
f"| 交叉引证 | 回指第 2 章 1 处(「见第二章第二节·五」→ 杏核仁):**落位** |",
f"| 结构 | 章 1 / 节 7 / 条目 32 / 子目 27 "
f"(金石药 35 品 + 第七节其他用药 18 品) |",
f"| 人工判决 | **已判决 {len(VERDICTS)}/{len(rows)}(全部判决、本章闭环)**(2026-09-21 五批:"
f"#1–#3「保留修正结果」· #4–#20 逐条核对原书 · #21–#36「修正准确,保留修改」· #37「回填」"
f"(源件脱文 2 段、引号 300/300)· #38–#53/#57–#64「修正正确,保留」,#54/#55「原文无误,"
f"保留不修改」;2026-09-22 第 6 批 #56「原文如此,暂时保留」);归并类 {verdict_stat()};"
f"**余 0 条待判决**;**清洗版 md5 未因第 6 批变动**(「不改」类判决之预期签名) |", ""]
# 二、A 类
rep += ["## 二、版式残留清理(A 类)", "",
f"- 源件读数:行尾空格 {n_trail} 行、行首空格 {n_lead} 行、全角空格 {n_u3000} 行、"
f"CRLF {n_crlf} 行;半角标点字符计数 " + "、".join(f"`{k}` {v}" for k, v in n_ascii_punct.items()),
f"- **行尾空格 {n_trail} 行**(正文段落末尾普遍带 1 个半角空格)已逐行删除"
f"(标题行 0 处,无同类残留)。",
f"- 汉字间半角空格 **{n_cc}** 处 = 正文 **{n_cc_body}** 处(已删除,逐处清单见下)"
f"+ 标题内 **{n_cc_head}** 处(`# 第三章 …` 与 7 个 `第X节 …` 及第 503 行节题之「标题内空格」,"
f"**体例保留**,同第 1/2 章):", "",
"| 源行 | 上下文 |", "|----|--------|"]
for ln, ctx in space_inventory:
rep.append(f"| {ln} | …{ctx.replace('|', '|')}… |")
rep += ["", f"> 处理:**正文 {n_cc_body} 处**一律删除;标题内 {n_cc_head} 处保留(Markdown 标题体例)。",
"", f"- 数字与汉字间半角空格 {n_num_body} 处(逐处清单):", "", "| 源行 | 上下文 |", "|----|--------|"]
for ln, ctx in num_inventory:
rep.append(f"| {ln} | …{ctx.replace('|', '|')}… |")
rep += ["", "> 处理:**本次从严一律删除**(与第 2 章一致)。⚠ 体例提示:第 1 章清洗版存 1 处同类未清"
"(「用升麻 10 克、小米 10 克…」),第 2 章同例经用户 2026-09-20 判决「保持现状、"
"两章暂不统一」;本件从第 2 章之严,**三章体例暂不统一**(见待核对清单体例项)。",
"", f"- LaTeX 残留 1 处(第 131 行):`$41\\% \\sim 45\\%$` → **41%~45%**(PDF 公式化残留,"
f"读作数据还原;同第 2 章「$7 \\sim 10$」→「7~10」例)。",
f"- 半角「~」1 处(第 571 行「4~5 毫升」)→ 全角「~」;本件**无半角标点所在行**"
f"(半角标点行 {half_lines})。", ""]
# 三、逐条留痕
rep += ["## 三、本次修正(逐条留痕)", "",
"| 行(清洗版) | 类别 | 原文 | 处理后 | **原书用字** | 核校依据 |",
"|----|------|------|--------|------|---------|"]
for e in events:
key = re.sub(r"(\d+ 处)$", "", e["原"])
if e["类型"] == "C讹字修正":
o = C_ORIGIN.get(key, ("待核原书", "首轮清洗未核定"))
origin = f"**{o[0]}**:{o[1]}"
elif e["类型"] == "C回改":
origin = "**原书作原件形**(判决「原文无误」→ 回改)"
else:
origin = "—"
rep.append(f"| {e.get('行', '—')} | {e['类型']} | {e['原'].replace('|', '|')} | "
f"{e['改'].replace('|', '|')} | {origin.replace('|', '|')} | "
f"{e['依据'].replace('|', '|')} |")
rep += ["", f"> 合计:A 版式 {c('A')} 条事件(另含全局行尾空格 {n_trail} 行、"
f"正文汉字间空格 {n_cc_body} 处、数字旁空格 {n_num_body} 处)、B 接合 {c('B')}、"
f"C 讹字 {c('C')}、D 标点 {c('D')}、H 标题(重建 {len(level_log)}+补标 {len(missing_log)})、"
f"**回填脱文 {len(BACKFILLS)} 处**(清单 #37:补《别录》石硫黄条后半及《博物志》一段,"
f"引号 299/298 → 300/300)。",
"", f"> ⓘ {c_origin_note()}", ""]
# 四、标题层级
rep += ["## 四、标题层级优化与题名补标", "",
"| 层级 | Markdown | 对象 | 例(本件) |", "|------|----------|------|-----------|",
"| 二级 | `##` | 章 | 第三章 五脏补泻金石方例 用药释义 |",
"| 三级 | `###` | 节 | 第一节 肝木辛味门 … 第七节 其他用药《本经》录文 |",
"| 四级 | `####` | 条目(一、二、三…) | 一、青琅玕(木中木)… 三、石硫磺(金中木) |",
"| 五级 | `#####` | 子目(1. 2. 3.…) | 1. 火硝(火中木)… 11. 茅根 |", "",
f"共重排 **{len(level_log)}** 行标题(**源件已于 2026-09-22 就地优化为章2/节3/条目4/"
f"子目5,两层同规则 ⇒ 本轮重建 0 行**);"
f"另**补标题名 {len(missing_log)} 处**(源件该 2 行题名未标井号):"]
for ln, newh in missing_log:
rep.append(f" - 源行 {ln}:`{newh[:46]}…`")
rep += ["", f"> ⚠ 源件(`01_来源数据/`)标题层级**已于 2026-09-22 经用户明示指令就地优化**"
f"(第 1 章 2026-09-17、第 2 章 2026-09-20 之后**★明文例外之第三例**):执行 "
f"`python3 05_脚本工具/13_retitle_src_ch3.py --apply`,**只改井号、正文逐行校验未动**,"
f"65 行标题降级;源件 md5 `2f2f0301…` → `{md5_src}`;改动前逐字节快照="
f"`01_来源数据/《辅行诀五脏用药法要 药性探真》第3章_层级优化前快照_20260922.md`"
f"(md5 `2f2f0301…`,可回退);**重跑本脚本后清洗版 md5 未变**(`{md5_out}`)"
f"——层级层与清洗层同规则之证明。", ""]
# 五、名位互校
rep += ["## 五、名位互校(35 品金石药 ⇄ 底本二十五味药精/十三种药)", "",
"| 节 | 条目(清洗版题名) | 底本依据 | 判定 |", "|----|------------------|---------|------|"]
for sec, title, base, verdict, present in cross:
rep.append(f"| {sec} | {title} | {base} | {verdict if present else '⚠ ' + verdict} |")
rep += ["", "> 判定规则:底本《辅行诀》二十五味药精以「味辛皆属木/味咸皆属火/味甘皆属土/"
"味酸皆属金/味苦皆属水」分列草木与金石各一品(如「桂 琅玕为之主」「细辛 礜石为金」),"
"十三种药另列(如「通草为木中土,又为木中水」「升麻为土中金,又为土中火」);"
"本章 35 品之「(X中Y)」凡落在底本对应品内即为相符。"
"本项属**本库内部互证,不改原文**(同第 1 章名位互校之例)。",
"> ⚠ **本项查出两处实质讹误**(已落 C 类):①条目「四、礐石(木中金)」之「礐石」与正文 11 处"
"「磐石」皆当作「**礜石**」(底本「细辛 礜石为金」);②条目「三、石硫磺(金中火)」之名位"
"当作「**金中木**」(底本「芍药 硫黄为木」,本条正文亦自述「金中木药」)。", "",
"### 与第 2 章交叉引证互校", "",
"| 引证锚(本件) | 命中 | 第 2 章条目 | 判定 |", "|---------------|------|------------|------|"]
for a_, h_, d_, v_ in ref_rows:
rep.append(f"| `{a_}` | {h_} | {d_} | {v_} |")
rep += ["", "> 本件另引本书外著作 2 处(第 345/471 行「详见《伤寒论阴阳图说》」,系作者另一著作);"
"第七节「杏核仁」不另立条文,仅以「见第二章第二节·五」回指(已互校)。", ""]
# 六、存疑
res_keys = resolved_suspect_keys(rows)
_no = {r["锚"]: r["#"] for r in rows}
stay = [(k, v) for k, v in SUSPECTS if k not in res_keys]
gone = sorted([(k, v) for k, v in SUSPECTS if k in res_keys], key=lambda kv: _no.get(kv[0], 999))
_bk6 = collections.Counter(VERDICTS[r["#"]][1] for r in rows if r["类型"] == "原书核对")
_b6s = " · ".join(f"{DISPLAY.get(k, k)} {_bk6[k]}" for k in BUCKETS if _bk6.get(k))
_hdr6 = (f"> 现状:**存疑清零**——本类 {len(SUSPECTS)} 项**全部经用户逐条核对原书结项**"
f"(归并类:{_b6s});6.1 已核验 {len(gone)} 项 · 6.2 尚待核对 {len(stay)} 项。" if not stay
else f"> 现状:**已核验 {len(gone)} 项**/**尚待核对 {len(stay)} 项**。")
rep += ["## 六、存疑登记(原文不改,待核原书)", "", _hdr6, ""]
if gone:
rep += ["### 6.1 已核验(用户判决,本项结项,不再列为存疑)", "",
"| 项 | 用户判决 | 结论 |", "|----|---------|------|"]
for k, v in gone:
r = next((x for x in rows if x["锚"] == k), None)
vd, bk, vnote = VERDICTS.get(r["#"], ("—", "", "")) if r else ("—", "", "")
rep.append(f"| {k} | **{vd}**(清单 #{r['#'] if r else '—'}) | {vnote} |")
rep.append("")
rep += ["### 6.2 尚待核对", "", "| 项 | 说明 |", "|----|------|"]
if stay:
for k, v in stay:
rep.append(f"| {k} | {v} |")
rep.append("")
else:
rep.append("| — | **(无)**本类已全部结项 |")
rep.append("")
rep += [f"> 共 **{len(stay)}** 项尚待核对;已结项 {len(gone)} 项见 6.1,逐条与待核对清单"
f"「原书核对」类一一对应(清单 # 与本表同源,脚本自检断言)。",
f"> 📅 2026-09-21/22 判决:本类 **{len(SUSPECTS)} 项经用户逐条核对原书全部结项**,"
f"**存疑清零**——「无误·原书如此」类=原书如此、本库不改;「修正内容」类=据判决改正文"
f"(已生效);「判决登记·本库无改动」类=无拟正字、不臆改,正文一字未动;"
f"「补入脱文」类=据用户所给原书脱落文字回填(第 397 行,引号 300/300)。"
f"日后如另有新材料,可再议(#56 等「暂」字项即属此类)。",
f"> ⓘ **本节「清零」以清单 64 行为粒度**;另有两类**行内子疑点**不在清单行内,"
f"经用户 **2026-09-22** 批复如下——① #25②「似与石英有火性之**不谋**」(两说并存):"
f"判「**保留**」;该项本库**未作改动、无可保留之修正**,登记为**「保留(本库未改动)」**、"
f"正文照旧,**仍属未解决**(如意为结项,回「原文无误」即移入 6.1);② 第 3 批新发现 2 处"
f"——《纲目》曾青条「故曰**层青**也」(传本「故曰曾青也」):判「**原文如此,暂保留**」"
f"→ **本库不改、疑点结项**;《纲目·绿矾》「**绛**矾可以染皂色」(传本「绿矾」):"
f"**本次未裁示,照原样保留、待裁示**。", ""]
# 七、清单与判决记录
n_done = len(VERDICTS)
st_word = "全部判决(本章闭环)" if n_done == len(rows) else "尚无判决" if n_done == 0 else "部分判决"
rep += ["## 七、待核对清单与人工核验判决记录", "",
f"- 文件:`02_加工数据/药性探真_第3章_待核对清单.md`(固定 {len(rows)} 条,"
f"按章/节/条目/子目分组,含判决栏)",
"- 构成:" + " · ".join(f"{t} {sql(t)}" for t in TYPES if sql(t)),
f"- 状态:**{st_word}**——已判决 {n_done}/{len(rows)} 条(判决分布 {verdict_stat()})"
+ (",**余 0 条待判决(本章闭环)**。" if n_done == len(rows)
else f",余 {len(rows) - n_done} 条待判决。"),
"",
*verdict_explain(rows, md5_out),
"", ]
if PENDING_FIXES:
rep += ["### 7.1 修正内容·拟正字与落盘实况", "",
"| # | 行(清洗版) | 原书文 | 拟正字 | 依据 |", "|---|------|--------|--------|------|"]
for n, ln, old_t, new_t, why in PENDING_FIXES:
rep.append(f"| {n} | {ln} | {old_t} | **{new_t}** | {why} |")
rep.append("")
else:
rep += ["### 7.1 修正内容·拟正字与落盘实况", "",
f"(本件**无「拟正字待补」条目**——现行 {len(C_FIXES)} 条 C 类修正皆已落盘生效,"
f"正文可即时回改;如日后判决改为「暂留待核」,可在 `C_FIXES` 中去除对应条目。)",
""]
# 八、体例登记
rep += ["## 八、体例登记(不校改)", "", "| 项 | 说明 |", "|----|------|"]
for k, v in VERSION_NOTES:
rep.append(f"| {k} | {v} |")
# 九、结构
rep += ["", "## 九、结构(清洗版行号)", "", "| 节 | 条目数 | 子目数 | 行号 |", "|----|-------|-------|------|"]
for s_ in secs2:
n_sub = sum(len(e["子目"]) for e in s_["条目"])
rng = (f"{s_['条目'][0]['行']}–{s_['条目'][-1]['行']}" if s_["条目"] else "—")
rep.append(f"| {s_['节']} | {len(s_['条目'])} | {n_sub} | {rng} |")
rep += ["", "| 节 | 条目 | 行 | 子目(行) |", "|----|------|----|-----------|"]
for s_ in secs2:
for e in s_["条目"]:
subs = ";".join(f"{x['序']}. {x['名']}({x['行']})" for x in e["子目"]) or "—"
rep.append(f"| {s_['节'].split(' ')[0]} | {e['序']}、{e['名']} | {e['行']} | {subs} |")
# 十、自检
rep += ["", "## 十、自检结果(脚本自动)", ""]
for o in oks:
rep.append(f"- ✅ {o}")
for n_ in notes:
rep.append(f"- ⓘ {n_}")
for e_ in errs:
rep.append(f"- ⚠ **{e_}**")
rep += ["", "---", "",
f"> 📅 2026-09-21 —— 建件:按第 2 章标准检查并清洗第 3 章录入稿;"
f"A(行尾空格 {n_trail} 行/汉字间空格 {n_cc} 处/数字旁空格 {n_num} 处/LaTeX 1/半角 ~ 1)、"
f"B {c('B')}、C {len(C_FIXES)} 条、D {c('D')}、H 标题 {len(level_log)} 行+补标 {len(missing_log)} 处;"
f"名位互校 35 品({n_ok} 相符/{n_fill} 作者拟补);体例登记 {len(VERSION_NOTES)} 项;"
f"待核对清单 {len(rows)} 条(已判决 {len(VERDICTS)}/{len(rows)});"
f"存疑册 {len(stay)} 项。",
"> 📅 2026-09-21 —— 源件**未改动**(标题层级未优化);同办脚本 13_retitle_src_ch3.py 已备"
"(默认 dry-run)。**用户就该项批「保留修正结果」——即清洗版重建层级维持、源件一字未动**。"
"(**后续:2026-09-22 用户另下明示指令「源件标题层级就地优化」,已执行 `--apply`**——"
"只改井号、正文逐行校验未动,源件 md5 `2f2f0301…` → `41363b0d…`,留逐字节快照可回退;"
"**重跑 12 后清洗版 md5 未变**。)",
f"> 📅 2026-09-21 —— **第 1 批判决(#1–#3)**:三处待决一律「**保留修正结果**」"
f"(=本库修正准确无误、维持修正、不回流);**源件仍未改动、清洗版 md5 未变**(当时仍 `2c5378bd…`)"
f"——此即「保留」类判决的预期签名(正文不动)。",
f"> 📅 2026-09-21 —— **第 2 批判决(#4–#20,用户逐条核对原书)**:判「改」2(相附→**相符**、"
f"西元→**公元前**277年)· 「修正正确,保留」9(雷斅/**腹中坚癖**/䘌疮/云笈七签·薰陆香/LaTeX/"
f"标题补标/引号范围/**结出**/衍「的」与**具**/衍「有」)· 「原文如此·但修正有理·确认修正」1"
f"(★原书印刷之误·本库订正)· 「原书即作『礐石』」1(★印刷本自身之误)· 「原文无误/原文如此」3"
f"(惮散/草药木火中火/重垒——本库不改、结项)· 「订正维持」1(跨章用字,第 1 章不同办)。"
f"**正文改 7 处**,**清洗版 md5 `2c5378bd…` → `{md5_out}`**(首次动正文);"
f"C 类 {len(C_FIXES)} 条、D 类 {c('D')} 条;名位互校与引号配平等自检仍全绿;"
f"「原书用字」已钉定 {sum(origin_counts()[:2])} 条/{len(C_FIXES)}(录入讹误 {origin_counts()[0]} · "
f"★印刷之误·本库订正 {origin_counts()[1]})、余 {origin_counts()[2]} 条待核;"
f"**当时清单余 44 条(#21–#64)待判决**(后经第 3–6 批全部判决)。",
f"> 📅 2026-09-21 —— **第 3/4/5 批判决**:据判决改正文 **23 处**(第 3 批 9 · 第 5 批 7 · 第 2 批 7)"
f"+第 4 批「回填」补入源件脱文 **2 段**(引号 299/298 → **300/300**);"
f"#54/#55 判「原文无误,保留不修改」(不改动);清洗版 `e68c05cb…` → `b221786e…` → `{md5_out}`;"
f"**清单已判决 63/64、余 1 条(#56)**。",
f"> 📅 2026-09-22 —— **第 6 批判决(#56,用户核对原书)**:判「**原文如此,暂时保留**」——"
f"姜石条句有讹脱,**原书即作此、本库不作改动、疑点结项**(「暂」=日后如有新材料可再议);"
f"**64/64 全部判决、本章闭环**,**存疑册清零**(6.1 已核验 32 项 · 6.2 无);"
f"**清洗版 md5 未变(`{md5_out}`)**——「不改」类判决的预期签名(正文一字未动)。",
"> 📌 第 1 章(2026-09-17)、第 2 章(2026-09-20)已判决闭环,本章为本库清洗之第三章。"]
wf(OUT_REPORT, "\n".join(rep) + "\n")
print("清洗版:", OUT_MD, os.path.getsize(OUT_MD), "bytes")
print("报告 :", OUT_REPORT, os.path.getsize(OUT_REPORT), "bytes")
print("结构 :", OUT_STRUCT, os.path.getsize(OUT_STRUCT), "bytes")
print("待核单:", OUT_CHECK, os.path.getsize(OUT_CHECK), "bytes")
print(f"md5 清洗版 {md5_out}")
print(f"A 行尾空格 {n_trail} 行 | 空格 {n_cc}+{n_num} 处 | 半角标点行 {half_lines} | "
f"B {c('B')} | C {len(C_FIXES)} | D {c('D')} | H 标题 {len(level_log)} + 补标 {len(missing_log)} | "
f"清单 {len(rows)} 条")
for o in oks:
print(" ✅", o)
for n_ in notes:
print(" ⓘ", n_)
for e_ in errs:
print(" ⚠", e_)
if __name__ == "__main__":
main()