Tesseract 3.02 Win32开发包接入指南:链接配置与避坑实践
简介tesseract-3.02.02-win32-lib-include-dirs源文件压缩包是为Windows 32位环境准备的Tesseract OCR引擎开发套件。它面向需要在C/VS项目中集成文字识别能力的开发者解决Tesseract 3.02.02在Win32下编译配置繁琐的问题。包内共36个文件约27.1MB包含24个头文件、4个静态与导入库文件、2个运行时DLL、2个Visual Studio属性表以及说明文档和导出文件既能支撑API调用与程序链接也方便在VS中直接加载配置。目前已有456人学习/下载适合希望快速搭建OCR开发环境、避免手动编译依赖的读者。借助这份带目录结构的SDK你可直接配置头文件路径与库引用快速进入字符识别功能的编码与调试。1. 老版本 Tesseract 在 Win32 下的开发包为什么 2024 年还有人找 tesseract-3.02.0上个月有个 A 同学从某公司接手一个维护了八年的 ERP 系统里面跑着一段扫码识别逻辑底层就是 Tesseract 3.02。他遇到的问题是开发机换成了 Win1164 位库链接不上但老系统发布环境是 32 位。翻遍网盘和备份才在内部服务器找到一份当初编译好的 tesseract-3.02.02-win32-lib-include-dirs 开发包。这种列目录式的资源包不像完整源码那样有 install 脚本拿过来不会配等于一堆废文件。这篇笔记就从这个包的实际目录结构讲起说清楚它解决什么问题、怎么接进 VS 工程、哪些坑会让人翻车。适合要维护老 Tesseract 项目的开发者尤其被 32/64 位和链接依赖折磨过的人。2. 开发包的本质include 目录里的 API 边界与 lib 目录的依赖关系2.1 include 目录3.02 特有的头文件组织方式Tesseract 3.02 的头文件不像 4.x 那样按 API 模块拆分得干净它把大多数公共接口集中在 baseapi.h 里剩下的是配套的类型声明。打开 include 目录大概率能看到 baseapi.h、capi.h、publictypes.h、resultiterator.h、pageiterator.h、strngs.h、thresholder.h 这几个。capi.h 暴露的是纯 C 接口用TessBaseAPI*句柄操作便于在 C 语言模块或跨语言绑定时调用baseapi.h 则是 C 类接口日常开发里普遍用的是后者。3.02 时代比较特殊的地方是GenericVector和STRING这些内部类型直接暴露在公共头文件里。这意味着用这个开发包写代码编译期必须要能解释这些模板类型不能只靠前置声明糊弄过去。所以 include 目录里一般还会带上 environment.h 和 platform.h这两个头文件负责处理__declspec(dllexport/dllimport)和 MSVC 的差异宏。如果自定义工程缺少 platform.h典型报错就是一堆TESS_API标识符未定义。2.2 lib 目录静态库与 DLL 的配对关系检查 lib 目录时要确认里面有 libtesseract.lib 和对应的 tesseract.dll。3.02 在 Win32 下的常见构建产物是编译期链接 libtesseract.lib运行期跑 tesseract.dll。链接器从 .lib 文件里找到函数符号的桩地址真正执行代码时再从 DLL 里按序号或名称映射。这个机制意味着两个很容易踩的坑一是 .lib 是 32 位而工程是 64 位链接器不给任何友好提示直接报 LNK2019 符号无法解析二是 DLL 不在 PATH 或 exe 同目录程序编译跑通但启动就崩。另外有些开发包把 lib 目录拆成 debug 和 release 两个子目录这是为了匹配不同的 CRT 运行库。Tesseract 3.02 官方源码默认用 /MT 静态链接 CRT 构建如果你的项目里用的是 /MD等到运行时再报0xc000007b错误就比较折磨了。拿到包先核实这两点比什么都重要。2.3 为什么老项目绑定 3.02API 变化与自由度权衡Tesseract 4.x 引入了 LSTM 识别引擎精度确实有明显提升但 API 做了不少调整比如SetPageSegMode的枚举值变了Init的参数也改动过。3.02 时代很多字符识别工程是基于旧接口封装好的换引擎要重改封装层、重新测试识别阈值、校准置信度判断逻辑工作量不比从零训练一个专用模型小。这时候留着 tesseract-3.02.0 的构建产物就是省钱的务实选择。3.02 还有一个特征它允许在 Init 时指定OcrEngineMode虽然只有OEM_TESSERACT_ONLY和OEM_DEFAULT两个有效配置但它保留了传统的字符切割和特征匹配流程。对印刷体数字、标准字体英文这类识别场景3.02 的准确率并不差很多而响应速度和内存占用比 4.x 更可控。理解这一点才不会拿到包后第一反应是嫌版本老想升级。对比项3.024.x识别引擎传统特征匹配LSTM 为主公共头文件复杂度较高内部类型外露更规范API 更聚合32 位构建支持原生态支持需额外处理老项目接口兼容性可直接替换安装目录需改动封装层3. 把开发包接进 VS 工程从包含目录到第一个成功的链接3.1 配置包含目录与库目录的三层步骤接这种目录型开发包配置思路不是「装库」而是把包里的目录映射到工程的 VC 目录里。以 Visual Studio 为例打开工程属性页在「VC 目录」的「包含目录」里加入 include 路径在「库目录」里加入 lib 路径。这一步只解决「找头文件和找 .lib」的问题不解决「用什么字符集编译」「要不要额外依赖」的问题。PropertyGroup LabelUserMacros TesseractIncludeDirD:\thirdparty\tesseract-3.02.02-win32\include/TesseractIncludeDir TesseractLibDirD:\thirdparty\tesseract-3.02.02-win32\lib/TesseractLibDir /PropertyGroup ItemDefinitionGroup ClCompile AdditionalIncludeDirectories$(TesseractIncludeDir);%(AdditionalIncludeDirectories)/AdditionalIncludeDirectories /ClCompile Link AdditionalLibraryDirectories$(TesseractLibDir);%(AdditionalLibraryDirectories)/AdditionalLibraryDirectories AdditionalDependencieslibtesseract.lib;liblept.lib;%(AdditionalDependencies)/AdditionalDependencies /Link /ItemDefinitionGroup上面是工程文件级的配置片段。用 UserMacros 的好处是换机器时只改目录根路径不需要逐个改配置。这里AdditionalDependencies里同时写了 libtesseract.lib 和 liblept.lib因为 3.02 的公共头文件会直接引用PIX结构体定义链接阶段必须解析 leptonica 里的图像读写函数符号。如果只链接 tesseract 的库而漏掉 liblept会在最终链接时报pixRead、pixDestroy等符号无法解析的错误。参数层面有个容易忽略的地方连接器找符号的顺序取决于AdditionalDependencies中的书写顺序。tesseract 的库内部依赖 leptonica所以 liblept 必须写在 libtesseract 之后。写反了在某些版本的 MSVC 下会出 LNK2005 或 LNK2019而且报错位置出现在无关文件上排查起来特别闹心。3.2 打包自带依赖 vs 共享系统依赖Tesseract 3.02 在 Windows 上的构建依赖一团乱麻核心库依赖 leptonicaleptonica 又依赖 zlib、libpng、libjpeg。开发包里如果只放了 tesseract 自身的 lib 和 include说明它假设你把 leptonica 链在了别处。我一般会单独建一个 third-party 目录把 leptonica 的 include 并进来再在工程里加一条预处理宏。#ifdef _MSC_VER #pragma comment(lib, libtesseract.lib) #pragma comment(lib, liblept.lib) #endif这段代码放在公共头文件引入之后是利用 MSVC 的#pragma comment把链接依赖固化在源码里比工程配置更不容易丢。但对于从其他团队接手的老工程不推荐直接删掉工程里的链接配置改用 pragma因为#pragma comment提高的是单文件编译的便利性如果工程里有多个源文件依赖保持在一个地方反而更清晰。关键变量是运行时库模式Tesseract 的libtesseract.lib如果是在 /MT 模式下编译的而你的工程是 /MD链接不会报错但分配内存的堆和释放内存的对不上最终体现在调用delete[] text时偶发崩溃。排查方式是打开 VS 的「配置属性 → C/C → 代码生成 → 运行库」把工程统一切到 /MT。这个设置必须对所有配置Debug/Release同步改只改 Release 会出现一种玄学现象Debug 正常Release 随机崩。3.3 链接成功的标志从报错反推缺少什么第一次链接时常见的报错链条如下我按「现象 → 原因 → 解决」直接列出来现象一LNK2019 unresolved external symbolpixReadreferenced in function main。原因工程没有链接 liblept或者 liblept.lib 的路径没被连接器搜索到。解决确认 liblept.lib 文件存在于 lib 目录加入AdditionalDependencies。现象二LNK2019 unresolved external symbol_TessBaseAPICreate。原因链接的 tesseract .lib 版本与 include 头文件版本不一致或 capi.h 与 baseapi.h 混用C 接口和 C 接口导出符号不同。解决统一通过#include baseapi.h使用 C 类不碰 capi.h。现象三链接成功但运行时提示找不到 tesseract.dll。原因lib 链接成功不代表 DLL 被加载。解决把 tesseract.dll 拷贝到 exe 输出目录或在 PATH 里加 lib 所在目录。4. 链接与运行避坑编码、位数、依赖顺序三个雷区4.1 字符集引发的前置编译报错Tesseract 3.02 的头文件在 Windows 下有一个非常隐蔽的坑如果工程字符集设置为 Unicode编译时 baseapi.h 里涉及STRING类型与char*交互的代码可能报 C2440 无法从const wchar_t*转换为const char*。原因是 3.02 的头文件里有少量重载函数会用TESS_API宏包装字符串参数在 Unicode 字符集下 MSVC 把TEXT()宏展开成宽字符而 tesseract 内部始终是 UTF-8 单字节流。解决方式是把工程的「字符集」改为「使用多字节字符集」。如果项目强依赖 Unicode 编译那只能单独建一个翻译单元.cpp在这个文件里对 Tesseract 相关调用做窄字符封装再输出成全工程可见的接口。这是维护老库时的常规隔离手法相当于给老库焊一个适配层不让它的字符集传染整个工程。4.2 32/64 位混用连接期报错这个坑我见过太多次开发包的目录名写着 win32有些同事拿到之后不检查直接在 x64 平台配置上链接。编译器不报错链接器也不报错但运行时访问内存就崩。更阴间的是如果开发包里刚好同时留下了 win32 和 x64 两套 lib而工程配置用的是$(Platform)宏去拼接路径切平台时路径自动漂移表面上平台配置没错实际链接的还是另一套。排查办法链接前在源文件里写一行预处理输出。#ifdef _WIN32 #ifdef _M_X64 #pragma message(Building for x64) #elif _M_IX86 #pragma message(Building for x86) #endif #endif编译时看 Output 窗口的消息确认当前编译平台和开发包位数一致。这个检查动作 10 秒能省掉后面 3 小时的崩溃排查。切到 64 位工程时注意Tesseract 3.02 在 x64 下运行不一定有问题但很多旧版构建产物只做了 win32必须在编译期强制限定 x86 平台避免运行到目标机器上才发现 CPU 指令集不匹配。4.3 TESSDATA_PREFIX 指向错误目录链接通过只是开始运行时报错通常集中在 tessdata 语言数据加载。Tesseract 3.02 的 Init 调用里第一个参数是 datapath第二个是语言代码。如果 datapath 传 NULL库内部会去读取TESSDATA_PREFIX环境变量。这个环境变量指向的必须是一个直接包含tessdata子目录的父目录而不是 tessdata 本身。常见错误是把环境变量写成D:\tesseract\tessdata程序启动后报告找不到eng.traineddata或chi_sim.traineddata。原因是库内部拼路径时写的是$(TESSDATA_PREFIX)\tessdata\$(lang).traineddata。正确配置为set TESSDATA_PREFIXD:\tesseract同时检查该目录下有tessdata\eng.traineddata。如果程序是在服务里运行注意服务进程的环境变量和交互式终端的环境变量不是一套配置完成后务必重启服务。4.4 语言包缺失导致识别输出乱码这个坑排在语言数据之后程序能跑但识别结果全是黑块或空白。大多数情况下是页面分割模式PageSegMode和输入图片不匹配。3.02 里默认的PSM_SINGLE_BLOCK适合整段文本识别单行数字时反而效果差。把模式显式设为PSM_SINGLE_LINE或PSM_TESSERACT_ONLY是个有效做法。另一个经常被忽视的因素3.02 不做自动方向检测输入图片如果带了旋转输出会是个灾难。这也是老版本和 4.x 的显著差异。在调用SetImage之前先用 leptonica 的函数读图再手动判断图像宽度高度比值而不是把预处理压力全丢给识别引擎。Pix* image pixRead(captcha.png); if (!image) { fprintf(stderr, pixRead failed\n); return -1; } // 3.02 里做灰度化和二值化推荐在识别前完成 Pix* gray pixConvertRGBToGray(image, 0.33f, 0.34f, 0.33f); Pix* binary pixThresholdToBinary(gray, 128); api.SetImage(binary);这段代码里的灰度转换权重是 leptonica 的标准人脸加权系数不是随便拍的。3.02 对二值图的支持最稳定直接喂彩色图会让内部阈值算法产生不可预期的噪点翻车率不低。5. 验证与进阶一个最小识别例程以及三个常用调优参数5.1 跑通完整链路的最小例程配置链接跑通之后可以用这个例程做冒烟测试。核心逻辑是初始化 API → 设置语言 → 读图 → 识别 → 输出文本 → 释放资源。#include baseapi.h #include leptonica/allheaders.h #pragma comment(lib, libtesseract.lib) #pragma comment(lib, liblept.lib) int main() { tesseract::TessBaseAPI api; if (api.Init(nullptr, eng, tesseract::OEM_DEFAULT)) { fprintf(stderr, Init failed\n); return -1; } api.SetPageSegMode(tesseract::PSM_SINGLE_LINE); Pix* image pixRead(sample.png); if (!image) return -1; api.SetImage(image); char* text api.GetUTF8Text(); if (text) { printf(Recognized: %s\n, text); delete[] text; } api.End(); pixDestroy(image); return 0; }OEM_DEFAULT 在 3.02 里等价于只运行传统引擎PSM_SINGLE_LINE 告诉引擎这一整张图片只有一行字符。Init 的第二个参数传语言代码要识别中文就改成 chi_sim。示例里我刻意不调用 SetVariable先摸清基准效果再逐个加参数。5.2 三个值得长期使用的调优参数第一个是字符白名单。做验证码或编号识别时限制字符集是立竿见影的优化。3.02 支持通过 SetVariable 配置 tessedit_char_whitelist。api.SetVariable(tessedit_char_whitelist, 0123456789ABCDEF);第二个是指定分类器阈值。老版本对低分辨率图片常出现把 8 识别成 3 的情况可以调整classifier_min_noise_weight。这个参数控制噪声对分类结果的权重影响调太高会把正确识别也压掉一般从 0.05 开始试每次浮动 0.01。第三个是segment_penalty系列参数。做长文本识别且保留格式时适当调整词间惩罚值能让输出换行更贴近预期。但注意这个参数是内部引擎的黑匣子没有公开文档能精确对应到某类版面只能靠实验对比。从那以后我每次接老版 Tesseract 开发包都强制走一遍「检查位数 → 确认运行库 → 验证 tessdata → 跑最小例程」这四步确认基准输出后再谈参数调优。开发包链接不是最难的部分难的是把隐藏依赖一层层挖出来。这份 tesseract-3.02.02-win32-lib-include-dirs 的价值在于把 include 和 lib 目录列得清清楚楚省掉最耗时间的「找头文件、猜链接库」环节剩下的兼容性工作只要按上面流程走一遍基本都能顺下来。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

