文本编辑器中文字断行及排版算法研究袁永福电子病历,医疗信息化

文本编辑器中文字断行及排版算法研究

袁永福

2013/4/15

本文就讨论一下编辑器中文档断行及排版算法。

文字排版大致分为以下几个步骤:

■■测量字符大小

说到测量字符,就涉及到等宽字体和比例字体的概念了。等宽字体就是使用该字体绘制字符,字符的宽度是一样的,比如“宋体”,它就是等宽字体,用它来测量和绘制字母“W”和“i”,其宽度是一样的。比例字体就是使用该字体测量和绘制字符,其宽度是不一样的,比如“Timesnewroman”,用它来测量字母“W”和“i”,其宽度是不一样的。

对于等宽字体,可以事先测量一个字符的宽度,比如“W”,则以后遇到其他字符就使用这个已经测量好的宽度;而对于比例字体,则需要进行实时的测量。

不过一般来说,对于等宽字体和比例字体,中文符号的宽度还是一致的。因此可以实现测量一个中文字符的宽度,以后遇到中文字符就采用这个事先测好的宽度。

这里带来一个问题,如何判断一个字符是否为中文字符,那就需要参照GB3212,GBK等计算机字符集的标准来判断了。一般来说Unicode编码范围从19968至40869的字符为中文字符,当然为了进一步的优化,可以知道一些全角符号,它们的宽度也等于中文字符。

比如对于字体“Wingdings”,所有的字符在这个字体中完全变味了,就表示一个个特定形状的符号,判断是否是中文就毫无意义了;另外对于条码字体也有这种情况。

■■断行

测量完字符的大小后,编辑器程序开始在内存中构造排版对象模型,不断的将字符填充到最后一个文档行,若文档行的字符宽度和加上准备添加的字符的宽度大于文档容器客户区宽度时,就进行断行,另起一行开始填充字符。

当然这样的操作也不是绝对的,比如遇到连续的超级长的“单词”时,比如100个连续字符“a”,虽然基本上没有实际意义,但这是一种必需考虑的边界条件,很容易导致程序运行错误。因此在提前断行时需要进行这样的判断,若真的出现这种情况,那就取消提前断行。

※前置标点和后置标点

