Перенос строк и слов - Line wrap and word wrap

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

Мягкая и жесткая отдача

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

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

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

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

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

Unicode В Unicode Алгоритм разрыва строки определяет набор позиций, известный каксломать возможности[1]

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

Набор символов Unicode предоставляет символ-разделитель строк, а также разделитель абзацев для представления семантики мягкого и жесткого возврата.
0x2028 СЕПАРАТОР ЛИНИИ
* может использоваться для однозначного представления этой семантики
0x2029 РАЗДЕЛИТЕЛЬ ПАРАГРАФОВ

* может использоваться для однозначного представления этой семантики

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

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

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

между словами вместо обычных пробелов.

Перенос слов в тексте на китайском, японском и корейском языках В, Китайский Японский , и Корейский , перенос слов обычно может происходить до и после любого Хан персонаж[2], но некоторые знаки препинания не могут начинать новую строку. Японский Кана, буквы японского алфавита, обрабатываются так же, как и символы хань ( Кандзи

) в расширении, означающие слова могут и, как правило, разбиваются без дефиса или других указаний на то, что это произошло.

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

Перенос слов может быть нежелательным в составных словах (когда текст выровнен по левому краю, но только в некоторых стилях). Большинство существующих текстовых редакторов и наборный

программное обеспечение не может справиться ни с одним из вышеуказанных сценариев. 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) ГдеШирина линии это ширина линии,SpaceLeft это оставшаяся ширина пространства в строке для заполнения,SpaceWidth ширина одного пробела,Текст вводимый текст для перебора иСлово

это слово в этом тексте.

Минимальная рваность Другой алгоритм, используемый в TeX

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

Для вводимого текста

AAA BB CC DDDDD

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

------ Ширина строки: 6AAA BB Оставшееся пространство: 0CC Оставшееся пространство: 4DDDDD Оставшееся пространство: 1 { displaystyle 0 ^ {2} + 4 ^ {2} + 1 ^ {2} = 17} :

{ displaystyle 3 ^ {2} + 1 ^ {2} + 1 ^ {2} = 11}

------ Ширина строки: 6AAA Оставшееся пространство: 3BB CC Оставшееся пространство: 1DDDDD Оставшееся пространство: 1 Разница в том, что первая строка прерывается передBB

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

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

История Примитивная функция разрыва строки была использована в 1955 году в «блоке управления страничным принтером», разработанном Вестерн Юнион . В этой системе использовались реле, а не программируемые цифровые компьютеры, и поэтому требовался простой алгоритм, который можно было бы реализовать без буферы данных[6]

. В системе Western Union каждая строка была разорвана на первом пробеле, который появлялся после 58-го символа, или на 70-м символе, если пробел не был найден. Жадный алгоритм разбиения строк появился раньше метода динамического программирования, описанного Дональд Кнут[7] в неопубликованной записке 1977 г., описывающей его систему набора текста TeX и позже опубликованы более подробно.

Knuth & Plass (1981)

Соединитель слов

  1. ^ Рекомендации Хенингер, Энди, изд. (2013-01-25). «Алгоритм разрыва строки Unicode». (PDF)Технические отчеты. Приложение № 14 (Предлагаемое обновление стандарта Unicode): 2 . Получено 2015. 10 марта
  2. ^ WORD JOINER следует использовать, если цель состоит в том, чтобы просто предотвратить разрыв строки Лунде, Кен (1999), Обработка информации CJKV: вычисления на китайском, японском, корейском и вьетнамском языках , O'Reilly Media, Inc., стр. 352,  9781565922242.
  3. ^ ISBN Кнут, Дональд Э. ; Plass, Майкл Ф. (1981), «Разбиение абзацев на строки»,, 11 (11): 1119–1184, Программное обеспечение: практика и опыт:Дои.
  4. ^ 10.1002 / spe.4380111102 Уилбер, Роберт (1988), «Повторное обращение к проблеме вогнутой подпоследовательности наименьшего веса»,, 9 (3): 418–425, Журнал алгоритмов:10.1016/0196-6774(88)90032-6, Дои  0955150.
  5. ^ МИСТЕР Галил, Цви ; Парк, Кунсу (1990), "Алгоритм линейного времени для вогнутого одномерного динамического программирования",, 33 (6): 309–311, Письма об обработке информации:Дои, 10.1016 / 0020-0190 (90) 90215-Дж  1045521.
  6. ^ МИСТЕР Харрис, Роберт В. (январь 1956 г.),, «Стандартизация клавиатуры», 10 (1): 37–42.
  7. ^ Технический обзор Western Union (1977), Кнут, ДональдTEXDR.AFT 2013-04-07, получено . Перепечатано в (1999), Кнут, ДональдЦифровая типографика 78, Лекционные заметки CSLI, , Стэнфорд, Калифорния: Центр изучения языка и информации,  1-57586-010-4.

ISBN

Алгоритм разрыва строки Unicode

Уге де Мур, Джереми Гиббонс, 1999