热电阻热电偶分度表与VC源码:工业测温采集核心实现

简介:这份资源是环形电子工作室(LOOPER STUDIO)出品的「热电偶-热电阻分度表」查询软件及其VC源码,面向从事温度测量的工程师、科研人员以及学习传感器技术的在校学生。它解决了PT100、PT1000等热电阻与S、B、K、E、T、J、N、R等全序列热电偶在温度换算时查表繁琐的问题,通过查表法快速给出温度-电阻、温度-电动势对应值,省去复杂数学计算。压缩包共43个文件、约558KB,包含16个PDF分度表文档、8个h头文件与5个cpp源文件,另有工程配置、资源脚本及可执行程序,PDF用于查阅各型号分度数据,源码则完整呈现界面设计与转换算法实现。目前已有442人学习下载。读者既能直接使用软件完成精确温度转换与校准,也能通过阅读VC源码理解查表法、温度-电信号转换逻辑及MFC界面开发思路,适合作为工业测温实践与课程设计的参考素材。

1. 热电阻/热电偶分度表与VC源码:工业测温采集绕不开的那张表

车间里一台老设备温度显示飘了十几度,现场排查半天,最后发现是采集程序里把PT100的阻值直接按线性公式换算成了温度。铂电阻的阻值-温度曲线根本不是直线,0到100℃之间用线性近似误差还能忍,到了400℃以上偏差能拉到好几度。这类问题在工业测温项目里太常见了,而解决它的核心工具就是分度表——把阻值或热电势对应到温度的权威数据表。这份资源给的就是热电阻、热电偶常用分度表的完整数据,外加一套VC源码,能直接嵌到采集程序里做查表换算。适合做工业仪表、数据采集、嵌入式上位机的开发者,尤其是需要离线、不依赖第三方库做温度换算的场景。PT100、PT1000、K型、S型、B型这些常见型号的分度数据都在里面,源码用C++写成,Visual C++环境下可以直接编译运行。

2. 分度表到底存了什么:从PT100到K型的映射逻辑

2.1 热电阻分度表:PT100的阻值-温度对应关系

PT100的分度表本质上是一张二维映射表,输入是电阻值(欧姆),输出是温度(摄氏度)。标准IEC 60751定义的PT100在0℃时阻值100Ω,100℃时138.51Ω,200℃时175.86Ω。注意这个增量不是均匀的——0到100℃涨了38.51Ω,100到200℃只涨了37.35Ω,越往高温走每度对应的阻值增量越小。这就是为什么线性换算在宽温区会翻车。

分度表通常按1℃或10℃间隔给出阻值,中间温度用线性插值。源码里一般会存一个浮点数组,索引对应温度,值对应阻值。反查的时候用二分查找定位区间,再做一次线性插值。下面是一个典型的PT100分度表存储结构:

// PT100分度表,-200℃到850℃,步长1℃ // 数据来源:IEC 60751标准 const float PT100_TABLE[] = { 18.52f, 18.92f, 19.33f, 19.73f, 20.13f, // -200℃ ~ -196℃ // ... 中间省略 ... 100.00f, // 0℃ 100.39f, 100.78f, 101.17f, 101.56f, 101.95f, // 1℃ ~ 5℃ // ... 后续数据 ... 390.48f // 850℃ }; const int PT100_TABLE_SIZE = sizeof(PT100_TABLE) / sizeof(PT100_TABLE[0]); const float PT100_START_TEMP = -200.0f; // 表起始温度

这段代码的关键参数有三个:PT100_TABLE是阻值数组,PT100_TABLE_SIZE是表长度,PT100_START_TEMP是起始温度。查表时用(targetTemp - PT100_START_TEMP)算出索引,取相邻两个值做插值。注意数组里存的是阻值,反查温度时需要反过来遍历比较,或者预先建一张反向索引表加速。

2.2 热电偶分度表:热电势与温度的冷端补偿问题

热电偶比热电阻麻烦的地方在于冷端补偿。热电偶输出的是热端和冷端之间的温差电势,分度表给出的热电势是以0℃为冷端参考的。实际使用时冷端温度不可能是0℃,所以必须做补偿。K型热电偶在25℃冷端、热端100℃时,实测热电势是3.003mV,但分度表上100℃对应4.096mV,差值就是冷端25℃对应的1.093mV。

