Артефакт

Введение

Что, как, зачем

Речь пойдёт о том, как быстро и эффективно справляться к тем кошмаром, который часто представляют собой тексты, скачанные из интернета или полученные на выходе FineReader.

Кстати, новые статьи для сайта я давно уже пишу в Word. Но, конечно, не сохраняю их потом в HTML, упаси бог, а просто тут же автоматически обрамляю текст тегами HTML, по ходу дела меняя всякие специальные символы (например, кавычки или тире) на коды ««», «»» или «—» соответственно.

Когда-то, много лет назад, я вычитывал каждую книжку вручную. Иначе говоря, исправлял ошибки по ходу чтения. Со временем книжек стало куда больше, чем я был в состоянии прочитать, да и не собирался я читать всё, что предназначено для выкладывания в библиотеке.

Первым моим открытием стала функция Find & Replace, обнаруженная в меню Edit MS Word. Сейчас, конечно, смешно читать о таких элементарных вещах, но тогда это было настоящим откровением.

Позже я научился записывать последовательности автозамен, сделанных с помощью Find & Replace, в Word Macros, и это уже была настоящая победа: вместо часов или дней на одну книжку стало уходить существенно меньше времени.

Сейчас окно MS Word на моём компьютере выглядит вот так.

Замечательные кнопочки слева — макросы, ссылки на которые выведены на панель инструментов.

Щелчком по одной такой кнопке я форматирую весь документ сразу, задавая нужные мне свойства абзацев, изменяя поля и заодно добавляя на страницы библиотечные колонтитулы. Щелчком на другой — расставляю «правильные» типографские кавычки. Третья кнопка меняет дефис на тире — опять же во всём документе — вставляя в нужных местах неразрывные пробелы. Точно так же одним щелчком я меняю свойства сносок, заголовков и других элементов текста.

Вы, конечно же, тоже можете этому научиться. Тем более, что науку эту сложной назвать никак не получится.

Если вы напишете (или уже написали?) новые макросы, которые могут пригодиться другим, присылайте, я их выложу для общего доступа.

Примите во внимание, что все упомянутые в тексте Alt-последовательности (например, Alt+0151) набираются на цифровой клавиатуре: кнопка Alt нажимается до начала набора цифр и отпускается после. «Горячие клавиши» MS Word (такие как Ctrl+–) тоже, как правило, задействуют «цифровые» + и .

Как записать макрос

Начнём с того, что решим, зачем нам это нужно. Сочиним типичную постановку задачи. Предположим, имеется вот такой текст.

Напоминаю, что для того, чтобы лучше понять, что есть в документе, нужно включить отображение скрытых символов, в данном случае это пробелы и знаки конца абзаца («¶»). Сделать это можно, нажав на одну из кнопок на панели инструментов:

Теперь посмотрим, что нас не устраивает в нынешней версии текста.

1. Красные строки отсутствуют.

2. Вместо тире используется дефис или короткое тире (минус), неразрывных пробелов нет вовсе.

С этим нам и предстоит справиться. Может показаться, что задача не стоит описанной ниже возни, но примите в расчёт, что вам придётся проделать всё один-единственный раз. Если ещё когда-то потребуется исправить ошибки такого рода, вы просто щёлкнете на кнопке макроса, и... всё.

Для интересующихся: в русском языке тире отбивается от текста неразрывным пробелом («°», или Ctrl+Shift+пробел) слева, кроме диалогов, когда такой пробел идёт сразу после тире, стоящего в начале очередного абзаца. В программах, поддерживающих типографскую вёрстку, этот пробел делается уже обычного. Что касается тире, то здесь имеется в виду обычное длинное тире («—», или Alt+0151), которое существенно отличается от короткого тире, или минуса («–», или Alt+0150), и тем более от дефиса («-»). Будьте внимательны: Alt-последовательности набираются на цифровой клавиатуре с включенным Num Lock.

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

Для начала включаем запись макроса. Делается это с помощью пункта меню Tools | Macro | Record New Macro. Выбираем имя для макроса:

Теперь нажмём OK. Появившееся маленькое окошко-монитор свидетельствует о том, что запись началась. В нём есть две кнопки: Stop и Pause:

Теперь форматируем абзацы. Для начала выделяем всё содержимое документа, нажав Ctrl+A (меню Edit | Select All). В меню Format выбираем пункт Paragraph и задаём отступ красной строки:

С абзацами мы закончили. Теперь вызываем из меню Edit функцию Find & Replace (или просто Replace, в зависимости от версии Word) нажатием комбинации клавиш Ctrl+H.

Сначала разбираемся с теми тире, которые стоят в начале абзацев при диалогах.

Обратите внимание на то, что в строке поиска после дефиса стоит пробел. Нажимаем Replace All. Осталась одна замена:

Тут всё несколько сложнее. Включена опция Use Wildcards (использовать подстановочные знаки), без которой в данном случае не справиться, т. к. заменять на тире нужно не только дефис, но и минус (короткое тире). Посмотрите внимательно: слева и справа от квадратных скобок стоит по пробелу, а в самих скобках идёт вначале дефис, а потом уже минус (Alt+0150). В строке замены после тире снова пробел, на этой картинке его не видно.

Сделав Replace All, нажимаем на Stop в окошке-мониторе и закрываем диалог Find & Replace. Теперь документ выглядит так:

Поменять дефис на тире в самом начале документа, к сожалению, придётся вручную, лично я так и не нашёл спец. символ для начала документа. Впрочем, книги редко начинаются с диалогов, в первом абзаце обнаружится скорее всего имя автора.

