使用连字符
有时需要使用连字符在文档中更紧凑地排列文本。 与此同时,重要的是要了解每种语言的单词断字的具体细节可能不同。
目前,连字符的使用不像以前那样频繁,特别是在英文文本中。 尽管如此,使用此功能可能会对用户文档产生严重影响–连字符会影响布局,因此会影响输出文件的外观,例如PDF格式。
为了正确分割单词,使用特定于语言的断字字典。 Aspose.Words使用高级算法来处理此类字典,并允许您获得与Microsoft Word中相同的连字符。
连字符字典
由于不同的语言对单词断字使用不同的规范和规则,正确断字的最佳解决方案是使用特殊的字典。 Aspose.Words使用OpenOffice字典。
对于拼写检查,OpenOffice使用 Hunspell图书馆,这是TeX的断字算法的泛化。 此算法允许使用竞争标准和自定义断字模式自动非标准断字。 Hunspell使用 连字符,连字符 为断字。
断字算法
Aspose.Words实现 TeX断字算法 并且可以重用OpenOffice连字符字典。
应该考虑Aspose.Words算法的以下特性:
- 断字距离参数(LEFTHYPHENMIN, RIGHTHYPHENMIN, COMPOUNDLEFTHYPHENMIN, COMPOUNDRIGHTHYPHENMIN) 断字字典中指定将被忽略。 Aspose.Words根据文档兼容模式使用自己的一组距离参数。
- Aspose.Words中的断字算法支持 复合连字符. 但是,Aspose.Words将包含混合字母和非字母字符的字符序列拆分为仅字母部分(单词)并分别用连字符连接。 请注意,复合词断字的Microsoft Word逻辑取决于文档兼容模式。
- Aspose.Words中的连字符算法不实现 非标准连字符. 非标准模式将被忽略。
加载连字符字典
要使用断字功能,请先注册断字字典。下面的代码示例演示如何从文件中加载指定语言的断字字典:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java | |
Document doc = new Document(dataDir + "in.docx"); | |
Hyphenation.registerDictionary("en-US", dataDir + "hyph_en_US.dic"); | |
Hyphenation.registerDictionary("de-CH", dataDir + "hyph_de_CH.dic"); | |
doc.save(dataDir + "LoadHyphenationDictionaryFromFile_Out.pdf"); |
下面的代码示例演示如何从流中加载指定语言的断字字典:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java | |
Document doc = new Document(dataDir + "in.docx"); | |
InputStream stream = new FileInputStream(dataDir + "hyph_de_CH.dic"); | |
Hyphenation.registerDictionary("de-CH", stream); | |
doc.save(dataDir + "LoadHyphenationDictionaryFromStream_Out.pdf"); |
作为预先注册连字符字典的替代方法,可以"按请求"仅注册所需的连字符字典。 为此,请实现IHyphenationCallback接口并使用静态回调Callback。
下面的代码示例演示如何实现IHyphenationCallback接口:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java | |
public static void hyphenationCallback() { | |
try { | |
// Register hyphenation callback. | |
Hyphenation.setCallback(new CustomHyphenationCallback()); | |
Document document = new Document(dataDir + "in.docx"); | |
document.save(dataDir + "LoadHyphenationDictionaryFromStream_Out.pdf"); | |
} catch (Exception e) { | |
System.out.println(e.getMessage()); | |
} finally { | |
Hyphenation.setCallback(null); | |
} | |
} | |
static class CustomHyphenationCallback implements IHyphenationCallback { | |
public void requestDictionary(String language) throws Exception { | |
String dictionaryFolder = dataDir; | |
String dictionaryFullFileName; | |
switch (language) { | |
case "en-US": | |
dictionaryFullFileName = new File(dictionaryFolder, "hyph_en_US.dic").getPath(); | |
break; | |
case "de-CH": | |
dictionaryFullFileName = new File(dictionaryFolder, "hyph_de_CH.dic").getPath(); | |
break; | |
default: | |
throw new Exception("Missing hyphenation dictionary for " + language); | |
} | |
// Register dictionary for requested language. | |
Hyphenation.registerDictionary(language, dictionaryFullFileName); | |
} | |
} |
断字对布局的影响
将文本分成几行时,Aspose.Words会检查每个单词是否完全适合当前行。 如果另一个单词太长而不适合行尾,默认情况下Aspose.Words将其移动到下一行的开头,而不是用连字符。
但是,可以在Aspose.Words中使用连字符功能将连字符插入到单词中,以消除对齐文本中的空白或在窄列中保持偶数行长度。 这显然会影响行数,从而影响页数。 换句话说,使用断字功能会影响文档布局。
连字符和理由(H&J)
Microsoft Word有复杂的逻辑来选择断点,如果文本是合理的,并且启用了连字符。 简而言之,Microsoft Word可能更喜欢收缩或拉伸空格以避免行断字。 很可能这个逻辑是基于 克努斯的公司?.
Aspose.Words实现自己的H&J算法,该算法给出与Microsoft Word相同的结果,并在输出文档中提供相同的换行。