Допечатные процессы
 Печать
 Послепечать
Стратегия
 Расходные материалы
 Справочник покупателя
 Управление и кадры
 Как они это сделали
Выставки
Интервью
Электронные издания

От редактора

В печатном цехе...
Стохастика с Александром Шнайдером
В лаборатории цвета с Александром Миловским
Взгляд Эндрю Трибьюта
В дизайн-студии с Георгием Зыковым
Личная практика
ART Direction
На самом деле...
Без галстука
В типографии с Марселем

Выставки
Ассоциации
Издания и сайты

Редакционные планы
Какие из инноваций в цифровой печати Вам кажутся самыми полезными и переспективными?
Увеличенный формат
Повышенная скорость
Новые виды чернил/тонеров
Расширение спектра запечатываемых материалов
Другое

Результаты
Главная Форум Подписка О нас Контакты
 

Бой табличной скуке!

Publish, #08 2007

Михаил Борисов

Фактически мы повторяем все действия, которые выполняем при создании шапки вручную, — сначала выделяем строки, а потом конвертируем. Метод хорошо работает, если заранее точно известно, сколько рядов занимает шапка. Автоматизировать процесс, к сожалению, не удастся, поскольку структура таблицы может быть сколь угодно сложной.

Растягивание таблицы

Если в публикации несколько таблиц, часто возникает ситуация, когда нижний край таблицы немного не доходит до низа колонки набора — начинать новый абзац смысла нет, а оставлять «висельника» тоже нехорошо. Надо увеличить высоту таблицы за счёт добавления интервалов между ячейками так, чтобы она чётко вписывалась в оставшееся до низа колонки место.

Pис. 2. Растягиваем таблицу до края полосы набора

Из рисунка 2 видно, что нам понадобятся ссылки на: текущий текстовый фрейм (чтобы узнать нижнюю границу таблицы); абзац с таблицей (определить её верхнюю границу); саму таблицу (для изменения высоты ячеек).

Устанавливаем знакомые из предыдущего примера ссылки:

mySelection = app.activeDocument.selection[0];
myTable = sel.parent.parent;
myParagraph = mySelection.storyOffset.paragraphs[0];
myTextFrame = sel.parentTextFrames[0];

Определяем реальную высоту таблицы и требуемую; результат делим на количество строк — это и будет то приращение, на которое нужно увеличить высоту строки.

delta = (myTextFrame.geometricBounds[2] — myParagraph.baseline)/ myTable.rows.length;

Дальнейшее имеет два сценария:

  1. Явная установка высоты ячейки (величина приращения нам уже известна).
  2. Изменение отступов сверху и снизу (предпочтительнее, поскольку не зависит от способа выравнивания текста в ячейке по вертикали).

Остановимся на последнем. Естественно, величина приращения для каждого отступа должна быть вдвое меньше, чтобы в итоге мы вышли на то же значение. Осталось предусмотреть вариант, когда строк не так много, а расстояние до низа колонки набора достаточно большое. Задаём порог (thresholdValue) — макс. значение высоты ячейки.

thresholdValue = «1 cm»;
for (i = 0; i < myTable.rows.length; i++) {
if (delta > thresholdValue) delta = thresholdValue;
myTable.rows[i]. topInset += delta / 2;
myTable.rows[i]. bottomInset += delta / 2;
}

Если строк много, вместо for (i = 0; i < myTable.rows.length; i++) можно использовать уже рассматривавшийся метод itemByRange().

Надеюсь, примеры помогут вам в освоении скриптинга. Удачи!

Об авторе: Михаил Борисов (mikebb@ukr.net), пишет для Publish полезные советы и обзоры ПО.


Универсальные методы

Для большей гибкости и удобства любая коллекция InDesign поддерживает методы: получить следующий объект (nextItem()), предыдущий (previousItem()), самый первый (firstItem()), последний (lastItem()), расположенный посредине (middleItem). Это позволяет не тратить время на получение конкретного индекса элемента в коллекции (абсолютное значение), а просто задавать относительное, что гораздо проще.

Комбинируя метод itemByRange() с методами, задающими относительное положение объекта, можно эффективно и просто управлять большими массивами объектов.

Обратите внимание, что параметры диапазона, как и itemByRange(), — это тоже методы. А поскольку они принимают параметры, можно обращаться через необходимую комбинацию к любому объекту, например, к предпоследнему: currentStory.paragraphs.previousItem (currentStory.paragraphs.lastItem()) и т. д.

Сфера использования метода itemByRange() распространяется на различные объекты, за что InDesign нужно сказать отдельное спасибо. Среди них — работа со строками, колонками, символами, абзацами. Поскольку InDesign задействует внутренний механизм, никакого дискомфорта даже в случае обработки значительных фрагментов нет, особенно это ощущается при работе с таблицами на уровне ячеек — на более высоком уровне (строки, колонки) эффект менее заметен.

Помните, что работа идёт исключительно с теми объектами, к которым метод применяется. Если задать диапазон строк таблицы, доступ к отдельным ячейкам внутри этих строк будет запрещён.


Всегда в резерве

Многие свойства (verticalJustification, horisontalJustification, position и др.) могут иметь только зарезервированные значения. Их допускается задавать двумя способами: либо в текстовом виде (VerticalJustification.centerAlign, Position.Superscript), что увеличивает читабельность кода, либо в цифровом — читабельность приносится в жертву производительности, поскольку InDesign не нужно проводить дополнительного преобразования. Полный список зарезервированных значений (Enumerators) есть в руководстве по написанию скриптов.

Данное число соответствует выбранному нами типу выравнивания. Можно писать и по-другому: verticalJustification = VerticalJustification.centerAlign; Так понятнее, но несколько медленней, поскольку скрипту всё равно придётся выполнять это преобразование.







© 1996-2008, «Издательство "Открытые системы"». Авторские права на все статьи, размещённые на сайте Publish, принадлежат издательству "Открытые системы". Их полное или частичное воспроизведение или размножение каким бы то ни было способом допускается только с письменного разрешения правообладателя.


Rambler's Top100