Главная
Программы
GREP-стили для устранения висячих слов при вёрстке текстов в InDesign CS4 и выше
GREP-стили для устранения висячих предлогов
и других висячих служебных слов
при вёрстке текстов в InDesign CS4 и выше
Последнее обновление страницы: 05.03.2026 22:35:12
В данной статье описан опыт устранения висячих служебных слов с целью обеспечения хорошей полиграфичности текстов – отдельно светских, и отдельно богослужебных.
Одна из проблем, которая вызывает головную боль при работе с текстами, – это борьба с так называемыми висячими предлогами, союзами и частицами, т. е. со служебными словами, оказавшимися в конце строки, хотя по смыслу они относятся к слову, которым начинается следующая строка:
Уютный дворик, очень зелёный весной и летом, в
июне весь усыпан жёлтыми одуванчиками.
Мы ходили на детские сеансы в ближайший к
нашему дому кинотеатр.
Вот что написано об этом в знаменитом «Справочнике художественного и технического редакторов» П. Г. Гиленсона на с. 422: «В книжных изданиях не следует оставлять в конце строки предлоги и союзы, начинающие предложение, а также однобуквенные предлоги и союзы в середине предложений». Для полноты информации приведём и другие нормы, касающиеся переносов, приводимые Гиленсоном на страницах 422–423: «Не допускаются неблагозвучные переносы и переносы, искажающие смысл… В книжно-журнальных изданиях числа не должны быть разделены переносами. В газетных, информационных изданиях и изданиях оперативной полиграфии допустимо разделение чисел, соединённых знаком тире (1985—1986), причём тире должно оставаться в первой строке. Сокращённые выражения (и т. д., и т. п., т. е.) при переносе не должны разделяться. При переносах не должны быть оторваны фамилии от инициалов и инициалы друг от друга. Перенос с разрывом фамилии допускается. Не должны быть отделены при переносе сокращённые слова от имён собственных (тов. Иванов)… Не допускается размещение в разных строках чисел и их наименований (250 кг), знаков номера и параграфа и относящихся к ним чисел (№ 25)». К этому списку следует ещё добавить частицы «бы», «же», «ли», которые не следует отрывать от предыдущего слова:
Она никогда не проходила мимо и хотя
бы словом пыталась ободрить человека.
В Word’е эта проблема полноценно не решается, хотя на первый взгляд и кажется, что нет ничего проще: достаточно во всём тексте после всех таких служебных слов (или, соответственно, перед ними) заменить обычные пробелы неразрывными, что можно сделать макросом. Беда, однако, в том, что разработчики Word’а сделали неразрывный пробел имеющим фиксированную ширину, и визуально хорошо заметна разница между нормальными междусловными пробелами в строке и неразрывными пробелами (особенно в том случае, когда в документе отключён автоматический перенос слов, а текст изобилует специальной терминологией, что характерно для служебной документации). Дополнительная проблема заключается в том, что неразрывный пробел блокирует автоматический перенос по слогам в слове, которое привязывается этим пробелом к предлогу, а это ещё больше увеличивает расстояние между словами, делая текст совсем уж некрасивым.
Второй способ, который в некоторых случаях оказывается единственно возможным, – «выгнать» висячее служебное слово на следующую строку, вставляя перед ним нужное количество пробелов. «Лишние» пробелы при этом просто уйдут за правый край страницы и будут незаметны. Однако этот способ хорош до тех пор, пока такой текст не начнут корректировать: ведь при этом добавленные пробелы могут оказаться в середине строки и образовать «дырку».
В Web-документах ситуация лучше. Там тоже можно использовать неразрывный пробел с именем « », имеющий, как и в Word’е, фиксированную ширину. Однако в HTML, помимо этого, имеется CSS-свойство «white-space», значение которого «nowrap» запрещает разрывать текст, помеченный этим свойством, не влияя при этом на ширину междусловных пробелов. Примечательно, что этим свойством можно «обернуть» произвольный фрагмент текста, например: «<span style="white-space:nowrap;">этот текст не будет пере</span>носиться». С использованием примерно такого способа подготовлены и эта статья, и другие страницы на нашем сайте, а нужная HTML-разметка выполняется с помощью специально написанной программы.
Проблемы, описанные по отношению к Word’у, исчезают в InDesign’е. В нём предусмотрен неразрывный пробел, не имеющий конкретной ширины (причём в отличие от Word’а, он не препятствует автоматическому переносу слов по слогам). В русскоязычном интерфейсе он носит название «Фиксированный пробел». И помимо него имеется символьный параметр «Без переносов», которым можно помечать произвольный фрагмент текста (чего так не хватает в Word’е). Достаточно сразу же после импорта текста в InDesign принудительно расставить по всему тексту в нужных местах фиксированные пробелы либо применить свойство «Без переносов» (для этого, в частности, можно использовать скрипт DoTextOK) – и дальше можно спокойно заниматься вёрсткой, не беспокоясь о висячих словах. Параметр «Без переносов» также удобно использовать для блокировки как неблагозвучных переносов (классические примеры – «бри-гады», «проце-дуры»), так и неграмотных переносов типа холодос-тойкий (впрочем, при использовании плагина batov's hyphenator эта проблема отпадает).
Однако такой способ обработки висячих слов имеет один подводный камень. Он на 100% срабатывает в тех случаях, когда после его применения текст больше уже не будет корректироваться. В тех же случаях, когда работа над текстом продолжается, необходимо к каждому изменённому фрагменту применять подобный скрипт, иначе рано или поздно где-нибудь «выплывут» висячие предлоги, поскольку верстальщик уверен, что их в тексте не должно быть, и не будет стараться их отслеживать.
От этого недостатка свободен описываемый ниже способ динамической обработки висячих служебных слов с использованием GREP-стилей. Нельзя, однако, не сказать о том, что он имеет другой недостаток: если мы запретили GREP-стилем отрывать какой-либо предлог от следующего слова, то уже не можем в конкретном месте вёрстки отменить эту неразрывность, сняв атрибут «Без переносов», потому что явным образом этот атрибут здесь отсутствует. Выход следующий: поскольку в правилах, записываемых в GREP-стили, предусмотрено, что между двумя привязываемыми словами может присутствовать только один пробел, то добавление в текст ещё одного пробела отменяет действие этого правила: второе слово переносится на следующую строку, а дополнительный пробел, как и в случае с Word’ом, уходит за правый край текста. Однако в случае последующего внесения изменений в этот абзац двойной пробел может оказаться в середине строки, и это на глаз не очень заметно. Поэтому после окончания работы над макетом желательно проверить весь текст на наличие двойных пробелов.
Есть ещё одна проблема, с которой мы столкнулись в связи с тем, что GREP-стили формировали и отлаживали (с прицелом на будущее) непосредственно в процессе вёрстки. Внесение изменений в GREP-стили может привести к тому, что уже сделанная вёрстка может «поехать», если изменённое правило приведёт к привязке ранее непривязанных слов, или же правило содержит незамеченную ошибку (однако то же самое может произойти и при случайном применении скрипта с принудительной обработкой висячих слов в уже готовом макете). Поэтому желательно перед началом вёрстки продумать, какие служебные слова в этом тексте должны обязательно привязываться, а какие нет, сформировать соответствующим образом правила в GREP-стилях, и до конца работы над макетом их не трогать. Мы выходили из положения следующим образом: перед внесением изменений в GREP-стили экспортировали макет в PDF, корректировали стили и ещё раз экспортировали макет в PDF. Затем открывали оба PDF’а и перещёлкивались между ними на каждом развороте макета. При этом даже небольшие изменения в макете бросаются в глаза.
Было опасение, что наличие GREP-стилей может привести к «тормозам» в процессе вёрстки, которые будут увеличиваться пропорционально объёму текста. Однако работа над книгой в 272 страницы показала, что «тормоза» при вёрстке полностью отсутствуют. И это объяснимо, ибо в каждый конкретный момент InDesign работает только с одним абзацем. Был проведён следующий эксперимент: в начале 75-страничного материала удалены две фотографии, которые обтекались текстом. Вёрстка, естественно, «поехала». Но это произошло мгновенно. Это говорит о том, что динамическая GREP-обработка, по-видимому, выполняется только в процессе работы с текущим абзацем, и впоследствии эти абзацы повторно уже не обрабатываются. Торможение, однако, возникает в тот момент, когда мы вносим изменения в GREP-стили или в описание символьного стиля, который используется в GREP-стилях, поскольку при этом, очевидно, должна быть проведена повторная GREP-обработка всего документа.
Однако совсем без «тормозов» не обходится: они, к сожалению, возникают при каждом сохранении файла (по Ctrl/S). Измерения, проведенные на ноутбуке AMD Ryzen 5 5500U с памятью 8 Гб, показали, что для книги объёмом в 272 страницы, содержащей GREP-стили, процесс сохранения длится 2–3 секунды, однако после удаления из книги всех GREP-стилей она сохраняется мгновенно.
Следует отметить, что приведённые ниже поисковые шаблоны не являются прерогативой одного только InDesign’а. Это стандартные регулярные выражения, которые можно использовать в любом текстовом редакторе, который поддерживает полноценную работу с регулярными выражениями (например, TextPad). Поэтому с помощью этих же правил можно делать описанную выше разметку в HTML-файлах, только следует их дополнить шаблонами замены, которые либо заменяют пробелы в найденных образцах символом « », либо окружают их тэгами с CSS-свойством «white-space».
Работа с GREP-стилями
В InDesign CS4 впервые появилась возможность использования регулярных выражений в составе стилей абзацев. Этот функционал получил название «Стиль GREP». Очень удачное описание использования регулярных выражений дано в небольшой, но ёмкой книжке Михаила Иванюшина «GREPоводство. Регулярные выражения в InDesign». В нашей статье описано использование GREP-стилей для конкретной цели: динамической разметки нужных фрагментов текста символьным параметром «Без переносов» для устранения висячих служебных слов.
В алгоритм работы GREP-стилей заложена следующая идея: с помощью регулярных выражений ищется нужный фрагмент текста, и если поиск оказался успешным, этому фрагменту присваивается указанный символьный стиль. В данной статье идёт речь об устранении висячих предлогов и других служебных слов путём привязки их к тому слову, к которому они относятся. Следовательно, нам нужен символьный стиль, назначающий атрибут «Без переносов» этому служебному слову, а также пробелу между ним и привязываемым к нему словом. Создадим для этой цели символьный стиль, дав ему имя «NoBreak»:
Для отладки GREP-стилей можно использовать интересный приём, найденный на просторах Интернета: в определение символьного стиля «NoBreak» можно добавить окраску символов в какой-либо цвет. Тогда на экране сразу будет видно, к каким конструкциям стиль был применён, а к каким не применился. Можно дальше развить эту идею и окрашивать разные GREP-стили в разные цвета. Особенно это удобно для визуального разделения правил, привязывающих обрабатываемые слова к последующему и к предыдущему тексту.
Теперь нам нужно создать GREP-стили для решения нашей задачи. Открываем параметры основного абзацного стиля, который будет использоваться при вёрстке, переходим на вкладку «Стиль GREP» и нажимаем кнопку «Новый стиль GREP»:
Создаётся новый пустой стиль:
В поле «Применить стиль:» нужно выбрать созданный нами символьный стиль «NoBreak»:
А в поле «К тексту:» вставляем нужное регулярное выражение, которое для привязывания односложных и двухсложных служебных слов к последующему слову выглядит в упрощённом виде следующим образом:
«(?<= )(?i)(а|в|во|да|до|за|и|из|к|ко|на|не|ни|но|ну|о|об|от|по|с|со|см\.|то|у)( )»
В результате получим следующее:
Стиль, который мы только что добавили, устроен следующим образом (ниже приводится список основных метасимволов, которые можно использовать в таких стилях):
- «(а|в|во|…)» – перечень привязываемых служебных слов;
- «( )» – пробел после искомых служебных слов: ему вместе с этими словами должен быть назначен атрибут «Без переносов». Важно то, что основному слову, к которому привязываются эти служебные слова, атрибут «Без переносов» не присваивается, поэтому автоматический перенос его по слогам не блокируется;
- «(?i)» – режим «без учёта регистра», который указывает на то, что необходимо отыскивать предлоги и т. п. не только в середине предложения, но и в его начале, а также в заголовках, набранных заглавными буквами;
- «(?<= )» – указывает на то, что данное правило необходимо выполнять только в том случае, если непосредственно перед найденным текстом имеется пробел (« »).
Искушённый читатель спросит, почему здесь использована конструкция «(?<= )» вместо более простой «\<», означающей «начало слова». Дело в том, что при этом в результат поиска ошибочно попадёт «то» из «кто-то», «за» из «из-за», «на» из сокращения «р-на» и т. д.
Через какое-то время может выясниться, что этот стиль не всегда срабатывает. Дело в том, что используемый в этом шаблоне символ пробела (« ») означает в точности тот обычный пробел, который мы набиваем с клавиатуры. Неразрывный пробел и все шпации будут при таком поиске пропущены. Поэтому вместо стандартного пробела (« ») нужно использовать метасимвол, который будет искать любой пробельный символ. InDesign предлагает для этой цели метасимвол «\s», утверждая, что это «любой пробел». В действительности это «любой пробельный символ + конец абзаца». Поэтому для поиска любого пробела, но не конца абзаца, нужно указывать метасимвол «\h», который появился только в InDesign CS6. В предыдущих версиях InDesign вместо него остаётся использовать более громоздкую форму [[:blank:]].
Таким же образом добавляются и остальные GREP-стили, которые устраняют другие висячие слова. Далее предлагается комплект таких GREP-стилей для использования отдельно в светских текстах, и отдельно в богослужебных текстах.
Поскольку ручное добавление GREP-стилей несколько утомительно, то можно воспользоваться загрузкой комплекта GREP-стилей из следующих двух файлов:
