#!/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()