目录里的条目是带编号的(1 / 1.1 / 2 / 2.1…),但正文里的标题一个编号都没有,两边对不上,读文章时没法照着目录找。
用户原话:
这个标题,h1,h2,h3,能不能加上编号?如果 h1 没有,就是 h2 是一级编号,因为目录是有编号的,正文没有编号,给人的感觉很奇怪。
抓线上真实 HTML 里的 <span class="yang-toc-num">:
<span class="yang-toc-num">
1 / 2 / 3 / 3.1~3.6 / 4
1~7
1 / 1.1~1.6 / 2 / 2.1~2.2
即 yang_toc_build_list() 里的 lstack/depth 归一化已经做到了「没 h1 就让 h2 当一级」。所以编号算法本身不用改,正文复用同一份结果即可,这样两边天然一致,不会出现两套算法漂移。
yang_toc_build_list()
lstack
depth
有标题的只有 24 篇,标题总数 112 h1 = 2 个(全在 #5131 一篇里) h2 = 93 个 ← 绝对主流 h3 = 17 个 h4/h5/h6 = 0
绝大多数文章就是「没有 h1,h2 当一级」,与用户描述一致。
#5240 的 6 个 h3 标题是手写的:
1. 自定义短语 2. 候选词竖排显示 3. 翻页功能 4. 候选词个数 5. Shift键上屏 6. 词库的同步
自动编号后会变成 3.1 1. 自定义短语 —— 双层编号。
3.1 1. 自定义短语
.yang-toc-num
toc_levels
post_content
h2/h3
1 / 2 / 2.1 / 3
2 / 3 / 3.1 / 4
h3×7
h2→h4→h3→h2
the_content
h3.ar-year
id
yang_toc_make_id
section
h3
1.
一、
(一)
第一章
#28 是图片缩进几何问题、#29 是标题字号字重层级;本条是标题文本内容加编号,与两者无重叠
commit 76c69b3,已推送。服务器主题仍是 3.2.61,等后台点升级(更新缓存已清,后台「更新」页现在能看到 3.2.62)。
76c69b3
1
2
3
3.1
3.6
4
7
1.1
1.6
2.1
2.2
2.4
「没有 h1 时 h2 就是一级」是按 深度归一 实现的,不是按绝对 level:h2 的 level 是 2,若拿它当编号首段就会编成 "2"。归一后最外层深度恒为 0 ⇒ 首段恒为 1。
0.62em
#a8abb2
1、
1)
1)
1.2
1.2.3
(1)
第一章/节/部分
2026 年展望
⚠️ 一点需要你确认:跳过的那些条目仍占着编号位置。所以 #5240 正文里那 6 个自己写了编号的 h3 不会出现 3.13.6,但后面那个 h2 依然是 4 —— 序列不错位。正文与目录在那一段看起来会"对不上"(目录有 3.13.6、正文是你自己写的 1.~6.)。这是你选的「跳过」策略的必然结果。如果看着别扭,可以改成「手写编号的也照插」(会叠成 3.1 1. xxx),或者改成「正文不插、只在目录里显示」,都只改一个开关。
编号把标题撑高 3px(h2 46→49、h3 37→40)。第一反应是行高,写了 line-height: inherit —— 无效;写死 46px 也无效;vertical-align: baseline/middle 也不对(48.52px)。
line-height: inherit
vertical-align: baseline/middle
真因是反直觉的:同行高下,行内盒的上下边界由半行距决定,而半行距把 content-area 居中塞进 line-height —— 字号越小半行距越大,盒底反而越往下探:
h2 (fs=24, L=46): 0.25×24 + (46−24)/2 = 17.00 span(fs=14.88,L=46): 0.25×14.88 + (46−14.88)/2 = 19.28 ← 多探 2.28
所以"让两者共用行高"不是解药,恰恰是病根。改成 display:inline-block + line-height:1(原子行内盒,只按自身内容高度参与排版)后实测 46→46、37→37,一分不多。
display:inline-block
line-height:1
几何判据里两条反证值得记:
inline
inherit
display:block
第二条是改了三版才写对的:前两版分别用「下沉量 < 行高一半」和「落在文字行 ± 字号」,都被 12px 的容差吃掉(实测基线编号顶本来就在文字行顶下方 12px),编号真掉行也不报红。最终改成判「编号与首行文字的垂直区间是否有交叠」——这是"在同一行"最直接的定义,且不受字体度量影响。
编号是页面上的样式,不动 post_content:编辑器、RSS、搜索结果、摘要里都不会出现编号。后台开关一关即全部消失,文章内容一个字不用改。
编号,灰色弱化可以,但是字体不能太小,要不然很不协调,看着难受,字号改成和每一级的标题一样吧,我再看看效果。
拆成三条:① 灰色弱化保留;② 字号不能太小(否掉 0.62em);③ 字号改成和每一级标题一样。
assets/css/site.css 里 .yang-h-num 两处属性值:
assets/css/site.css
.yang-h-num
font-size
1em
margin-right
0.35em
0.25em
⚠️ margin-right 为什么必须跟着改:em 是相对编号自身字号的。字号从 14.88px 变 24px 后,同一个 0.35em 会从 5.2px 涨到 8.4px,编号和标题之间像被硬拉开。收到 0.25em 后是 6.0px,与原来的 5.2px 观感接近。
em
display:inline-block + line-height:1 保留,但理由变了:
h2 编号 24px vs 标题 24px h3 编号 20px vs 标题 20px h4 编号 17px vs 标题 17px 标题高度:加编号 46.0 / 不加 46.0 → 差 0.00px
_geom362.js
_toc30_number_check.php
_toc30_real_check.php
_toc30_equiv.php
_toc30_falsify.php
_mkzip363.py
_mkzip363_falsify.py
反证 R1 失效 —— 字号改 1em 后,光回退 display+line-height 不再撑高了(实测仍 46px),反证报「仍是绿,判据无效」。根因不是判据没牙齿,而是注入形态不完整:撑高需要「小字号」这个前提。改成三条同时回退(0.62em + inline + inherit)后红出 3.00px。
display
line-height
G8 判据方向失效 —— 原来是「编号字号 < 标题」,字号改同大后恒假。改成 Math.abs(n - h) < 0.01(用容差不用严格 ===,防浏览器返回 23.999)。
Math.abs(n - h) < 0.01
===
两处旧断言会假红 —— _toc30_number_check.php 的 J3、_preview362.js 第 120 行、_mkzip363 第 6 节,都还写着 0.62em。这类「判据脚本自身过期」在相邻判据整齐报红时最容易误判成产品坏了(pitfalls #459)。
J3
_preview362.js
_mkzip363
kratos_yang-3.2.63.zip
ce757f325c0928f44d0e053d834c7da7
/theme-update/
update.json
puc_external_updates_theme-Kratos_Yang
checkForUpdates()
wp sees: kratos_yang -> 3.2.63
0c8cee9
wp-content/themes/kratos_yang/
请在后台点升级到 3.2.63,然后看一眼长文章的标题编号字号是否顺眼。升级后我再量一次线上真实几何做收尾。
另:#5240 那 6 个手写编号的 h3 仍是「无编号」而目录显示 3.1~3.6 —— 这是「检测到已有编号就跳过」的既定行为。若觉得正文与目录在该段对不上,可以改成「手写编号也加前缀」或「手写编号的条目从目录里也去掉」,等您的意见。
#5240
用户已在后台升级到 3.2.63,本次复验不拦截 CSS,直接量服务器上真实生效的样式(_live363.js)。
_live363.js
桌面 1440 与手机 390 各测了 4 个带编号的 h2:
编号字号 = 标题字号 24 vs 24 ✅ 逐条 编号颜色 rgb(168,171,178) ✅ 编号字重 400 ✅ 编号与文字间距 6.00px ✅(0.25em × 24 = 6.0) 编号与文字不重叠 编号右 124.08 / 文字左 130.08 ✅ 编号与文字同一行 垂直交叠 24.00px ✅
前置判据也验了:线上 style.css 的 Version 确实是 3.2.63,且 site.css 是真实加载(不是缓存未命中)。
style.css
Version
site.css
用户对 3.2.62 的反馈是「字体不能太小,很不协调,看着难受」,3.2.63 已按「字号和每一级标题一样」改完,弱化只靠颜色 + 字重。
#5240 那 6 个手写编号的 h3 在正文里不显示编号(目录显示 3.1~3.6),因为「检测到已有编号就跳过」是当初选定的策略。若日后觉得该段正文与目录对不上,可改策略,另开单处理。
打包 kratos_yang-3.2.63.zip(md5 ce757f325c0928f44d0e053d834c7da7),commit 0c8cee9。
No dependencies set.
The note is not visible to the blocked user.
现象
目录里的条目是带编号的(1 / 1.1 / 2 / 2.1…),但正文里的标题一个编号都没有,两边对不上,读文章时没法照着目录找。
用户原话:
已实测确认的现状(线上真实页面,不是源码推断)
目录侧的编号规则:已经是「按实际最高级别归一」
抓线上真实 HTML 里的
<span class="yang-toc-num">:1 / 2 / 3 / 3.1~3.6 / 41~71 / 1.1~1.6 / 2 / 2.1~2.2即
yang_toc_build_list()里的lstack/depth归一化已经做到了「没 h1 就让 h2 当一级」。所以编号算法本身不用改,正文复用同一份结果即可,这样两边天然一致,不会出现两套算法漂移。正文标题的级别分布(近 300 篇)
绝大多数文章就是「没有 h1,h2 当一级」,与用户描述一致。
隐患:已有手写编号的标题
#5240 的 6 个 h3 标题是手写的:
自动编号后会变成
3.1 1. 自定义短语—— 双层编号。方案(用户三项选择已确认)
.yang-toc-num的灰色小字风格一致)toc_levels勾哪几级就编哪几级,现在默认 1/2/3)post_content)验收标准
depth算法,一份结果两处用)。h2/h3的文章得到1 / 2 / 2.1 / 3,不是2 / 3 / 3.1 / 4。h3×7得到1~7。h2→h4→h3→h2这种顺序,编号连续、不重号、不跳号。post_content:编号在渲染时(the_content过滤器)加上,不写库、不进编辑器、不影响 RSS/搜索/摘录。h3.ar-year与评论区 h3 不受影响(3.2.60 已建立的两处让路规则必须继续成立)。id仍由标题原文生成,已有外链不失效。待确认的边界(实现中若发现,回来补评论)
yang_toc_make_id已有section兜底)如何编号。h3里已有的1.这类识别得更宽(一、/(一)/第一章等已列入检测规则)。为什么单独建单
#28 是图片缩进几何问题、#29 是标题字号字重层级;本条是标题文本内容加编号,与两者无重叠
实现完成(3.2.62,已发到 /theme-update/)
commit
76c69b3,已推送。服务器主题仍是 3.2.61,等后台点升级(更新缓存已清,后台「更新」页现在能看到 3.2.62)。编号规则
1233.1~3.641~711.1~1.622.12.2122.1~2.434「没有 h1 时 h2 就是一级」是按 深度归一 实现的,不是按绝对 level:h2 的 level 是 2,若拿它当编号首段就会编成 "2"。归一后最外层深度恒为 0 ⇒ 首段恒为 1。
三项决策的落地
0.62em(h2 上是 14.88px、h3 上 12.41px),颜色#a8abb2,字重 400。与目录.yang-toc-num同风格。toc_levels那一份(现默认 1/2/3,故 h4 及以下不编号)。1.1、1)1)1.21.2.3一、(一)(1)第一章/节/部分。线上 124 个标题精准命中 6 个(#5240 那 6 条),零误伤;2026 年展望(数字后无分隔符)不误判。⚠️ 一点需要你确认:跳过的那些条目仍占着编号位置。所以 #5240 正文里那 6 个自己写了编号的 h3 不会出现 3.1
3.6,但后面那个 h2 依然是 4 —— 序列不错位。正文与目录在那一段看起来会"对不上"(目录有 3.13.6、正文是你自己写的 1.~6.)。这是你选的「跳过」策略的必然结果。如果看着别扭,可以改成「手写编号的也照插」(会叠成 3.1 1. xxx),或者改成「正文不插、只在目录里显示」,都只改一个开关。中途修掉一个我自己造的问题
编号把标题撑高 3px(h2 46→49、h3 37→40)。第一反应是行高,写了
line-height: inherit—— 无效;写死 46px 也无效;vertical-align: baseline/middle也不对(48.52px)。真因是反直觉的:同行高下,行内盒的上下边界由半行距决定,而半行距把 content-area 居中塞进 line-height —— 字号越小半行距越大,盒底反而越往下探:
所以"让两者共用行高"不是解药,恰恰是病根。改成
display:inline-block+line-height:1(原子行内盒,只按自身内容高度参与排版)后实测 46→46、37→37,一分不多。验证
几何判据里两条反证值得记:
inline+inherit⇒ 高度差 3.00px(G5 如期报红,数值正是原 bug)display:block独占一行 ⇒ G3 差 14.88px(如期报红)第二条是改了三版才写对的:前两版分别用「下沉量 < 行高一半」和「落在文字行 ± 字号」,都被 12px 的容差吃掉(实测基线编号顶本来就在文字行顶下方 12px),编号真掉行也不报红。最终改成判「编号与首行文字的垂直区间是否有交叠」——这是"在同一行"最直接的定义,且不受字体度量影响。
附带说明
编号是页面上的样式,不动
post_content:编辑器、RSS、搜索结果、摘要里都不会出现编号。后台开关一关即全部消失,文章内容一个字不用改。3.2.63:字号改成与各级标题一致
用户原话:
拆成三条:① 灰色弱化保留;② 字号不能太小(否掉 0.62em);③ 字号改成和每一级标题一样。
改了什么
assets/css/site.css里.yang-h-num两处属性值:font-size0.62em(h2 上 14.88px)1em(h2 24 / h3 20 / h4 17px)margin-right0.35em(5.2px)0.25em(6.0px)⚠️
margin-right为什么必须跟着改:em是相对编号自身字号的。字号从 14.88px 变 24px 后,同一个0.35em会从 5.2px 涨到 8.4px,编号和标题之间像被硬拉开。收到0.25em后是 6.0px,与原来的 5.2px 观感接近。display:inline-block+line-height:1保留,但理由变了:inline+inherit也是 46px),因为撑高的根源是「小字号的半行距更大」;实测(线上真实文章页,桌面 1440 + 手机 390)
判据
_geom362.js,G8 改为判「相等」)_toc30_number_check.php,J3 方向反转)_toc30_real_check.php)_toc30_equiv.php)_toc30_falsify.php)_mkzip363.py)_mkzip363_falsify.py)这一轮踩到的三个判据坑(都已修)
反证 R1 失效 —— 字号改 1em 后,光回退
display+line-height不再撑高了(实测仍 46px),反证报「仍是绿,判据无效」。根因不是判据没牙齿,而是注入形态不完整:撑高需要「小字号」这个前提。改成三条同时回退(0.62em+inline+inherit)后红出 3.00px。G8 判据方向失效 —— 原来是「编号字号 < 标题」,字号改同大后恒假。改成
Math.abs(n - h) < 0.01(用容差不用严格===,防浏览器返回 23.999)。两处旧断言会假红 ——
_toc30_number_check.php的J3、_preview362.js第 120 行、_mkzip363第 6 节,都还写着0.62em。这类「判据脚本自身过期」在相邻判据整齐报红时最容易误判成产品坏了(pitfalls #459)。交付
kratos_yang-3.2.63.zip,md5ce757f325c0928f44d0e053d834c7da7/theme-update/(zip + readme 13 节),update.json已切 3.2.63puc_external_updates_theme-Kratos_Yang并checkForUpdates(),实测wp sees: kratos_yang -> 3.2.63,后台可见更新0c8cee9wp-content/themes/kratos_yang/,只走/theme-update/待用户确认
请在后台点升级到 3.2.63,然后看一眼长文章的标题编号字号是否顺眼。升级后我再量一次线上真实几何做收尾。
另:
#5240那 6 个手写编号的 h3 仍是「无编号」而目录显示 3.1~3.6 —— 这是「检测到已有编号就跳过」的既定行为。若觉得正文与目录在该段对不上,可以改成「手写编号也加前缀」或「手写编号的条目从目录里也去掉」,等您的意见。线上复验通过,关闭
用户已在后台升级到 3.2.63,本次复验不拦截 CSS,直接量服务器上真实生效的样式(
_live363.js)。复验结果:53 条 / 0 失败
桌面 1440 与手机 390 各测了 4 个带编号的 h2:
前置判据也验了:线上
style.css的Version确实是 3.2.63,且site.css是真实加载(不是缓存未命中)。本工单三版回顾
0.62em→1em(各级与标题同大),margin-right同步0.35em→0.25em用户对 3.2.62 的反馈是「字体不能太小,很不协调,看着难受」,3.2.63 已按「字号和每一级标题一样」改完,弱化只靠颜色 + 字重。
遗留(不阻塞关单)
#5240那 6 个手写编号的 h3 在正文里不显示编号(目录显示 3.1~3.6),因为「检测到已有编号就跳过」是当初选定的策略。若日后觉得该段正文与目录对不上,可改策略,另开单处理。打包
kratos_yang-3.2.63.zip(md5ce757f325c0928f44d0e053d834c7da7),commit0c8cee9。