Работа с расстановкой переносов

Иногда бывает необходимо использовать расстановку переносов для более компактного размещения текста в документе. В то же время важно понимать, что особенности расстановки переносов слов могут отличаться для каждого языка.

В настоящее время расстановка переносов используется не так часто, как раньше, особенно в текстах на английском языке. Тем не менее, использование этой функции может оказать серьезное влияние на пользовательские документы – расстановка переносов влияет на оформление и, как следствие, на внешний вид выходных файлов, например, в формате 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-C
auto doc = MakeObject<Document>(MyDir + u"German text.docx");
Hyphenation::RegisterDictionary(u"en-US", MyDir + u"hyph_en_US.dic");
Hyphenation::RegisterDictionary(u"de-CH", MyDir + u"hyph_de_CH.dic");
doc->Save(ArtifactsDir + u"WorkingWithHyphenation.HyphenateWordsOfLanguages.pdf");

В следующем примере кода показано, как загрузить словари переносов для указанного языка из потока:

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
auto doc = MakeObject<Document>(MyDir + u"German text.docx");
SharedPtr<System::IO::Stream> stream = System::IO::File::OpenRead(MyDir + u"hyph_de_CH.dic");
Hyphenation::RegisterDictionary(u"de-CH", stream);
doc->Save(ArtifactsDir + u"WorkingWithHyphenation.LoadHyphenationDictionaryForLanguage.pdf");

В качестве альтернативы предварительной регистрации словарей расстановки переносов можно зарегистрировать только необходимые словари расстановки переносов “по запросу”. Для достижения этой цели реализуйте интерфейс IHyphenationCallback и используйте статический обратный вызов Callback.

В следующем примере кода показано, как реализовать интерфейс IHyphenationCallback:

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
class CustomHyphenationCallback : public IHyphenationCallback
{
public:
void RequestDictionary(String language) override
{
String dictionaryFolder = MyDir;
String dictionaryFullFileName;
if (language == u"en-US")
{
dictionaryFullFileName = System::IO::Path::Combine(dictionaryFolder, u"hyph_en_US.dic");
}
else if (language == u"de-CH")
{
dictionaryFullFileName = System::IO::Path::Combine(dictionaryFolder, u"hyph_de_CH.dic");
}
else
{
throw System::Exception(String::Format(u"Missing hyphenation dictionary for {0}.", language));
}
// Register dictionary for requested language.
Hyphenation::RegisterDictionary(language, dictionaryFullFileName);
}
};
void HyphenationCallback()
{
{
auto __finally_guard_0 = ::System::MakeScopeGuard([]() { Hyphenation::set_Callback(nullptr); });
try
{
// Register hyphenation callback.
Hyphenation::set_Callback(MakeObject<WorkingWithHyphenation::CustomHyphenationCallback>());
auto document = MakeObject<Document>(MyDir + u"German text.docx");
document->Save(ArtifactsDir + u"WorkingWithHyphenation.HyphenationCallback.pdf");
}
catch (System::Exception& e)
{
ASSERT_TRUE(e->get_Message().StartsWith(u"Missing hyphenation dictionary"));
std::cout << e->get_Message() << std::endl;
}
}
}

Влияние расстановки переносов на макет

При разбиении текста на строки Aspose.Words проверяет, полностью ли каждое слово помещается в текущей строке. Если другое слово слишком длинное, чтобы поместиться в конце строки, по умолчанию Aspose.Words перемещает его в начало следующей строки, а не переносит через дефис.

Однако функция расстановки переносов может использоваться в Aspose.Words для вставки дефисов в слова, чтобы устранить пробелы в выровненном тексте или сохранить одинаковую длину строки в узких столбцах. Очевидно, что это может повлиять на количество строк и, следовательно, на количество страниц. Другими словами, использование функции расстановки переносов влияет на макет документа.

Расстановка переносов и их обоснование (H&J)

В Microsoft Word есть сложная логика выбора точки останова, если текст выровнен по ширине и включена расстановка переносов. Короче говоря, Microsoft Word может предпочесть сокращать или растягивать пробелы, чтобы избежать переноса строк. Скорее всего, эта логика основана на статье Кнута.

Aspose.Words реализует свой собственный алгоритм H&J, который дает тот же результат, что и Microsoft Word, и обеспечивает идентичную разбивку строк в выходном документе.

Смотрите также