源码里处理冷端补偿的常见做法是:先测冷端温度(用PT100或集成温度传感器),查表得到冷端对应的热电势,加到实测热电势上,再用总和去查热端温度。下面是一个K型热电偶的查表函数框架:

// K型热电偶分度表,-200℃到1372℃,步长1℃ // 存储的是热电势,单位mV const float K_TYPE_TABLE[] = { -5.891f, -5.757f, -5.622f, // -200℃ ~ -198℃ // ... 中间省略 ... 0.000f, // 0℃ 0.039f, 0.079f, 0.119f, // 1℃ ~ 3℃ // ... 后续数据 ... 54.886f // 1372℃ }; // 冷端补偿查表:根据冷端温度查热电势 float getColdJunctionVoltage(float coldTemp) { int index = (int)(coldTemp - K_TYPE_START_TEMP); if (index < 0 || index >= K_TYPE_TABLE_SIZE - 1) { return 0.0f; // 越界保护 } float frac = coldTemp - K_TYPE_START_TEMP - index; // 线性插值 return K_TYPE_TABLE[index] * (1 - frac) + K_TYPE_TABLE[index + 1] * frac; } // 热端温度计算 float calcHotJunctionTemp(float measuredVoltage, float coldTemp) { float coldVoltage = getColdJunctionVoltage(coldTemp); float totalVoltage = measuredVoltage + coldVoltage; // 反查分度表得到热端温度 return lookupTempByVoltage(totalVoltage); }

getColdJunctionVoltage做的是冷端温度到热电势的映射,calcHotJunctionTemp把实测热电势和冷端补偿电势相加后反查。注意measuredVoltage是ADC采集到的原始热电势,单位要和分度表一致(通常是mV)。冷端温度一般用板载温度传感器读,精度不用太高,±0.5℃以内对最终结果影响很小。

2.3 分度表数据的存储格式与精度取舍

分度表数据量不小。PT100从-200到850℃按1℃步长有1051个点,每个float占4字节就是4KB多。热电偶表也差不多。在资源紧张的嵌入式环境里,常见做法是降步长到5℃或10℃,中间靠插值补。步长10℃时PT100表缩到106个点,插值误差在0.1℃以内,对大多数工业场景够用。

另一种做法是存多项式系数而不是整张表。PT100在0到850℃可以用Callendar-Van Dusen方程拟合,只需要四个系数。但多项式计算涉及浮点乘方,在低端MCU上比查表慢。所以源码里两种方式都给了:PC端用查表保证精度,嵌入式端可以切到多项式模式省空间。VC源码里通过宏定义切换:

#define USE_LOOKUP_TABLE 1 // 1=查表模式,0=多项式模式 #if USE_LOOKUP_TABLE // 查表实现 #else // Callendar-Van Dusen方程实现 float r = R0 * (1 + A * t + B * t * t); #endif

这个宏在工程配置里改一下就能切换,不用动业务代码。

3. VC源码工程结构:从分度表数据到可调用接口

3.1 工程目录与核心文件说明

源码包解压后是一个标准的VC6或VS工程目录,结构大致如下:

TempSensorProject/ ├── TempSensor.dsw // VC6工作区文件 ├── TempSensor.dsp // VC6工程文件 ├── src/ │ ├── main.cpp // 测试入口,演示查表调用 │ ├── RTDTable.cpp // 热电阻分度表实现 │ ├── RTDTable.h // 热电阻接口声明 │ ├── TCTable.cpp // 热电偶分度表实现 │ ├── TCTable.h // 热电偶接口声明 │ └── TableData.h // 分度表原始数据 ├── test/ │ └── test_cases.txt // 测试用例,含标准值对照 └── doc/ └── 分度表说明.txt // 数据来源和精度说明

TableData.h是纯数据文件,里面就是几个大数组。RTDTable.cpp和TCTable.cpp封装了查表、插值、反查的逻辑。main.cpp里有一个简单的控制台程序,读入阻值或热电势,输出温度,方便验证。

3.2 核心接口函数与调用方式