Spring Boot AOP日志切面实战:从切点表达式到常见坑

Spring Boot AOP日志切面实战:从切点表达式到常见坑

1. 为什么我把日志逻辑从业务代码里搬出来Spring Boot 项目里总有一些逻辑,跟业务没有半毛钱关系,但每个接口都得带上:调用前打一条日志,调用结束后再打一条日志,统计一下耗时,万一出异常还得把异常信息记下…

2026/10/14 23:10:35 阅读更多 →
SCM:本地多模态AI搜索工具,让音视频素材可语义检索

SCM:本地多模态AI搜索工具,让音视频素材可语义检索

1. 这不是又一个 Spotlight 替代品:SCM 的定位本质是什么很多人看到“macOS 本地 AI 搜索工具”这个描述,第一反应是:“哦,又一个想取代 Spotlight 的应用?”——这恰恰是 SCM 最需要被澄清的误解。它根本不是在和 Spo…

2026/10/14 23:10:35 阅读更多 →
H5调摄像头识别条形码:从getUserMedia到BarcodeDetector与jsQR的实战指南

H5调摄像头识别条形码:从getUserMedia到BarcodeDetector与jsQR的实战指南

简介:面向Web前端的HTML5条形码识别示例包,解决在移动浏览器中调用摄像头实时扫描Code 128条码的需求,覆盖电商、物流、库存管理等快速录入场景,也适合希望掌握浏览器调起摄像头与扫码库配合思路的中级开发者。压缩包共3个文件&am…

