![](/img/cover/515.jpg)
Скриптинг в InDesign. Часть 1
Отступление для читателей, не знакомых с программированием
Идея создания настоящего материала возникла летом, во время подготовки обзорной статьи «Лед тронулся, или Приключения InDesign в России» (КомпьюАрт №7’2001). Тогда авторам было мало что сказать по существу вопроса. Сейчас же ситуация изменилась. Полгода мы проработали в InDesign и добились, на наш взгляд, выдающегося результата — ВЕСЬ «КомпьюАрт» верстается в этом замечательном издательском пакете. Номер, который у вас сейчас в руках, уже третий, полностью подготовленный в среде InDesign1. Нам очень интересно и комфортно работать в нем — во многом благодаря постоянному ощущению свободы и всесильности, возникающему на всех стадиях издательского процесса. Важной составляющей этой свободы является возможность гибкого программирования собственных задач и высвобождения собственного Времени для достойных дел. Ребята из Adobe Systems проделали отличную работу и хорошо постарались ради существования этой возможности.
Кому и зачем?
Дефинируем предмет рассмотрения. Скрипт — серия команд, указывающая InDesign, какие действия ему следует выполнять в определенный момент времени при соблюдении или несоблюдении соответствующих условий. Эти действия могут быть как одиночными и влиять исключительно на один, выбранный в данный момент объект, так и входить в состав чрезвычайно сложной структуры, влияющей на многие объекты и публикации. Таким образом, скриптинг2 — увлекательный и творческий процесс, позволяющий решать посредством несложного программирования абсолютно любую задачу, выполнимую в InDesign штатными средствами (работа с инструментами, меню, палитрами, диалогами).
Входящие в состав скрипта процедуры и операторы могут касаться как InDesign непосредственно, так и затрагивать внешние приложения: текстовые редакторы, электронные таблицы, СУБД, ГИС- и CAD-системы. Более того, скриптинг в среде InDesign может служить не только целям автоматизации часто повторяющихся операций, но и являться продвинутым дизайнерским инструментом. Например, задачи случайного выбора гарнитуры и цвета символа в строке текста, равномерного изменения кегля от начала до конца строки в каждом символе, в конце концов просто свободного распределения литер на полосе (распространенный дизайнерский прием) — все это без применения скриптинга кажется тяжеловесным и трудновыполнимым.
Скриптинг доступен не только профессиональным разработчикам программного обеспечения. Более того, он для них не предназначен. Верстальщику — «версталово», а программисту — «программерово». Для профессиональных разработчиков существует SDK — Software Development Kit for InDesign, который Adobe Systems предоставляет в свободном доступе. Скриптинг же доступен каждому пользователю InDesign.
Широкое распространение InDesign и появление достаточного количества пользователей, способных программировать свои задачи и добиваться максимальной эффективности своей работы, способны взорвать и кардинально изменить сложившееся за 10 лет эпохи Десктопа представление о профессии верстальщика. К глубокому сожалению авторов, авторитет зубров-метранпажей3 и их традиционно высокое в негласной иерархии типографских работников место остались в прошлом. Ныне в основном превалирует отношение к верстальщику, как к низкоквалифицированной рабочей силе, что-то вроде «посадимдевочкузалитьтекстнаполосы». Надо отметить, что некоторые горе-«верстальщики» сильно способствуют этому. Но речь не о них. Владение скриптингом может и должно стать основным аргументом верстальщика при трудоустройстве. Ведь экономия времени, необходимого для выполнения рутинных задач, в разы — серьезное повышение эффективности допечатного процесса, суть — прямое конкурентное преимущество предприятия. А какое наслаждение запустить скрипт собственного изготовления и наблюдать за тем, как публикация верстается «сама»! Скриптинг — как процесс, безусловно, творческий — способен одухотворить деятельность верстальщика, придать ей шарм и избавить от ощущения «одного и того же». Наконец, полномасштабное владение скриптингом и знание общей типографской культуры могут служить серьезным источником дополнительного дохода. Ни один программист (если он никогда не занимался версткой) не в состоянии элементарно сформулировать задачу по автоматизации издательского процесса, не говоря уже о ее реализации и отладке. Разумеется, речь здесь идет не о глобальных плагинах и дополнениях, над которыми работают целые коллективы специалистов, а о маленьких скриптиках, учитывающих особенности и потребности конкретного издательского процесса, но дающих в итоге огромную экономию временных ресурсов.
Надеемся, что необходимость и полезность освоения скриптинга в InDesign очевидна всем. Итак, приступим!
![]() |
![]() |
Среда разработки
До единого аппаратно-платформенного стандарта в DTP-индустрии очень далеко, и с программной средой разработки, отлаживания и исполнения скриптов для InDesign ситуация обстоит так же, как и во всей отрасли. Для PC пишем на Visual Basic, для InDesign под Mac OS — на AppleScript. К сожалению, конструкции скриптов для InDesign под этими программными средами отличаются семантикой, но логика работы одна и та же. Авторы не имеют возможности тестировать и отлаживать скрипты под Macintosh, поэтому, не желая отбирать хлеб у наших коллег, приверженцев платформы Apple, мы лишь кратко остановимся на сути скриптинга под Mac OS, а в дальнейшем будем рассматривать в качестве программной среды Visual Basic (VB). К тому же предварительный анализ семантических конструкций обеих программных сред позволяет надеяться на появление в недалеком будущем скрипт-конверторов VB « AppleScript.
Итак, для успешного скриптинга в InDesign на платформе Apple нам необходимо наличие в системе интерпретатора AppleScript, который входит в стандартную поставку любой из Mac OS, и одного из доступных редакторов (AppleScript editor, Scripter, Script Debugger, etc.)
Для скриптинга в InDesign на платформе Windows необходимо установить Microsoft Visual Basic либо использовать любое приложение, содержащее Visual Basic for Applications (VBA). Такие пакеты, как MS Office, AutoCAD, Corel, Visio и др., содержат в составе поставки VBA. InDesign, к сожалению, пока не комплектуется VBA, но вполне успешно его поддерживает. На сайте Adobe Systems, в форуме, посвященном скриптингу в InDesign, появлялась неофициальная информация о том, что InDesign 2.0 будет снабжен необходимыми компонентами VBA для работы со скриптами непосредственно в пакете4, но эти ожидания пока не оправдались.
![]() |
![]() |
Базовые понятия
В этой части материала, которую имеющие минимальный опыт программирования на VB читатели вполне могут пропустить, дадим начальные сведения о конструкциях Visual Basic и принципах скриптинга в InDesign.
В процессе обычной работы в среде InDesign мы работаем с фреймами и их содержимым, применяем к ним цвета и стили, масштабируем, перемещаем и форматируем; открываем публикации, перемещаемся по полосам и разворотам, размещаем элементы на них, то есть всегда имеем дело с неким объектом.
При исполнении скрипта происходит то же самое, с той лишь разницей, что активной стороной, влияющей на процесс, являемся не мы, как субъект взаимодействия с пакетом, а скрипт, серия команд. С точки зрения InDesign не происходит ничего незаурядного. Пакету отдается команда совершить действие А над объектом X. Если это действие допустимо, оно выполняется.
Суть скриптинга заключается в объектной модели — описании всех доступных InDesign’у объектов: публикаций, разворотов, полос и фреймов. При этом каждому типу присущи свои специфические свойства, и каждый объект может быть однозначно идентифицирован.
Таким образом, скриптинг в InDesign является типичным случаем объектно-ориентированного программирования. Схожие по тому или иному признаку объекты объединяются в классы (classes), обладают свойствами (properties), манипуляции над объектами осуществляются посредством методов (methods) в Windows или команд (commands) на Macintosh.
![]() |
![]() |
Объектные ссылки
Объекты в InDesign расположены иерархически, то есть фреймы принадлежат полосам, полосы принадлежат публикации, которая, в свою очередь, принадлежит InDesign. Для того чтобы подать команду какому-либо объекту, необходимо ее направить по иерархической цепочке — указать «точный адрес» объекта. Адресация объектов в VB идет от старшего объекта к младшему, в AppleScript — наоборот, но четкая последовательность обращений к каждой иерархической ступени обязательна:
«Documents.Item(1).Spreads.Item(1). TextFrames.Item(1)» — Visual Basic; «the first text frame of the first spread of the first document» — AppleScript.
Вышеприведенные конструкции являются объектными ссылками (object reference) и позволяют реализовывать принцип однозначности идентификации объекта. Таким образом у каждого объекта существует уникальная объектная ссылка.
![]() |
![]() |
Классы объектов
Объекты со схожими свойствами объединяются в классы. Так, все типы фреймов — прямоугольники, полигоны, овалы и фреймы свободной формы — принадлежат классу объектов PageItems и обладают свойствами, общими для всех других типов объектов этого класса. Например, свойство Geometric location является общим для всех объектов класса PageItems.
![]() |
![]() |
Наследование свойств
Типы объектов класса наследуют ряд свойств этого класса. Прямоугольник наследует свойство fill от класса PageItems, как и все прочие типы фреймов. Вместе с тем, объекты могут обладать свойствами, которыми не обладают объекты другого типа данного класса. У текстового фрейма есть свойство TextContents, которым фреймы другого типа не обладают.
Типы данных
Поддерживаются данные пяти типов:
- Boolean (логический тип данных true or false);
- Integer (целое);
- Double (вещественные числа);
- String (строка символов, заключается в двойные кавычки);
- Array (массив данных любого типа).
Отдельно стоит описание данных как Variant, но об этом позднее.
![]() |
![]() |
Переменные
Переменные являются контейнерами для данных и могут содержать число, строку текста или объект. У каждой переменной обязательно должно быть уникальное имя, по которому мы к ней обращаемся. Присвоение значений переменным и последующее их использование позволяет сделать скрипт универсальным и не зависящим от конкретной ситуации, как это было бы при непосредственном использовании данных.
В AppleScript присвоение значений осуществляется с помощью оператора set:
set myNumber to 10 set myString to “Hello, World!” В Visual Basic при помощи оператора равенства (=): myNumber = 10 myString = “Hello, World!”
![]() |
![]() |
Операторы
Используются для выполнения вычислений над переменными и данными. Оператор возвращает какое-либо значение, которое зависит от типа данных, над которыми производятся вычисления. Это может быть как числовая величина (MyWidth/2), так и логическое значение (в случае использования оператора сравнения MyWidth > MyHeight).
![]() |
![]() |
Команды и методы
Команды в AppleScript и методы в VB по сути являются «глаголами», сообщающими системе, что именно необходимо сделать с тем или иным объектом.
Так, в VB для создания нового объекта используется метод Add, для привязки переменной к объекту — метод Set и оператор равенства (=) для изменения свойств объекта.
В AppleScript команда make создает новый объект, set изменяет его свойства, а get позволяет получить от объекта информацию о его свойствах.
![]() |
![]() |
Условные выражения
Условные выражения дают возможность скрипту в процессе исполнения анализировать ситуацию и принимать то или иное решение в зависимости от выполнения условия. Данные выражения всегда начинаются с оператора if. Следующий скрипт создает новую публикацию, запрашивает InDesign о количестве текстовых материалов в ней и, не обнаружив таковых, выводит сообщение5.
Private Sub Form_Load() Dim myInDesign As InDesign.Application Dim myPub As InDesign.Document Dim myStories As InDesign.Stories Set myInDesign = CreateObject (“InDesign. _ Application”) myNumberOfStories = myStories.Count If myNumberOfStories = 0 then MsgBox “В данном документе _ не содержится текстовых блоков” End If End Sub
![]() |
![]() |
Структуры управления
Предположим, что нам необходимо выполнить какое-либо действие несколько раз подряд. Записать последовательно несколько строк, описывающих это действие? А если существует необходимость в выполнении ста итераций? Для этих целей и существуют структуры управления.
Следущие конструкции исполняют последовательности операторов скрипта (тело цикла) заданное количество раз.
AppleScript: repeat with counter from 1 to 20 -- тело цикла end repeat Visual Basic: For counter = 1 to 20 rem тело цикла Next counter
Несколько более сложная конструкция управляющей структуры, которая выполняет тело цикла до тех пор, пока ограничивающее условие истинно.
AppleScript repeat while myToDoCondition = true -- тело цикла end repeat Visual Basic Do While myToDoCondition = true rem тело цикла loop
![]() |
![]() |
Координатная сетка
Как и все современные пакеты верстки, InDesign использует стандартную 2D геометрию для точного позиционирования объекта на полосе. Горизонтальный компонент координатной пары (точки) обозначается как x, вертикальный — y. Эти координаты отображаются в палитре Transform, при выборе объекта инструментом «указатель». Геометрический ноль полосы в InDesign находится в левом верхнем углу полосы. Таким образом, положительное направление по оси X — слева направо, а по оси Y — сверху вниз. Важно помнить про последовательность записи координат объектов: сначала x, затем y! InDesign ждет от нас именно такую запись. Следующий скрипт создает новую публикацию, в ней новый объект, а затем перемещает его на 10 мм вправо и на 40 мм вниз.
AppleScript tell application “InDesign 1.5” set mySelection to selection move mySelection to {“10mm”, “40mm”} end tell Visual Basic Dim myInDesign as InDesign.Application Dim myPub as InDesign.Document Set myInDesign = CreateObject(“InDesign._ Application”) Set myPub = myInDesign.ActiveDocument myPub.Selection.Move Array(“10mm”,”40mm”)
Однако обратите внимание: при различных запросах InDesign выдает разные значения координат. Координаты геометрической границы объекта и его видимой границы есть различные массивы данных, включающие в себя по четыре значения: для верха (y), левого края(x), низа (y) и правого края (x).
![]() |
![]() |
Переходим к практике
Специфика журнальной публикации не позволяет в полной мере развернуть все особенности
конструкций скриптинга и снабдить их подробными примерами, как это могло бы
быть в отдельном издании-учебнике. Но мы и не ставили перед собой подобную задачу.
В дальнейшем мы продолжим конспективное изложение основ скриптинга и его диалектов
на VB и AppleScript, главный же смысл серии публикаций, посвященных скриптингу,
мы видим в решении с его помощью конкретных издательских задач.
Подробное руководство по скриптингу доступно для свободного скачивания с сайта Adobe Systems: http://www.adobe.com/products/indesign/pdfs/idsnscripting.pdf
Мы осваивали тонкости скриптинга в InDesign именно по этому руководству, в котором подробно и с примерами описывается каждая семантическая конструкция диалектов VB и AppleScript. Результатом наших экспериментов является появление и внедрение в производственный процесс издательства «КомпьютерПресс» нескольких очень полезных, на наш взгляд, облегчающих жизнь и экономящих время и верстальщикам и корректорам издательства. Один из этих скриптов, текст которого приведен на следующей полосе, мы предлагаем сегодня вашему вниманию. Наберите, протестируйте, отладьте, скомпилируйте из него исполняемый файл и распространите его среди своих коллег. Их благодарность не будет знать границ!
Верстка любого материала начинается с размещения текста на полосе и с его предобработки, которая, как правило, происходит при помощи операций поиска и замены. Утомительное занятие! Настоящий скрипт как раз и занимается предобработкой помещенного текста: расставляет символы неразрывного пробела после каждого односимвольного слова, удаляет двойные пробелы, заменяет там, где необходимо, дефис на тире и меняет западные типографские кавычки (“лапки”) на принятые в отечественной типографике («елочки»).
Логика скрипта основана на анализе текущего символа и двух предыдущих. Для визуализации процесса скрипт снабжен прогресс-индикатором, который вам необходимо нарисовать в любом редакторе форм и включить в проект в виде файла zam.frm.
Скрипт, безусловно, можно оттачивать, модифицировать и усложнять. Можно добавить процедуру предварительного выбора вариантов при помощи CheckBox: что включать в список замен, а что нет. Можно добавить замену иксов между цифрами на знак умножения (2x2 ® 2×2). Можно многое и не только с этим скриптом. Надеемся, что настоящая публикация подвигнет вас к экспериментам, уважаемый коллега. Обязуемся публиковать любой присланный нам законченный и работающий скрипт.
zlotnikov@compress.ru; michnykin@mail.ru
КомпьюАрт 2'2002