Из Википедии, бесплатной энциклопедии
  (Перенаправлено с Linewrap )
Перейти к навигации Перейти к поиску

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

Мягкий и жесткий возврат [ править ]

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

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

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

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

Юникод [ править ]

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

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

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

Границы слов, расстановка переносов и пробелы [ править ]

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

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

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

Перенос слов в тексте на китайском, японском и корейском языках [ править ]

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

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

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

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

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

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

Алгоритм [ править ]

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

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

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

SpaceLeft: = LineWidthдля каждого слова в тексте если (Ширина (Слово) + SpaceWidth)> SpaceLeft вставить разрыв строки перед словом в тексте SpaceLeft: = LineWidth - Ширина (слово) еще SpaceLeft: = SpaceLeft - (Ширина (слово) + SpaceWidth)

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

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

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

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

AAA BB CC DDDDD

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

------ Ширина линии: 6AAA BB Оставшееся место: 0CC Осталось места: 4DDDDD Оставшееся место: 1

Сумма квадрата пространства, оставшегося при использовании этого метода, равна . Однако оптимальное решение дает меньшую сумму :

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

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

Используя алгоритм динамического программирования для выбора позиций, в которых следует разорвать строку, вместо того, чтобы жадно выбирать разрывы, решение с минимальной шероховатостью может быть найдено вовремя , где - количество слов во входном тексте. Как правило, функция стоимости для этого метода должна быть изменена так, чтобы она не учитывала пространство, оставшееся в последней строке абзаца; эта модификация позволяет абзацу заканчиваться в середине строки без штрафных санкций. Также можно применить тот же метод динамического программирования, чтобы минимизировать более сложные функции затрат, которые сочетают в себе другие факторы, такие как количество строк или затраты на расстановку переносов длинных слов. [3] Более быстрые, но более сложные алгоритмы линейного времени , основанные наАлгоритм SMAWK также известен проблемой минимальной шероховатости и некоторыми другими функциями стоимости, которые имеют аналогичные свойства. [4] [5]

История [ править ]

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

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

См. Также [ править ]

  • Неразрывное пространство
  • Типографское выравнивание
  • Пространство нулевой ширины
  • Разделитель слов
  • Соединитель слов

Ссылки [ править ]

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

Внешние ссылки [ править ]

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

Алгоритм Кнута [ править ]

  • "Новое в Knuth & Plass"
  • "tex_wrap": "Реализует алгоритм TeX для разбиения абзацев на строки." Ссылка: «Разбивка абзацев на строки», DE Knuth и MF Plass, глава 3 _Digital Typography_, CSLI Lecture Notes # 78.
  • Text :: Reflow - модуль Perl для перекомпоновки текстовых файлов с использованием алгоритма разбиения на абзацы Кнута. "Алгоритм перекомпоновки пытается сохранить строки одинаковой длины, но также пытается разорвать знаки препинания и избежать разрывов в пределах собственного имени или после определенных связок (" a "," the "и т. Д.). Результатом является файл с более "рваное" правое поле, чем при использовании fmt или Text :: Wrap, но его легче читать, поскольку меньше фраз разбивается на разрывы строк ".
  • настройка алгоритма Кнута для распознавания «мягкого дефиса» .
  • Алгоритм взлома Кнута. «Подробное описание модели и алгоритма можно найти в статье Дональда Э. Кнута« Разбивая абзацы на строки », опубликованной в книге« Цифровая типография »(Стэнфорд, Калифорния: Центр изучения языка и информации, 1999), (CSLI Lecture Notes, № 78) "; часть Google Summer Of Code 2006
  • «Преодоление разрыва в алгоритмах: функциональная программа с линейным временем для форматирования абзацев» , Оге де Моор, Джереми Гиббонс, 1999 г.

Другие ссылки с переносом слов [ править ]

  • обратная проблема - выбор столбцов, достаточно широких, чтобы уместить (обернутый) текст ( заархивированная версия )
  • Описание класса KWordWrap, используемого в графическом интерфейсе KDE
  • «Элементы разбиения строк Кнута для объектов форматирования» Саймона Пеппинга, 2006 г. Расширяет модель Кнута для обработки нескольких улучшений.
  • «Стратегии разрыва страницы» Расширяет модель Кнута для обработки нескольких улучшений.
  • «Подобный Кнута-Плассу алгоритм разбиения строк ... * действительно * интересно то, чем алгоритм Adobe отличается от алгоритма Кнута-Пласса. Он должен отличаться, поскольку Adobe удалось запатентовать свой алгоритм (6 510 441)». [1]
  • «Мюррей Сарджент: математика в офисе»
  • «Разрыв строки» сравнивает алгоритмы различной сложности по времени.