Заголовки / 2 марта 2007 г.
Задачи, с которыми приходится столкнуться при форматировании текстов, иногда бывают совершенно крохотными, но от этого их важность не уменьшается.
Казалось бы, что стоит выделить название книги и имя её автора?
Вот исходный вариант:
![](files/auto_04_01.gif)
А вот что должно получиться:
![](files/auto_04_02.gif)
Стоит ли вообще связываться с макросами?
Ответ: ещё как стоит. Как только количество текстов, с которыми вы имеете дело, увеличивается до десятка-двух, экономия времени в десять секунд на каждом из них становится существенной.
А дел-то всего ничего:
Sub formatTitle()
ActiveDocument.Paragraphs(1).Range.Select
ActiveDocument.Paragraphs(1).FirstLineIndent = CentimetersToPoints(0)
Selection.Font.Size = 16
Selection.Font.Bold = wdToggle
ActiveDocument.Paragraphs(2).Range.Select
ActiveDocument.Paragraphs(2).FirstLineIndent = CentimetersToPoints(0)
Selection.Font.Size = 12
End Sub
Теперь посмотрим, что можно сделать с разбиением документа на главы. Скажем, таким:
![](files/auto_04_03.gif)
Лично я предпочитаю оформлять это так, как показано на следующей картинке.
![](files/auto_04_04.gif)
Две пустых строки до заголовка, одна после. Почему именно так? Почему не воспользоваться гибкой системой отбивок самого Wordа? Зачем капитализировать номер главы?
Это своего рода компромисс.
Я знаю, что библиотечные тексты часто переделываются посетителями «под себя». Кто-то читает их на КПК, а кто-то и на обычном компьютере пользуется какой-нибудь программой ридером. А теперь представьте, что номер главы выделен повышенным кеглем и сделан полужирным, а пробелы до и после заголовка выставлены при помощи Indentation Before text / After text. Если пользователь, манипулируя документом, на каком-то этапе сохраняет его в формате Plain text, можно считать, что заголовка нет, и всё слилось в однородную чёрно-белую кашу: ведь атрибуты шрифтов и абзацев при этом не сохранятся. А в нашем случае структура документа выживет.
Что до количества строк до и после заголовка, то здесь нужно принять в расчёт простое правило: заголовок должен прибиваться к тому блоку текста, к которому он имеет непосредственное отношение. В данном случае к следующему за ним абзацу. Отбивка же от предыдущего абзаца должна быть как минимум в полтора-два раза больше.
Делается это так.
Строка поиска |
Строка замены |
Опция Use Wildcards |
^13(Глава[!^13]{1;})^13 |
^13^13\1^13 |
включена |
Кроме того, нужно установить ещё опцию All caps для шрифта и нулевую левую отбивку для абзаца. Получается следующее:
![](files/auto_04_05.gif)
Код макроса будет выглядеть примерно так:
Sub formatChapters()
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find.Replacement.ParagraphFormat
.FirstLineIndent = CentimetersToPoints(0)
.CharacterUnitFirstLineIndent = 0
End With
Selection.Find.Replacement.Font.AllCaps = True
With Selection.Find
.Text = "^13(Глава[!^13]{1;})^13"
.Replacement.Text = "^13^13\1^13"
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchWildcards = True
End With
Selection.Find.Execute Replace:=wdReplaceAll
End Sub
Заметьте, что макрос, записанный при помощи стандартного диалога Record Macro, будет содержать несколько иной код. В частности, установка атрибутов шрифта, как это обычно бывает, не запишется. Поэтому после записи мне пришлось открыть редактор VBA и вписать строку 8, а заодно и почистить мусор.
Я думаю, этого достаточно, чтобы вы смогли после некоторой тренировки решить любую задачу подобного класса.
Макросы к статье
formatTitle (форматирование названия книги и имени автора)
formatChapters (форматирование разбивки по главам)
...
«Perl и RegExp» | «Кавычки»
наверх
|