Верстайте тексты правильно


Прислал: Виталий Свистунов [ 22.06.2001 @ 05:13 ]
Раздел:: [ Публикации ]


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

Вначале рассмотрим основные правила верстки текстов, касающиеся расстановки различных символов. Это лишь малая часть того, что требуется для создания красиво оформленных, а главное – приятных для чтения публикации. Интересующихся отправляю к, пожалуй, единственной книге в нашей стране по данному вопросу, «Справочнику художественного и технического редакторов». К сожалению, многие правила, описанные в этой книге, невозможно реализовать при верстке вебстраниц в силу технических особенностей броузеров.

Кавычки

Существует ряд правил, относящихся к кавычкам. Так, для русского языка приемлемы только кавычки вида « » (елочки) или „ “ (лапки), причем, первые предпочтительней. Лапки используются в рукописном тексте, ими же оформляются вложенные кавычки второго уровня (пример: Кандидат пишет в резюме: «Три года работал в компании „Русский дом Селенга“»).

«Черточки»

Бывают трех видов: тире, короткое тире и дефис. Дефис (-) используется только в сложных словах типа все-таки, мало-помалу, Олимпиада-80 и подобных и никогда не отбивается пробелами. Тире ( — ) используется во всех остальных случаях и отбивается с двух сторон — так оно куда лучше выглядит. Существует еще одно правило: тире не должно начинать строку. Поэтому перед тире необходимо вставлять неразрывный пробел, а после — обычный пробел.

Короткое тире — достаточно малоупотребительный элемент набора. Оно используется при указании границ диапазона: 15–20, XIX–XX вв. И, так же как и дефис, не отбивается пробелами. Оно же используется в качестве знака «минус» в арифметических выражениях.

Пробелы

Фамилия от инициалов отбивается неразрывным пробелом, а инициалы друг от друга не отбиваются (пример: Путин В.В.) Такое же правило используется и в сокращениях типа «и т.д., и т.п.» Неразрывным должен быть пробел, разделяющий порядки в больших числах типа 10 000 000… Пробелами никогда не отбиваются от предшествующего числа знаки %, показатели степени, подстрочные индексы и математические знаки. Пробел также не ставится после открывающей кавычки или скобки и перед закрывающей кавычкой или скобкой.

Неразрывный пробел всегда ставится перед единицами измерения (100 см) и после знаков #, §, ©, №.

Как реализовать?

Напоследок предлагаю небольшую функцию на PHP, реализующую вышеназванные правила типографики.

Пусть исходный тест содержится в переменной $txt.

Первая часть. Делает правильную верстку текста, вставленного, допустим, из Ворда. Обработка дефисов-тире, апострофов, расстановка неразрывных пробелов после предлогов, цифр, в сокращениях, «правильные „двойные кавычки“». Заметим, что внутри тегов кавычки не обрабатываются.

$search = array ("'[ ]([,\.:\?!;])'", "'\.\.\.'", "'([A-ZА-ЯЁ]\.)[ ]([A-ZА-ЯЁ]\.)'", "'([т]\.)[ ]([дп]\.)'", "' (\n)'", "'(^) '", "'(<[^\/\>]*>) '", "' ($)'", "' (\<\/)'", "'([ \n«\(\-\>])[\"“„]'", "'(^)[\"“„]'", "'[\"”„]($)'", "'[\"”„]([\- \n\.…,:;!\?\)»\<])'", "'(<[^>]*)[«»]([^<]*>)'", "'(«[^»]*)[«]([^«]*»)'", "'(«[^»]*)[»]([^«]*»)'", "'(<.*)[’](.*>)'", "'ё'", "'Ё'", "'(г.) ([A-Za-zА-я])'", "'(^[A-Za-zА-я]{1,3}) ([A-Za-zА-я«])'", "'([ \>][A-Za-zА-я]{1,3}) ([A-Za-zА-я«])'", "'([0-9]) ([0-9])'", "'([0-9]) ([A-Za-zА-я])'", "'([§©®№])([0-9A-Za-zА-я])'", "'([§©®№]) '", "'\-\-'", "'–'", "'[\-—]([0-9])'", "'([^ ])—([^ ])'", "' - '", "' —'");

$replace = array ("\\1", "…", "\\1\\2", "\\1\\2", "\\1", "\\1", "\\1", "\\1", "\\1", "\\1«", "\\1«", "»\\1", "»\\1", "\\1\"\\2", "\\1„\\2", "\\1“\\2", "\\1\'\\2", "е", "Е", "\\1 \\2", "\\1 \\2", "\\1 \\2", "\\1 \\2", "\\1 \\2", "\\1 \\2", "\\1 ", "—", "—", "–\\1", "\\1 — \\2", " — ", " —");

$txt = preg_replace ($search, $replace, $txt);

Далее, заменяем символы на HTML-код

$symb = array ("' '", "'—'", "'–'", "'«'", "'»'", "'“'", "'„'", "'§'", "'©'", "'®'", "'°'", "'…'", "'‘'", "'’'", "'™'", "'±'", "'№'");

$codes = array ("&nbsp;", "&#151;", "&#150;", "&#171;", "&#187;", "&#147;", "&#132;", "&#167;", "&#169;", "&#174;", "&#176;", "&#133;", "&#145;", "&#146;", "&#153;", "&#177;", "&#8470;");

$txt = preg_replace ($symb, $codes, $txt);

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