2026/10/14 23:10:35 阅读更多 →

最新新闻

Bambu Studio 切片教程:从模型导入到可用切片的完整上手路径

Bambu Studio 切片教程:从模型导入到可用切片的完整上手路径

Bambu Studio 切片教程:从模型导入到可用切片的完整上手路径 【免费下载链接】BambuStudio PC Software for BambuLab and other 3D printers 项目地址: https://gitcode.com/GitHub_Trending/ba/BambuStudio 打印出来的模型边缘翘起、支撑硬到拿镊子都抠不干…

2026/10/15 2:17:17 阅读更多 →
Apollo-11飞行计算机拆解:嵌入式实时系统的优先级调度与优雅降级

Apollo-11飞行计算机拆解:嵌入式实时系统的优先级调度与优雅降级

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

2026/10/15 2:17:17 阅读更多 →
PicX 图床技术详解:基于 GitHub API 的图片上传托管与链接生成实现

PicX 图床技术详解:基于 GitHub API 的图片上传托管与链接生成实现

开发工具前端 【免费下载链接】picx 🏞️ 一款基于 GitHub API 开发的图床工具,提供图片上传托管和生成图片链接。 项目地址: https://gitcode.com/gh_mirrors/pi/picx 点击查看 免费下载 PicX 是一款完全基于 GitHub API 开发的开源图床工具…

