Форматирование текста в Microsoft Word с учетом правил набора

Не смотря на многолетнюю историю развития офисных приложений компании Microsoft, некоторые вопросы набора текста, связанные с правилами русского языка, остаются «за кадром». Некоторые моменты можно автоматизировать имеющимися возможностями Microsoft Word. Рассмотрим их в этой статье.

Проблема

Значительная часть текстов, набранных в современных офисных пакетах, игнорирует даже простейшие правила набора. Вот, некоторые из них:

Интересно, что при наборе текста в 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

22 июля 2018—22 июля 2018
Максим Проскурня
1997–2024 Axofiber, axofiber.info