不能出现在行尾的符号称为前置标点,例如“([{·‘“〈《「『【〔〖(.[{£¥”;不能出现在行首的符号称为后置标点,例如“!),.:;]}¨·ˇˉ―‖’”…∶、。〃々〉》」』】〕〗!"'),.:;?]`|}~¢”。

比如一个文本行内容为“?张三李四王五【”,这就是一种不和规范的文本行,需要避免这种情况。

在进行文字断行时,若这个文档行的最后一个字符是前置标点时,需要进行提前断行;如果断行后第一个要排版的字符为后置标点时,也需要进行提前断行。

在进行断行的时候,对于段落符号要进行一些特殊处理。段落符号本身是有一定的宽度的,但当文档行要执行断行时,参与计算时的宽度就可以当做零了。

在排版的编程实践中,笔者采用堆栈的方式实现断行。首先将所有要排版的字符压入一个堆栈中,然后循环从堆栈中Peek获得一个字符元素,然后试图添加到当前文档行中,若文档行剩余空间足够容纳新字符,则将该新字符添加到文档行中,同时堆栈执行Pop操作。若文档行剩余空间不够,则不执行Pop操作,新建一个文档行,从而开始新的循环。如果出现提前断行,则需要将当前文档行中的若干个字符元素移出来,并压入堆栈中等着下一次循环中使用。

※停止行

用户在编辑的时候会频繁的输入字符,这就使得程序频繁的进行文档排版操作。当文档内容比较多,比如上万个字符时,进行整个文档范围的字符排版及重新绘制用户界面可能要花上几百毫秒的,这样就导致用户输入字符时编辑器反应迟钝。

为此在用户编辑录入的时候,需要进行文档内容的部分区域的文字排版,而其他区域的排版就不要动了。为此在编程中采用了一种技巧来减轻排版的工作量,笔者称之为停止行技巧。

■■行内排版

文字断行完成后,需要进行行内排版。

文档行中各个字符的宽度之和不大可能正好等于文档容器的客户区宽度。两者会有空白差。

由于中文字符和英文字符宽度不一样,对于不等宽字体,各个英文字符、数字字符等宽度还不一样。使得各个文本行的字符宽度之和是不一样的,使得各个文档行右边缘是参差不齐的。这样比较严重的影响美观。

为此需要将文档行的宽度拉长成文档容器客户区宽度,由此会额外的制造出不少空白,此时需要将这些空白比较均匀的分摊到各个字符上。此处是比较均匀的分摊,但不是完全均匀,是有一定的分布算法的。

为此要分摊由于文字两边对齐而造成的额外空间时,首先要对文档行的字符进行分组,然后将额外的空白平均分摊到字符组上。

例如对于文字“DCWriter电子病历文本编辑器。”,其分组为“[DCWriter][电][子][病][历][文][本][编][辑][器][。]”,其中一对方括号之间就是一组字符,这样就分成11组。如果额外的空白宽度为20个单位,则需要将空白平均分摊到这些字符组上面,最后一组不分摊,于是前面10组分配得到20÷(11-1)=2个单位的空白宽度。在排版时将这10个2单位的空白宽度插入到字符组之间,这样就能拉长文档行的宽度正好等于文档容器的客户区宽度。

■■分页

分页本质上说就是计算分页线的位置。其过程如下

在进行分页时,也需要判断很多边界条件,比如当某个文档行非常高,比如中间放置了一个超高的图片,使得这个文档行的高度大于标准页高,此时就不能随便移动分页线的位置了。

另外当文档中有表格时,则需要深入到表格单元格内部进行修正分页线位置的操作,这是一种递归操作。

在电子病历业务中有着继续打印的功能,在笔者的实现中,续打位置实际上就算是一种特殊的分页线,这样就能避免在续打时文字被分割打印的情况。

文字断行和排版算法是非常复杂的,即使笔者经过长期的重构再重构,优化再优化,也还是花费了一万多行的C#代码来实现这个功能,而且还有不少地方仍然需要优化。

THE END
1.新时代程序员都用什么写代码?俗话说的好:工欲善其事,必先利其器。一款好的开发工具对程序员来说是至关重要的,可以降低开发成本、提高开发的效率和代码质量。 所以今天分享一些主流的编程开发工具,基本都是我曾经或正在使用的,附带一些使用感受。 编程开发工具一览 本文大纲: 本地编辑器 https://xie.infoq.cn/article/e66510757d2de253686943671
2.A星算法地图编辑器A星算法地图编辑器评分: 实现的功能有导入地图,地图编辑,地图数组文件生成等。编辑器运用的java编写,大家只要把项目工程导入Eclipse运行即可进行地图编辑,本编辑可以课让你更好更直接更简便地把你的地图转化二维数组。 地图编辑器2015-07-30 上传大小:17KB https://www.iteye.com/resource/u013043346-8947575
3.算法开发:编程语言以及代码编辑器选择算法开发:编程语言以及代码编辑器选择一、 编成语言选择 python 语言的优却点: 语法简单,算法实现快,现有很多算法训练框架在很早以前就支持python,例如pytorch,tensorflow,paddle。 也有很多推理框架支持python,例如pytorch,tensorflow,paddle,openvino,tensorrt等,python语言适用于,边缘端,服务端,但不适用与移动端。 c++https://download.csdn.net/blog/column/12159765/128623998
4.《创作猫》软件中的音频编辑器支持哪些高级音频处理算法?《创作猫》是一款备受瞩目的音频编辑软件,以其直观易用的界面和强大的音频处理能力赢得了广大用户的青睐。其内置的音频编辑器支持一系列高级音频处理算法,为用户提供了丰富的音频处理工具,帮助他们实现各种音频创作需求。本文将详细介绍这些高级音频处理算法,以及它们在音频编辑中的应用。 https://www.sousou.com/bk/419732.html
5.Python常用库大全及简要说明pythonchardet:字符编码检测器,兼容 Python2 和 Python3。官网 difflib:(Python 标准库)帮助我们进行差异化比较。官网 ftfy:让 Unicode 文本更完整更连贯。官网 fuzzywuzzy:模糊字符串匹配。官网 Levenshtein:快速计算编辑距离以及字符串的相似度。官网 pangu.py:在中日韩语字符和数字字母之间添加空格。官网 https://www.jb51.net/article/178716.htm
6.Delta机器人轨迹规划算法二次开发教程.pdf4.算法编写算法编写:在算法编辑器中编写或导入控制算法,确保算法与机器人的运动模型兼容。 5.运行仿真运行仿真:点击控制面板的“运行”按钮,开始仿真过程,观察机器人的运动状态。 6.性能分析性能分析:仿真结束后,使用性能监控器分析机器人的运动性能,识别潜在的优化点。 4.2技巧与示例技巧与示例 技巧技巧1:自定义轨迹https://max.book118.com/html/2024/0810/5211132332011304.shtm
7.算法助手2.1.2新版算法助手官方手机版下载v2.1.25、高级算法和数据结构的详细讲解和示例代码 6、让用户能够深入理解和实践更加复杂的算法 7、算法助手拥有强大的算法设计和分析功能 8、用户可以使用软件中的算法编辑器 重要提示 由于更改了配置信息和数据库的存储方式,此次更新会导致旧版的数据配置全部丢失,请提前做好备份处理 更新日志 v2.1.2 新增功能: 1、新增https://www.qimu86.com/soft/86480.html
8.视频封面编辑器万兴喵影如何使用视频封面编辑器功能 免费下载免费下载 常见问题 Q3:我可以自定义AI生成的视频封面吗? Q4:使用视频封面编辑器有什么好处? Q6:AI 生成的视频封面是否能有效吸引注意力? Q7:使用视频封面编辑器需要任何设计技能吗? 了解更多功能 关键帧 运动跟踪 曲线变速 https://miao.wondershare.cn/features/ai-thumbnail-creator.html
9.ProFlow流程编辑器框架1.0发布ProFlow 流程编辑器框架 1.0 发布 本文来源:支付宝体验科技公众号 ProFlow 官网地址直达:https://pro-flow.antdigital.dev/ 在当前数字科技的业务中存在很多图展示、编辑的相关业务,大家设计方案不统一实现也不尽统一,最终导致设计与研发资源的浪费、产品体验参差不齐。为此我们设计和研发了ProFlow,提供更现代化的 UI http://daijinquan.ceden.cn/?article/1536382
10.微视频剪辑编辑器2024官方下载视频剪辑,视频去水印#微视频剪辑编辑器,快速剪辑视频,方便视频去水印;#微视频剪辑编辑器采用底层算法,快速编辑去除视频水印;#微视频剪辑编辑器-视频时长裁剪,只保留需要的小视频总分;#微视频剪辑编辑器-视频音乐提取,让好的背景音乐与你相伴;#微视频剪辑编辑器-视https://sj.qq.com/appdetail/com.app.wspjjzzbjq
11.Fleet后台探秘,第二部分–编辑器详解TheFleetBlog在本系列的第一部分中,我们概括介绍了 Fleet 架构。 在此第二部分中,我们将介绍编辑器幕后使用的算法和数据结构。 数据结构的聚合Copy heading link 请查看以下屏幕截图,其中展示了 Fleet 中的编辑器窗口 图中包含一行带有语法高亮显示的文本,以及一个提供特定变量用法相关信息的微件。 现在,人们可以通过多种方式显示http://blog.jetbrains.com/zh-hans/?p=236106/
12.Geo图中的参数值或者是 ArcGIS Schematics 的默认参数值,或者是为活动逻辑示意图关联的逻辑示意图模板特别设置的默认值(该默认值在此逻辑示意图模板的“逻辑示意图数据集编辑器”的布局选项卡中进行设置)。 迭代次数参数 迭代次数参数用于确定在显示最终结果之前“空间分散”算法将执行的迭代次数。执行一次迭代次数参数https://desktop.arcgis.com/zh-cn/arcmap/10.7/extensions/schematics/geo-spatial-dispatch-schematic-layout-algorithm-properties-page.htm
13.PseudoEditorAI神器大全免费在线伪代码编辑器,便捷高效! 标签:PseudoEditor代码保存伪代码生成伪代码编译器在线伪代码编辑学生程序员算法设计者语法高亮错误提示 访问PseudoEditor官网 PseudoEditor是什么 PseudoEditor是一款在线伪代码编辑器和编译器,由计算机科学学生在2020年设计和开发。该产品的目标是简化学生和开发人员编写伪代码的过程。Pseudohttps://aishenqi.net/tool/pseudoeditor
14.技术干货:如何高效实现地图自动拼接功能这篇文章提供了一个诸如RPG Maker、星际争霸关卡编辑器的自动拼接功能的算法和数据结构。当地图编辑器提供了这个功能,能显著加快内容创建的节奏。 二、背景 基于tile的图像现在已经是2d游戏的标志了,因为早期的2D游戏使用有限的tile来表现一个大的2D环境。这很自然地会让图像块状并且重复。但是,高超的图像艺术家会通过https://gwb.tencent.com/community/detail/105699
15.dcoder下载编辑器Dcoder编码器汉化版下载v1.7.4中文手机版- 通过解决我们的算法问题学习编码,这使你的行业准备面试。 软件特色 1、自定义建议视图。 2、多语言支持。 3、自定义菜单抽屉,自定义代码编辑器主题,编辑器的可编辑字体大小和更多! 4、彻底设计算法问题,提高编程技巧,使程序员做好行业准备。 5、文件打开/保存。 6、活动的调试视图,以便更快地访问输出。 7、https://www.qqtn.com/azsoft/550838.html
16.hexworkshop中文版十六进制编辑器6.8下载《hexworkshop中文版(十六进制编辑器) 6.8》是一款十六进制编辑器,这款软件能够帮助用户在使用函数代码的时候创建输入自己出现的算法格式,软件内的功能非常丰富,操作也很简单,是一款非常不错的软件,感兴趣的小伙伴欢迎下载使用噢! 软件功能 丰富的功能集 https://soft.3dmgame.com/down/206729.html
17.什么是数据结构?图码许多地方都有重做/撤消功能,例如编辑器、Photoshop。 网络浏览器中的前进和后退功能 用于许多算法,如 汉诺塔、 树遍历 、 股票跨度问题 和 直方图问题 。 回溯是算法设计技术之一。 回溯的一些例子包括骑士之旅问题、N-皇后问题、在迷宫中寻找出路以及所有这些问题中的类似国际象棋或西洋跳棋的问题,如果这种方式效率https://www.totuma.cn/book/desc/ds.html