Перенос строки и слова

редактировать

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

Содержание
  • 1 Мягкий и жесткий возврат
    • 1.1 Unicode
  • 2 Границы слов, расстановка переносов и жесткие пробелы
  • 3 Перенос слов в тексте, содержащем китайский, японский и корейский языки
  • 4 Алгоритм
    • 4.1 Минимальное количество строк
    • 4.2 Минимальная шероховатость
    • 4.3 История
  • 5 См. Также
  • 6 Ссылки
  • 7 Внешние ссылки
    • 7.1 Алгоритм Кнута
    • 7.2 Другие ссылки с переносом слов
Мягкий и жесткий возврат

Мягкий возврат или мягкий перенос - это разрыв, возникающий в результате переноса строки или переноса слов (автоматический или ручной), тогда как жесткий возврат или жесткий перенос - это преднамеренный разрыв, создающий новый абзац. При жестком возврате можно (и нужно) применять форматирование разрыва абзаца (либо отступ, либо вертикальный пробел). Мягкое обертывание позволяет автоматически регулировать длину строки с корректировкой ширины окна пользователя или настроек полей и является стандартной функцией всех современных текстовых редакторов, текстовых процессоров и почтовых клиентов. Ручные мягкие разрывы не нужны, когда перенос слов выполняется автоматически, поэтому нажатие клавиши «Enter» обычно приводит к жесткому возврату.

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

В современных графических текстовых процессорах Microsoft Word и OpenOffice.org ожидается, что пользователи будут вводить возврат каретки (Введите ) между каждым абзацем. Параметры форматирования, такие как отступ первой строки или интервал между абзацами, вступают в силу там, где символ возврата каретки отмечает разрыв. Разрыв строки без абзаца, который является мягким возвратом, вставляется с помощью Shift +Enter или через меню и предоставляется для случаев, когда текст должен начинаться с новая строка, но никакие другие побочные эффекты начала нового абзаца не нужны.

В текстовых языках разметки мягкий возврат обычно предлагается в виде тега разметки. Например, в HTML есть тег, который имеет ту же цель, что и мягкий возврат в текстовых процессорах, описанных выше.

Unicode

Алгоритм разрыва строки Unicode определяет набор позиций, известных как возможности разрыва, которые являются подходящими местами для начала новой строки. Фактические позиции разрыва строки выбираются из числа возможных разрывов программным обеспечением более высокого уровня, которое вызывает алгоритм, а не самим алгоритмом, потому что только программное обеспечение более высокого уровня знает о ширине дисплея, на котором отображается текст, и ширине глифы, составляющие отображаемый текст.

Набор символов Unicode предоставляет символ разделителя строк, а также разделитель абзацев для представления семантики мягкого и жесткого возврата.

0x2028 LINE SEPARATOR
* может использоваться для однозначного представления этой семантики
0x2029 PARAGRAPH SEPARATOR
* может использоваться для однозначного представления семантики
Границы слова, расстановка переносов и пробелы

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

Слово без дефисов можно сделать переносимым, если в нем есть мягкие дефисы. Когда слово не переносится (т. Е. Не разбивается на строки), мягкий перенос не виден. Но если слово переносится по строкам, это делается по мягкому дефису, после чего оно отображается как видимый дефис в верхней строке, где слово разорвано. (В редких случаях, когда слово должно быть обернуто путем разбиения его на строки, но без дефиса, пробел нулевой ширины помещается в разрешенную точку (точки) разрыва в word.)

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

Перенос слов в тексте, содержащем китайский, японский и корейский

На китайском, японском и корейском слове перенос обычно может происходить до и после любого символа Han, но некоторые символы пунктуации не могут начинать новую строку. Японский кана, буквы японского алфавита, обрабатываются так же, как и символы хань (кандзи ) по расширению, то есть слова могут быть разбиты без дефиса или других указаний. что это произошло.

Однако при определенных обстоятельствах перенос слов нежелателен. Например, перенос слов

  • может быть нежелательным в личных именах, а перенос слов
  • может быть нежелательным в любых составных словах (когда текст смещен слева, но только в некоторых стилях).

Большинство существующих текстовых процессоров и наборного программного обеспечения не могут справиться ни с одним из вышеуказанных сценариев.

CJK пунктуация может соответствовать или не соответствовать правилам, аналогичным вышеупомянутым особым обстоятельствам. Это до правил разрыва строки в CJK..

