TeX 的连字算法如何工作?

TeX 的连字算法如何工作?

Tex 使用内置的内部算法来决定单词在哪里可以连字符。正如问题中讨论的那样,这种算法有时会失败在行末断词如何手动设置单词的拆分位置?(还有一个在线列表已知算法失败。)算法是如何工作的?概括地说,我知道它依赖于语言,因此具体来说,我们假设美国和/或英国英语算法。

答案1

算法不依赖于语言,但所使用的数据依赖于语言。

有两个基本组成部分,一个连字例外列表,其中一些在语言定义中指定,其他一些可以在文档中随时添加,如果你去\hyphenation{one-tw-o-thr-ee}那么那个单词(和大写/小写变体)将被连字符显示,注意没有其他语言变体,如复数,受此影响。如果你想要“一二三s“以类似的方式用连字符连接,也需要列出。

连字例外对于特殊单词很有用,并且可以在文档中提供完全控制权,但显然仅仅列出语言中的每个单词是不现实的,因此主要机制是模式

对于每种语言,格式都会输入一个执行的文件\patterns。原始的美国英语文件位于以下位置:

/usr/local/texlive/2017/texmf-dist/tex/generic/hyphen/hyphen.tex

看起来像

\patterns{
.ach4
.ad4der
.af1t
.al3t
.am5at
.an5c
  four thousand more of these lines

如果忽略数字,则每个字母串都会与段落中的单词进行匹配(.即单词的开头或结尾)。对于每个单词,任何与子字符串匹配的模式都会在单词的字母之间分配一个 0-9 的数字(没有数字与 0 相同)。如果两个或多个这样的模式与一个单词匹配,则将最高值的数字分配给每个字母之间的空格。

因此,在将所有模式与单词匹配后,每个字母之间都会分配一个 0-9 的值。如果此值为奇数,则允许在该位置使用连字符,如果此值为偶数,则不允许在该位置使用连字符。

还有一些额外的整数参数,用于指定连字符可以放置在距离单词的开头或结尾的距离有多近。

TeX 还使用了一些巧妙的优化,这意味着它不必对每个单词进行模式匹配,它只需要在单词中找到可以作为段落中可行断点的连字点,但这是一种内部优化,不会影响基本的连字算法。

对于某些具有常规拼写和连字符规则的语言,可以手写模式以反映这些规则。英语无法通过规则进行描述,因此对于这种情况,模式通常是通过获取现有的连字符词典(例如由出版商提供的词典)并使用程序patgen通过生成一组模式来压缩词典,这些模式可以生成原始词典中(例如)80% 的连字符。

相关内容