Loading AI tools
来自维基百科,自由的百科全书
显示文字时, 换行(line wrap)是指文字在一行已满后转到新行,使每行都可在视窗范围看到,不需水平滚动。
此条目需要精通或熟悉相关主题的编者参与及协助编辑。 (2011年1月16日) |
自动换行(word wrap)是大多数文字编辑器、文书处理器、和网页浏览器的附加功能。用于在行间或一行里的单词间隔处分行,不考虑单一单词超过一行长度的情况。
它通常是在看文档或打印的时候实时完成,所以没有储存或人手插入换行代码[来源请求]。如果改变文档边缘,编辑器就会自动重排换行符的位置,保证全部文字都处于可见状态,或者给打字员提供一些便捷的方式重排换行符。
软回车通常放在完整单词后面,或者紧接完整单词的标点符号后,但也可能在连字号后。
连字号后可用非断字连字号代替一般连字号避免自动换行,也可在单词中插入隐形连字号(软连字号)使文字处理软件在该处自动换行。
单词间可用硬空格避免自动换行。
在中文,日文和韩文中,汉字常认为是一个词,因此自动换行可以在汉字之前或之后发生。
而在某些情况下,是不需换行。例如:
大多数现有的文字处理和排版软件不能处理上述任何情况。
中日韩标点符号可能不遵守上述特殊情况,这些规则常称为避头尾(意思是“禁止规则处理”)。
避头尾有一个总是成立的特例:自动换行永远不能在中日韩越统一表意文字符集中的破折号和省略号之间发生。虽然由于现存字符编码的关系,这些符号需要用两个字符表示,但这些字符实际上是一个两字符宽的符号,而不是两个单字宽的符号对。
自动换行是最优化问题。因应不同的需求,有不同的解决办法。
自动换行可用贪心算法简单实现:尽可能将单词放进一行,直到所有单词都放进去。这是很多现代文字处理软件的做法,如Microsoft Word和Open Office 。这算法在追求最少行数的目标上能够达到最优化。下面是伪代码:
SpaceLeft := LineWidth for each Word in Text if Width(Word) > SpaceLeft insert line break before Word in Text SpaceLeft := LineWidth - Width(Word) else SpaceLeft := SpaceLeft - (Width(Word) + SpaceWidth)
LineWidth指行宽,SpaceLeft指一行中剩余的空格,SpaceWidth是空格宽度,Text是文字,Word是文字中的单词。
TeX用的则是另一条算法,旨在将行尾空格数的平方和最小化,使结果更美观。以上算法不能完成这目标,如:
aaa bb cc ddddd
如果惩罚函数定义为行尾剩余空格数的平方,则贪婪算法会得到一个次优解(为了简化起见,不妨假设采用定宽字体):
------ 一行的宽度为6 aaa bb 剩余的空格数:0,平方=0 cc 剩余的空格数:4,平方=16 ddddd 剩余的空格数:1,平方=1
总计代价17,而最佳的解决方案是这样的:
------ 一行的宽度为6 aaa 剩余空格数:3 平方=9 bb cc 剩余空格数:1 平方=1 ddddd 剩余空格数:1 平方=1
请注意,第一行在bb前断开了,相对于在bb后断开的解法,可以得到更好的右边界和更低的代价11。
解决这问题需定义惩罚函数,用于计算包含单词到单词的一行的代价:
其中通常为或。另外,有一些特殊的情况值得考虑:如果结果为负(即单词串不能全部放在一行里),惩罚函数需要反映跟踪或压缩文字以适应一行的代价;如果这是不可能的,则返回
最优解的代价可以用以下的递归式定义:
这可以利用动态规划来高效地实现,时间和空间复杂度均为
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.