---
title: "Работа с расстановкой переносов в C++"
---

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

В настоящее время расстановка переносов используется не так часто, как раньше, особенно в текстах на английском языке. Тем не менее, использование этой функции может оказать серьезное влияние на пользовательские документы - расстановка переносов влияет на оформление и, как следствие, на внешний вид выходных файлов, например, в формате PDF.

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

## Словари для расстановки переносов

Поскольку в разных языках используются разные нормы и правила переноса слов, оптимальным решением для правильной расстановки переносов является использование специальных словарей. Aspose.Words используются словари OpenOffice.

Для проверки орфографии OpenOffice использует библиотеку [Hunspell](https://hunspell.github.io/), которая является обобщением алгоритма расстановки переносов в TeX. Этот алгоритм позволяет автоматически выполнять нестандартную расстановку переносов, используя конкурирующие стандартные и пользовательские шаблоны расстановки переносов. Hunspell использует [Дефис](https://github.com/hunspell/hyphen) для расстановки переносов.

```

Словари расстановки переносов можно взять из [Словари LibreOffice на GitHub](https://github.com/LibreOffice/dictionaries) Например,, [англо-американский словарь переносов](https://github.com/LibreOffice/dictionaries/blob/master/en/hyph_en_US.dic).

```

```

Поскольку Microsoft Word использует для расстановки переносов словари, отличные от словарей OpenOffice, расстановка переносов некоторых слов, определенная в словарях OpenOffice, может отличаться от расстановки переносов в Microsoft Word. По этой причине иногда нам приходится советовать клиентам добавить необходимые шаблоны в свои словари, чтобы исправить расстановку переносов в определенных словах.

```

## Алгоритм расстановки переносов

Aspose.Words реализует [алгоритм расстановки переносов в TeX](https://github.com/hunspell/hyphen/blob/master/README.hyphen) и может повторно использовать словари расстановки переносов в OpenOffice.

Следует учитывать следующие особенности алгоритмов Aspose.Words:

* Параметры расстояния между переносами (LEFTHYPHENMIN, RIGHTHYPHENMIN, COMPOUNDLEFTHYPHENMIN, COMPOUNDRIGHTHYPHENMIN), указанные в словаре переносов, игнорируются. Aspose.Words использует свой собственный набор параметров расстояния в зависимости от режима совместимости документов.
* Алгоритм расстановки переносов в Aspose.Words поддерживает [составные переносы](https://github.com/hunspell/hyphen/blob/master/README.compound). Однако Aspose.Words разбивает последовательности символов, содержащие смешанные буквенные и неалфавитные символы, на части (слова), содержащие только буквы, и переносит их отдельно.
  Обратите внимание, что логика расстановки сложных слов в Microsoft Word зависит от режима совместимости документов.
* Алгоритм расстановки переносов в Aspose.Words не реализует [нестандартную расстановку переносов](https://github.com/hunspell/hyphen/blob/master/doc/tb87nemeth.pdf). Нестандартные шаблоны игнорируются.

## Загрузка словарей расстановки переносов

Чтобы использовать функцию расстановки переносов, сначала зарегистрируйте словарь расстановки переносов.В следующем примере кода показано, как загрузить словари расстановки переносов для указанных языков из файла:

{{< gist "aspose-words-gists" "d55d8631947d283b1f0da99afa06c492" "Examples-DocsExamples-source-Programming with Documents-Working with Hyphenation-HyphenateWordsOfLanguages.h" >}}

```

Вы можете скачать файл шаблона для этого примера с [Aspose.Words GitHub](https://github.com/aspose-words/Aspose.Words-for-C/tree/master/Examples)

```

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

{{< gist "aspose-words-gists" "d55d8631947d283b1f0da99afa06c492" "Examples-DocsExamples-source-Programming with Documents-Working with Hyphenation-LoadHyphenationDictionaryForLanguage.h" >}}

```

Вы можете скачать файл шаблона для этого примера с [Aspose.Words GitHub](https://github.com/aspose-words/Aspose.Words-for-C/tree/master/Examples)

```

В качестве альтернативы предварительной регистрации словарей расстановки переносов можно зарегистрировать только необходимые словари расстановки переносов "по запросу". Для достижения этой цели реализуйте интерфейс [IHyphenationCallback](https://reference.aspose.com/words/cpp/aspose.words/ihyphenationcallback/) и используйте статический обратный вызов [Callback](https://reference.aspose.com/words/cpp/aspose.words/hyphenation/get_callback/).

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

{{< gist "aspose-words-gists" "d55d8631947d283b1f0da99afa06c492" "Examples-DocsExamples-source-Programming with Documents-Working with Hyphenation-CustomHyphenation.h" >}}

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

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

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

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

В Microsoft Word есть сложная логика выбора точки останова, если текст выровнен по ширине и включена расстановка переносов. Короче говоря, Microsoft Word может предпочесть сокращать или растягивать пробелы, чтобы избежать переноса строк. Скорее всего, эта логика основана на статье [Кнута](https://www.eprg.org/G53DOC/pdfs/knuth-plass-breaking.pdf).

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

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

* [Дефис - библиотека расстановки переносов](https://github.com/hunspell/hyphen/blob/master/README)
* [Нестандартная расстановка переносов](https://github.com/hunspell/hyphen/blob/master/README.nonstandard)
* [Автоматическая нестандартная расстановка переносов в Open Office](https://github.com/hunspell/hyphen/blob/master/doc/tb87nemeth.pdf)