热电阻模块对外暴露的接口很简洁:

// RTDTable.h class CRTDTab { public: // 根据阻值反查温度,返回摄氏度 static float ResistanceToTemp(float resistance, int type = PT100); // 根据温度查阻值 static float TempToResistance(float temp, int type = PT100); // 设置是否使用高精度模式(步长1℃ vs 步长10℃) static void SetHighPrecision(bool enable); };

ResistanceToTemp是采集程序里最常用的。调用时传入ADC换算后的阻值,返回温度。type参数支持PT100、PT1000、Cu50等,内部用不同的表。SetHighPrecision控制用哪张表,高精度模式内存占用大但误差小。

热电偶模块接口类似,但多一个冷端补偿参数:

// TCTable.h class CTCTab { public: // 根据热电势和冷端温度计算热端温度 static float VoltageToTemp(float voltage, float coldTemp, int type = K_TYPE); // 根据热端温度和冷端温度计算热电势 static float TempToVoltage(float hotTemp, float coldTemp, int type = K_TYPE); };

VoltageToTemp的voltage参数是实测热电势,单位mV;coldTemp是冷端温度,单位℃。返回热端温度。注意如果冷端温度本身就是0℃,传0进去就行,函数内部会跳过补偿。

3.3 编译与运行验证步骤

用VC6或VS打开工程文件,直接Build。如果用的是新版VS,可能需要把工程升级一下,字符集改成多字节。编译通过后运行,控制台会提示输入:

请输入阻值(Ω)或热电势(mV),输入q退出:

输入100,回车,输出应该是0.00℃左右。输入138.51,输出100.00℃。热电偶模式下输入4.096,冷端温度输0,输出100.00℃。测试用例文件里有几十组标准值,可以逐条对照。

如果编译报错找不到TableData.h,检查一下包含路径。VC6默认从当前目录找头文件,VS需要手动加src目录到包含路径。另一个常见问题是浮点精度,VC6的float在某些运算下会丢精度,把中间变量改成double能解决。

4. 避坑与排查:分度表使用中的五个血泪教训

4.1 现象:温度在0℃附近跳变严重

原因:PT100在0℃附近阻值变化率约0.39Ω/℃,如果ADC分辨率不够或者参考电压不稳,阻值测量误差0.1Ω就会导致0.25℃的温度跳动。源码里的插值算法本身没问题,问题出在输入数据上。

解决:检查ADC的有效位数和参考电压。12位ADC在100Ω量程下分辨率约0.024Ω,对应0.06℃,勉强够用。如果跳动还是大,在源码里加一个滑动平均滤波,对连续5次阻值采样取中值再查表。

4.2 现象:高温段温度偏差越来越大

原因:用了线性换算而不是查表。有些开发者图省事,直接用(R - 100) / 0.385算温度,这个系数只在0℃附近成立。到500℃时PT100的阻值约280Ω,线性公式算出来467℃,实际查表是500℃,差了33℃。

解决:老老实实查表。源码里的ResistanceToTemp函数已经处理了非线性,直接调用就行。如果嫌表大,用步长10℃的表加插值,误差也能控制在0.5℃以内。

4.3 现象:热电偶测温结果比实际低十几度

原因:忘了做冷端补偿。分度表是以0℃冷端为基准的,如果冷端实际是30℃,不补偿的话热端温度会偏低约30℃对应的热电势。K型热电偶30℃对应1.203mV,在100℃附近1.203mV约等于30℃,所以偏差直接体现在结果上。

解决:调用VoltageToTemp时传入实测冷端温度。冷端温度可以用板载PT100或DS18B20读。如果冷端温度稳定,也可以直接在代码里写死一个常数,但要注意环境温度变化。

4.4 现象:查表结果偶尔出现负温度或超量程值

原因:输入阻值或热电势超出了分度表的范围。比如PT100表从-200℃开始,对应阻值18.52Ω,如果输入10Ω,索引算出来是负数,数组越界访问,结果不可预测。

解决:在查表函数入口加范围检查。源码里ResistanceToTemp开头有:

if (resistance < PT100_TABLE[0] || resistance > PT100_TABLE[PT100_TABLE_SIZE - 1]) { return -999.0f; // 错误码 }

调用方拿到-999就说明输入异常,该检查传感器接线或ADC配置了。

4.5 现象:多线程环境下查表结果错乱

原因:SetHighPrecision这类全局状态函数在多线程下被并发调用,一个线程切了高精度表,另一个线程还在用旧索引访问新表,数据对不上。

解决:要么在程序初始化时一次性设定精度模式,运行中不改;要么给状态变量加锁。源码里默认是初始化时设定,SetHighPrecision只在main开头调一次。如果确实需要动态切换,把表指针改成线程局部存储。

5. 二次开发改造:从查表到自定义传感器适配

拿到这份源码后,最常见的改造需求是适配非标传感器。比如手头有一批PT1000,或者某个国产热电偶的分度曲线和标准K型有偏差。改造思路分三步:换数据、改接口、验精度。

换数据最直接。TableData.h里的数组替换成自己的标定数据就行。注意数组长度和起始温度要同步改,PT100_TABLE_SIZE和PT100_START_TEMP这两个常量在RTDTable.cpp里被引用,改完数据后要一起更新。如果标定数据是离散点,步长不固定,那就不能用简单索引了,得改成二分查找。下面是一个支持非均匀步长的查表实现:

// 非均匀步长查表:data是阻值数组,temp是温度数组,len是点数 float lookupNonUniform(const float* data, const float* temp, int len, float value) { if (value <= data[0]) return temp[0]; if (value >= data[len - 1]) return temp[len - 1]; int low = 0, high = len - 1; while (high - low > 1) { int mid = (low + high) / 2; if (data[mid] > value) { high = mid; } else { low = mid; } } // 在low和high之间线性插值 float ratio = (value - data[low]) / (data[high] - data[low]); return temp[low] + ratio * (temp[high] - temp[low]); }

这个函数不依赖固定步长,data和temp一一对应,len是点数。二分查找定位区间后做线性插值。参数value是待查的阻值或热电势,返回对应温度。改造时把原来的索引查表替换成这个函数,数据从TableData.h里读。

改接口主要是加传感器类型。源码里type参数用int枚举,加一个新类型就在RTDTable.cpp里加一个case分支,指向新的数据数组。如果传感器数量多,建议改成注册机制:用一个结构体存传感器名称、数据指针、表长度、起始温度,运行时遍历匹配。这样加新传感器不用改核心代码,只加一条注册记录。

验精度是最后一步,也是最容易翻车的地方。我一般会做三组验证:零点验证(0℃附近的阻值或热电势)、满量程验证(上限温度附近)、中间点抽查(每隔100℃取一个点)。每组用标准电阻箱或mV信号源输入,记录输出温度,和标准分度表对照。偏差超过0.5℃就要查数据源是不是有问题。验证通过后,把测试用例补到test_cases.txt里,下次改代码跑一遍回归。

从那以后我每次拿到新的分度表数据,都强制走一遍零点、满量程、中间点这三组验证,再急的项目也不跳过。希望帮到你。

本文还有配套的精品资源,点击获取

相关新闻

SAP采购订单行项目修改实战:BAPI_PO_CHANGE存储地点与计划行更新指南

SAP采购订单行项目修改实战:BAPI_PO_CHANGE存储地点与计划行更新指南

上个月接了一个采购订单接口改造的需求&#xff1a;外部供应商协同平台调用SAP时&#xff0c;不仅要能创建订单&#xff0c;还要能直接改已存在订单的行项目&#xff0c;具体就两项——把行项目上的发货/收货存储地点换掉&#xff0c;同时调整计划行里的交货日期和数量。需求听…

2026/10/19 16:17:17 阅读更多 →
MATLAB小波包分解实战:从wavedec到wpdec的信号特征提取与去噪

MATLAB小波包分解实战:从wavedec到wpdec的信号特征提取与去噪

简介&#xff1a;小波&#xff08;包&#xff09;分解MATLAB程序面向信号处理与故障诊断领域的学习者和工程师&#xff0c;解决非平稳信号时频分析的编程实践问题。压缩包共2个文件&#xff0c;均为m脚本&#xff0c;分别处理原始信号和含噪信号&#xff0c;涵盖数据加载、预处…

2026/10/19 16:17:17 阅读更多 →
基于CNN卷积神经网络的辣椒类别识别:从数据到训练部署的完整指南

基于CNN卷积神经网络的辣椒类别识别:从数据到训练部署的完整指南

毕设选深度学习方向&#xff0c;十个人里有八个都在做图像分类&#xff0c;但图像分类也分三六九等。你要是还在做猫狗识别、垃圾分类这种烂大街的题目&#xff0c;答辩老师大概率看一眼就翻页了。今天聊一个既接地气又有完整落地场景的方向&#xff1a;基于CNN卷积神经网络对辣…

2026/10/19 16:16:11 阅读更多 →

最新新闻

RGAT+GRU融合模型解决APT溯源图稀疏漏报问题

RGAT+GRU融合模型解决APT溯源图稀疏漏报问题

简介&#xff1a;本资源是华中科技大学2023届计算机相关专业&#xff08;如计科、人工智能、网络安全等&#xff09;优秀毕业设计成果&#xff0c;聚焦APT攻击检测这一前沿安全问题&#xff0c;提出并实现了一种基于溯源图建模与RGATGRU融合架构的检测方法优化方案。面向在校本…

2026/10/19 17:38:44 阅读更多 →
文件格式伪装揭秘:从魔数原理到apate工具实战

文件格式伪装揭秘:从魔数原理到apate工具实战

很多人在第一次听说“文件格式伪装”时&#xff0c;第一反应都是&#xff1a;这玩意儿真的能实现吗&#xff1f;改个扩展名谁不会&#xff0c;把.txt改成.exe&#xff0c;文件不照样打不开&#xff1f;如果你也这么想&#xff0c;说明你还没真正理解文件识别的底层逻辑。文件格…

2026/10/19 17:38:44 阅读更多 →
Source Map泄露实战:从检测还原到构建防御的完整指南

Source Map泄露实战:从检测还原到构建防御的完整指南

接手一个站点做安全评估的时候&#xff0c;我习惯先打开开发者工具的 Sources 面板&#xff0c;随手翻一下静态资源目录。很多时候问题就藏在那些不起眼的*.js.map文件里——Webpack 构建后遗留的 Source Map&#xff0c;一旦暴露在生产环境&#xff0c;等于把源码打包好递到别…

2026/10/19 17:38:44 阅读更多 →
MySQL存储过程实战:语法、游标、动态SQL与性能优化全解析

MySQL存储过程实战:语法、游标、动态SQL与性能优化全解析

这年头一说起MySQL存储过程&#xff0c;不少开发者的第一反应就是“能不用就不用”、“业务逻辑别放进数据库”。我早些年也是这个态度&#xff0c;直到接手了几个数据清洗、批量报表、复杂统计类的项目&#xff0c;被接口超时和网络往返折腾得没脾气&#xff0c;才老老实实回头…

2026/10/19 17:38:44 阅读更多 →
Spark性能优化实战:从数据倾斜到资源配置的完整调优指南

Spark性能优化实战:从数据倾斜到资源配置的完整调优指南

1. 为什么 Spark 性能优化是个绕不开的坎干过大数据的人都有一个共识&#xff1a;Spark 作业能跑起来不难&#xff0c;难的是跑得又快又稳。我见过太多团队&#xff0c;集群规模不小&#xff0c;机器配置也不差&#xff0c;但一个 ETL 任务动辄跑两三个小时&#xff0c;资源利用…

2026/10/19 17:38:44 阅读更多 →
open-code-review实战:从零搭建开放可持续的代码审查机制

open-code-review实战:从零搭建开放可持续的代码审查机制

1. 为什么“open-code-review”值得单独拿出来聊第一次听到“open-code-review”这个词&#xff0c;很多人会下意识觉得它只是“代码审查”换了个英文壳子。但真在团队里推过代码审查的人都知道&#xff0c;代码审查这件事&#xff0c;做一次两次不难&#xff0c;难的是把它做成…

2026/10/19 17:37:42 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介&#xff1a;本资源为电源技术方向的学术研究文档&#xff0c;聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略&#xff0c;面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址&#xff1a; https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集&#xff0c;共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →