Разрыв строки, также известный как перенос слов, разбивает часть текста на строки, чтобы он уместился в доступную ширину страницы, окна или другой области отображения. При отображении текста перенос строки продолжается на новой строке, когда строка заполнена, так что каждая строка помещается в видимое окно, позволяя читать текст сверху вниз без какой-либо горизонтальной прокрутки. Перенос слов - это дополнительная функция большинства текстовых процессоров и веб-браузеров, позволяющая переносить строки между словами, а не внутри слов, где это возможно. Перенос слов избавляет от необходимости использовать жесткий код разделители новой строки внутри абзацев и позволяет гибко и динамически адаптировать отображение текста к дисплеям различных размеров.
Мягкий возврат или мягкий перенос - это разрыв, возникающий в результате переноса строки или переноса слов (автоматический или ручной), тогда как жесткий возврат или жесткий перенос - это преднамеренный разрыв, создающий новый абзац. При жестком возврате можно (и нужно) применять форматирование разрыва абзаца (либо отступ, либо вертикальный пробел). Мягкое обертывание позволяет автоматически регулировать длину строки с корректировкой ширины окна пользователя или настроек полей и является стандартной функцией всех современных текстовых редакторов, текстовых процессоров и почтовых клиентов. Ручные мягкие разрывы не нужны, когда перенос слов выполняется автоматически, поэтому нажатие клавиши «Enter» обычно приводит к жесткому возврату.
В качестве альтернативы, «мягкий возврат» может означать преднамеренный сохраненный разрыв строки, который не является разрывом абзаца. Например, почтовые адреса обычно печатаются в многострочном формате, но несколько строк понимаются как один абзац. Разрывы строк нужны для разделения слов адреса на строки соответствующей длины.
В современных графических текстовых процессорах Microsoft Word и OpenOffice.org ожидается, что пользователи будут вводить возврат каретки (↵ Введите ) между каждым абзацем. Параметры форматирования, такие как отступ первой строки или интервал между абзацами, вступают в силу там, где символ возврата каретки отмечает разрыв. Разрыв строки без абзаца, который является мягким возвратом, вставляется с помощью ⇧ Shift +↵ Enter или через меню и предоставляется для случаев, когда текст должен начинаться с новая строка, но никакие другие побочные эффекты начала нового абзаца не нужны.
В текстовых языках разметки мягкий возврат обычно предлагается в виде тега разметки. Например, в HTML есть тег, который имеет ту же цель, что и мягкий возврат в текстовых процессорах, описанных выше.
Алгоритм разрыва строки Unicode определяет набор позиций, известных как возможности разрыва, которые являются подходящими местами для начала новой строки. Фактические позиции разрыва строки выбираются из числа возможных разрывов программным обеспечением более высокого уровня, которое вызывает алгоритм, а не самим алгоритмом, потому что только программное обеспечение более высокого уровня знает о ширине дисплея, на котором отображается текст, и ширине глифы, составляющие отображаемый текст.
Набор символов Unicode предоставляет символ разделителя строк, а также разделитель абзацев для представления семантики мягкого и жесткого возврата.
Мягкие возвраты обычно помещаются после концов полных слов или после знаков препинания, следующих за полными словами. Однако перенос слов может также происходить после дефиса внутри слова. Иногда это нежелательно и может быть заблокировано с помощью неразрывного дефиса или жесткого дефиса вместо обычного дефиса.
Слово без дефисов можно сделать переносимым, если в нем есть мягкие дефисы. Когда слово не переносится (т. Е. Не разбивается на строки), мягкий перенос не виден. Но если слово переносится по строкам, это делается по мягкому дефису, после чего оно отображается как видимый дефис в верхней строке, где слово разорвано. (В редких случаях, когда слово должно быть обернуто путем разбиения его на строки, но без дефиса, пробел нулевой ширины помещается в разрешенную точку (точки) разрыва в 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
Сумма квадрата пространства, оставшегося с помощью этого метода, составляет . Однако оптимальное решение дает меньшую сумму :
- ---- Ширина строки: 6 AAA Оставшееся пространство: 3 BB CC Оставшееся пространство: 1 DDDDD Оставшееся пространство: 1
Разница в том, что первая строка прерывается перед BB
вместо после него, что дает лучшее правое поле и более низкую стоимость 11.
Используя алгоритм динамического программирования для выбора позиций, в которых следует разорвать линию, вместо того, чтобы жадно выбирать разрывы, решение с минимальной шероховатостью может быть найдено за время , где - количество слов во входном тексте. Как правило, функция стоимости для этого метода должна быть изменена так, чтобы она не учитывала пространство, оставшееся в последней строке абзаца; эта модификация позволяет абзацу заканчиваться в середине строки без штрафных санкций. Также можно применить тот же метод динамического программирования, чтобы минимизировать более сложные функции затрат, которые объединяют другие факторы, такие как количество строк или затраты на перенос длинных слов. Более быстрые, но более сложные алгоритмы линейного времени, основанные на алгоритме SMAWK, также известны проблемой минимальной шероховатости и некоторыми другими функциями стоимости, имеющими аналогичные свойства.
В 1955 году в «блоке управления страничным принтером», разработанном Western Union, использовалась примитивная функция разрыва строки. В этой системе использовались реле, а не программируемые цифровые компьютеры, и поэтому требовался простой алгоритм, который можно было бы реализовать без буферов данных. В системе Western Union каждая строка разбивалась на первый пробел, который появлялся после 58-го символа, или на 70-м символе, если пробел не был найден.
Жадный алгоритм разбиения на строки предшествует динамическому Метод программирования, описанный Дональдом Кнутом в неопубликованной записке 1977 года, описывающей его систему набора текста TeX, и позже опубликован более подробно Knuth Plass (1981).