Однако всегда применяется особый случай правил разрыва строки в CJK: перенос строки никогда не должен происходить внутри тире и многоточия CJK. Несмотря на то, что каждый из этих знаков препинания должен быть представлен двумя символами из-за ограничения всех существующих кодировок символов , каждый из них по сути представляет собой один знак препинания шириной в два ems, а не два знака препинания шириной в одну em.

Алгоритм

Перенос слов - это проблема оптимизации. В зависимости от того, для чего нужно оптимизировать, используются разные алгоритмы.

Минимальное количество строк

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

SpaceLeft: = LineWidth для каждого слова в тексте if (Width (Word) + SpaceWidth)>SpaceLeft вставить разрыв строки перед словом в тексте SpaceLeft: = LineWidth - Width (Word) else SpaceLeft: = SpaceLeft - (Width (Word) + SpaceWidth)

Где LineWidth- ширина строки, SpaceLeft- оставшаяся ширина пространства на строке для заполнения, SpaceWidth- это ширина одного символа пробела, Text- это вводимый текст для перебора, а Word- это слово в этом тексте.

Минимальная шероховатость

Другой алгоритм, используемый в TeX, минимизирует сумму квадратов длин пробелов в конце строк для получения более эстетичного приятный результат. В следующем примере этот метод сравнивается с жадным алгоритмом, который не всегда минимизирует квадрат пространства.

Для входного текста

AAA BB CC DDDDD

с шириной строки 6 жадный алгоритм выдаст:

------ Line ширина: 6 AAA BB Оставшееся пространство: 0 CC Оставшееся пространство: 4 DDDDD Оставшееся пространство: 1

Сумма квадрата пространства, оставшегося с помощью этого метода, составляет 0 2 + 4 2 + 1 2 = 17 { \ displaystyle 0 ^ {2} + 4 ^ {2} + 1 ^ {2} = 17}0 ^ {2} + 4 ^ {2} + 1 ^ {2} = 17 . Однако оптимальное решение дает меньшую сумму 3 2 + 1 2 + 1 2 = 11 {\ displaystyle 3 ^ {2} + 1 ^ {2} + 1 ^ {2} = 11}3 ^ {2} + 1 ^ {2} + 1 ^ {2} = 11 :

- ---- Ширина строки: 6 AAA Оставшееся пространство: 3 BB CC Оставшееся пространство: 1 DDDDD Оставшееся пространство: 1

Разница в том, что первая строка прерывается перед BBвместо после него, что дает лучшее правое поле и более низкую стоимость 11.

Используя алгоритм динамического программирования для выбора позиций, в которых следует разорвать линию, вместо того, чтобы жадно выбирать разрывы, решение с минимальной шероховатостью может быть найдено за время O (n 2) {\ displaystyle O (n ^ {2})}O (n ^ {2}) , где n {\ displaystyle n}n - количество слов во входном тексте. Как правило, функция стоимости для этого метода должна быть изменена так, чтобы она не учитывала пространство, оставшееся в последней строке абзаца; эта модификация позволяет абзацу заканчиваться в середине строки без штрафных санкций. Также можно применить тот же метод динамического программирования, чтобы минимизировать более сложные функции затрат, которые объединяют другие факторы, такие как количество строк или затраты на перенос длинных слов. Более быстрые, но более сложные алгоритмы линейного времени, основанные на алгоритме SMAWK, также известны проблемой минимальной шероховатости и некоторыми другими функциями стоимости, имеющими аналогичные свойства.

История

В 1955 году в «блоке управления страничным принтером», разработанном Western Union, использовалась примитивная функция разрыва строки. В этой системе использовались реле, а не программируемые цифровые компьютеры, и поэтому требовался простой алгоритм, который можно было бы реализовать без буферов данных. В системе Western Union каждая строка разбивалась на первый пробел, который появлялся после 58-го символа, или на 70-м символе, если пробел не был найден.

Жадный алгоритм разбиения на строки предшествует динамическому Метод программирования, описанный Дональдом Кнутом в неопубликованной записке 1977 года, описывающей его систему набора текста TeX, и позже опубликован более подробно Knuth Plass (1981).

См. также
Ссылки
Внешние ссылки

алгоритм Кнута

Другие ссылки на перенос слов

Последняя правка сделана 2021-05-27 10:29:32
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте