Значительная часть текстов, набранных в современных офисных пакетах, игнорирует даже простейшие правила набора. Вот, некоторые из них:
Интересно, что при наборе текста в Microsoft Word, редактор может автоматически исправлять при вводе символы кавычек и заменять отдельно стоящий знак дефиса на знак тире. Но в уже набранном тексте подобные операции приходится выполнять вручную.
Что из перечисленного выше краткого фрагмента списка правил можно автоматизировать в Microsoft Word?
Во-первых, задействуем алгоритм исправления написания кавычек, который активируется не только при наборе текста, но и при работе операции поиска и замены. Во-вторых, применим спецсимволы. Например, установим «неразрывный пробел» в тех местах, где требуется запретить перенос на новую строку.
Но следует сразу сказать, что мы не сможем описать все возможные правильные ситуации и исключить неправильные, чтобы избежать ошибок. Ошибки неизбежно будут возникать и требовать ручного вмешательства в каждом частном случае.
Например, кавычки будут исправлены там, где алгоритм Word смог разобраться с контекстом. В остальных случаях, кавычки придется исправлять вручную обратно. Например, отдельно стоящий знак дюйма в обозначении диагонали монитора «12.5" 1366×768» будет заменен на сиротскую открывающую кавычку «12.5« 1366×768». А знак повтора содержания строки таблицы «— " —» будет также некорректно заменен на такую конструкцию «— « —».
Но эти исключения не должны отпугивать нас от попыток автоматизации!
Итак, вспоминаем все однобуквенные союзы. Их не так много: а, в, и, о, к, с, у. Далее надо выполнить автозамену пробелов, стоящих после однобуквенных союзов, на символ неразрывного пробела. Однозначно определить, что в тексте стоит именно союз, достаточно сложно. Самый простой способ, работающий в 75% случаев — искать вхождение таких союзов в обрамлении символов пробела. То есть в качестве искомых будем использовать подстроки вида « а », « в », « и », « о », « к », « с », « у ». Очевидно, что если союз стоит в начале абзаца, то перед ним, скорее всего, не окажется символа пробела, и мы не обработаем эту ситуацию. Но ничего страшного. В этом случае вовсе не обязательно делать «привязку» союза к следующему слову, так как вероятность того, что второе слово в начале абзаца после союза будет перенесено на новую строку, приемлемо мала.
Если в текстах, с которыми вам приходится работать, часто встречаются отдельно стоящие дефисы вместо тире, то можно аналогично выполнить поиск « - » с заменой на « — ». Затем можно привязать все тире к предшествующим словам, заменив « — » на «^s— ».
Также можно удалить лишние пробелы в начале и в конце строк, или повторяющиеся пробелы между слов. Но эти операцию лучше выполнять вручную в зависимости от того, какой документ обрабатывается. Некоторые документы (например, программная документация) могут содержать фрагменты текста, в которых количество пробельных символов между знаками влияет на воспринимаемый смысл.
Перед написанием самого макроса надо не забыть, что однобуквенные союзы могут стоять как в начале, так и в середине предложений, то есть могут быть набраны в разных регистрах. Поэтому надо отдельно искать и заменять строчные и заглавные написания.
Sub Typograph() ' ' Типограф ' ' ' Declare conjunctions Dim needles(14) As String needles(0) = "а" needles(1) = "в" needles(2) = "и" needles(3) = "о" needles(4) = "к" needles(5) = "с" needles(6) = "у" needles(7) = "А" needles(8) = "В" needles(9) = "И" needles(10) = "О" needles(11) = "К" needles(12) = "С" needles(13) = "У" ' Clear document properties ActiveDocument.RemoveDocumentInformation (wdRDIDocumentProperties) ' Setup find/replace dialog Set customRange = ActiveDocument.Range(0, 0) With customRange.Find oldText = .Text oldRreplaceText = .Replacement.Text .ClearFormatting .Replacement.ClearFormatting .Forward = True .Wrap = wdFindContinue .Format = False .MatchCase = True .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False End With ' Quotas replacement With customRange.Find .Text = """" .Replacement.Text = """" .Execute Replace:=wdReplaceAll End With ' Hyphen to dash replacement With customRange.Find .Text = " - " .Replacement.Text = "^s— " .Execute Replace:=wdReplaceAll End With ' Dash replacement With customRange.Find .Text = " — " .Replacement.Text = "^s— " .Execute Replace:=wdReplaceAll End With ' Trailing spaces removing With customRange.Find .Text = " ^p" .Replacement.Text = "^p" .Execute Replace:=wdReplaceAll End With ' Conjunctions glueing For i = 0 To 13 With customRange.Find .Text = " " + needles(i) + " " .Replacement.Text = " " + needles(i) + "^s" .Execute Replace:=wdReplaceAll End With Next ' Restore find/replace dialog With customRange.Find .ClearFormatting .Replacement.ClearFormatting .Text = oldText .Replacement.Text = oldRreplaceText End With End Sub