Естественно, мы проделали очень примитивную процедуру, но она достаточна для решения поставленной задачи. Теперь можно посмотреть на текст получившегося макроса. Для этого откройте список существующих макросов, выбрав Tools | Macros | Macro. В открывшемся окне выделите макрос FixIt и нажмите на Edit для входа в редактор Visual Basic for Applications. Вот что вы увидите:

Sub FixIt()
'
' FixIt Macro
' Macro recorded 21.09.2006 by Artefact
'
Selection.WholeStory
With Selection.ParagraphFormat
.LeftIndent = CentimetersToPoints(0)
.RightIndent = CentimetersToPoints(8.88)
.SpaceBefore = 0
.SpaceBeforeAuto = False
.SpaceAfter = 0
.SpaceAfterAuto = False
.LineSpacingRule = wdLineSpaceSingle
.Alignment = wdAlignParagraphJustify
.WidowControl = True
.KeepWithNext = False
.KeepTogether = False
.PageBreakBefore = False
.NoLineNumber = False
.Hyphenation = True
.FirstLineIndent = CentimetersToPoints(0.5)
.OutlineLevel = wdOutlineLevelBodyText
.CharacterUnitLeftIndent = 0
.CharacterUnitRightIndent = 0
.CharacterUnitFirstLineIndent = 0
.LineUnitBefore = 0
.LineUnitAfter = 0
.ReadingOrder = wdReadingOrderLtr
End With
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "^p- "
.Replacement.Text = "^p-^s"
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchKashida = False
.MatchDiacritics = False
.MatchAlefHamza = False
.MatchControl = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "^p- "
.Replacement.Text = "^p-^s"
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchKashida = False
.MatchDiacritics = False
.MatchAlefHamza = False
.MatchControl = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = True
End With
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = " [--] "
.Replacement.Text = "^s- "
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchKashida = False
.MatchDiacritics = False
.MatchAlefHamza = False
.MatchControl = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = True
End With
Selection.Find.Execute Replace:=wdReplaceAll
End Sub

Если в системе не установлены всякие экзотические языки, текст будет покороче. Но лишнее всегда можно вычистить. Останется:

Sub FixIt()
Selection.WholeStory
With Selection.ParagraphFormat
.FirstLineIndent = CentimetersToPoints(0.5)
End With
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "^p- "
.Replacement.Text = "^p—^s"
.Forward = True
.MatchWildcards = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "^p- "
.Replacement.Text = "^p—^s"
.Forward = True
.MatchWildcards = True
End With
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = " [-–] "
.Replacement.Text = "^s— "
.Forward = True
.MatchWildcards = True
End With
Selection.Find.Execute Replace:=wdReplaceAll
End Sub

Полученный макрос можно использовать в любой момент, запустив его командой Run из списка, который вызывается командой Tools | Macros | Macro. Теперь посмотрим, как присвоить этому макросу кнопку на панели инструментов.

Для начала создадим на панели инструментов новый блок. Для этого воспользуемся пунктом меню Tools | Customize. После нажатия на кнопку New появится маленькое окошко, в котором нужно задать имя блока.

После закрытия диалога Customize откроется плавающее окно нового блока, которое можно перетащить мышкой куда-нибудь на панель инструментов. Пока в этом блоке нет ни одной кнопки, добавим её.

Снова откроем диалог Tools | Customize. На закладке Commands найдём раздел Macros и прокрутим правую часть окна до появления свежезаписанного макроса:

Возьмём его мышкой и перетащим на новый блок панели инструментов. Выглядеть он должен так:

Не закрывая окошко Customize, щёлкнем правой кнопкой мыши на имени макроса, там, куда указывает стрелка. Изменим стиль кнопки с Text Only на Default Style. Снова щёлкнем на ней правой кнопкой мыши и откроем подменю Change Button Image, где выберем подходящую на ваш взгляд картинку. Позже при желании её можно будет заменить на что-то нарисованное самостоятельно. Теперь закроем Customize. Работа по созданию макроса завершена. Для его вызова достаточно щёлкнуть на только что созданной кнопке.

Как использовать макросы с сайта

Предположим, вы захотите добавить в список установленных в системе макросов что-то из выложенного на этом сайте. Для этого запишите макрос с необходимым именем так, как вы это уже делали, но после появления окошка-монитора сразу нажмите Stop. Затем снова откройте редактор Visual Basic for Applications, как это описано выше. Скопируйте скачанный с сайта код макроса в окно Notepad, после чего снова скопируйте текст уже из Notepadа и замените им код только что записанного макроса, а потом добавьте кнопку макроса на панель инструментов. Следует заметить, что туда нужно добавлять только часто используемые макросы: экранное пространство нынешних мониторов велико, но и его когда-нибудь не хватит.

Не следует пытаться копировать макросы непосредственно в окно VBA, минуя Notepad: в этом случае они не будут работать.

Добавлю, что все выложенные здесь макросы хранятся в документах MS Word, чтобы не потерять специальные символы, которые неизбежно портятся при копировании в Plain Text.

А теперь перейдём к конкретным задачам, требующим разбора синтаксиса строк замены и поиска. Предварительно очень рекомендую почитать статью С. Хозяинова.

...

Читать дальше: «О „мёртвых“ текстах»

Новости раздела

18 ноября 2020 г.
Комплектация библиотеки файлами .fb2

Ещё на сайте

Библиотека
Языки
Друзья
Канада
Авторский угол

Интернет

CPAN
Citforum
W3C.org
useit.com
Типомания
Code Charts
ру/ководство
Лаборатория dk
WebReference.com
Спецификация Perl
Заметки HTML-кодера
Анатомия Adobe Photoshop
The Apache Software Foundation


Рейтинг@Mail.ru

wordpress statistics

Рейтинг@Mail.ru