2026/10/15 2:17:17 阅读更多 →
Oracle DDL原样丢给MySQL必报错?KFS的结构化映射大法

Oracle DDL原样丢给MySQL必报错?KFS的结构化映射大法

在某大型医院的数据同步项目中,260条同步链路同时运行,源端涉及Oracle、MySQL、SQL Server、KES V8R6、Vastbase等10多种数据库,并持续向目标库汇聚数据。在这样的环境里,把数据同步过去并不难。真正让链路“卡住”的,…

2026/10/15 2:17:17 阅读更多 →
TensorFlow与Keras版本对应全攻略:避开环境配置陷阱

TensorFlow与Keras版本对应全攻略:避开环境配置陷阱

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

2026/10/15 2:17:17 阅读更多 →
C#调用VisionPro源码示例:VPP加载到结果回读的完整链路

C#调用VisionPro源码示例:VPP加载到结果回读的完整链路

简介:一份面向C#开发者的VisionPro集成源码示例,重点演示如何配置VisionPro SDK,并利用CogFindCircleTool在图像中查找圆形特征、显示检测结果。VisionPro是康耐视公司出品的机器视觉工具集,在制造业、物流等领域应用广泛&#xf…

2026/10/15 2:16:17 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练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/14 7:53:34 阅读更多 →