Меня попросили написать статью по поводу известной проблемы с паразитными названиями перекрёстных ссылок в тексте документа MS Word, а именно, когда вы вставляете в текст документа перекрёстную ссылку (меню ссылки/перекрёстная ссылка) Word позволяет вставить либо название типа "Рисунок ..." либо название полностью, что приводит к текстам типа "...на рисунке (Рисунок 10) мы видим..." или ещё более нелепым конструкциям, тогда как согласно ГОСТ, необходимо оставлять только номер "...на рисунке 10 мы видим...".
Эту проблему просто решить с помощью небольшого скрипта VBA.
Код перекрёстной ссылки (его можно посмотреть, переключая режимы просмотра "shift + f9") выглядит примерно так { REF _Ref127884797 \h } Для того, чтобы убрать паразитные названия и оставить только номер необходимо добавить в код ключ "\#0". При этом надо следить чтобы случайно не вставлялись лишние ключи (это приведёт к ошибкам) и корректно переключать отображение перекрёстной ссылки из вида "текст" в "код" и обратно.
Ниже приведён код, который это делает.
Sub PerSsylkiGost() Dim I As Long, DlStroki As Long, LinkText$ 'Перебираем все поля типа ссылки For I = 1 To ActiveDocument.Fields.Count 'Выбираем из них перекрёстные ссылки и выделяем их If ActiveDocument.Fields.Item(I).Type = wdFieldRef Then ActiveDocument.Fields.Item(I).Select With Selection LinkText = .Text ' MsgBox Mid(LinkText, 2, 4) 'Проверка на корректность открытия кода ссылки, т.к. в тексте могут 'присутствовать п.ссылки в виде кода и текста 'приводим п.ссылку к виду "код" If Len(LinkText) < 4 Then .Fields.ToggleShowCodes Else If Mid(LinkText, 2, 4) = "Ref " Or Mid(LinkText, 2, 4) = " Ref" _ Or Mid(LinkText, 2, 4) = "REF " Or Mid(LinkText, 2, 4) = " REF" Then Else .Fields.ToggleShowCodes End If End If .Find.ClearFormatting .Find.Replacement.ClearFormatting 'содержаение кода п.ссылки передаём переменной и обрезаем её с краёв LinkText = .Text DlStroki = Len(LinkText) LinkText = Mid(LinkText, 2, DlStroki - 2) 'Проверяем, не содержит ли уже п.ссылка нужный нам код - во избежание ошибок If InStr(LinkText, "# 0") <> 0 Or InStr(LinkText, "#0") <> 0 Then Else With .Find 'Если кода в п.ссылке нет, вставляем его .Text = LinkText DlStroki = InStr(LinkText, "\h") .Replacement.Text = Left(LinkText, DlStroki - 1) & "\#0 " & _ Mid(LinkText, DlStroki, Len(LinkText) - DlStroki + 1) 'LinkText & "\#0 " ' Теперь скрипт вставляет ключ "\#0 " перед ключом "\h" а не в конце строки ' .Replacement.Text = LinkText & "\#0 " .Forward = True .Wrap = wdFindStop .Format = False .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False .Execute Replace:=wdReplaceAll End With 'Обновляем п.ссылки - приводим их к нормальному виду ' .Fields.Update End If ' .Fields.Update End With End If Next I 'Обновляем п.ссылки - приводим их к нормальному виду ActiveDocument.Fields.Update msgbox "Готово" End Sub
Казалось бы - очень простая задача, но почему-то Word не позволяет решить её стандартными средствами...
Дополнительные проверки на вид и содержание кода перекрёстных ссылок необходимы, т.к. часто бывает, что документ составлен из кусков других документов, в которых эти ссылки могут быть в разных состояниях.
Пользуйтесь :-) Удачи!
P.S. Обнаружилось, что в некоторых случаях вставка кода "/# 0" в конец п.ссылки приводит к ошибкам. Поправил скрипт, чтобы он вставлял нужный код перед ключом "/h". Так вроде лучше.