Вставка слова со следующей страницы

Статус
Закрыто для дальнейших ответов.

Sashalvov

Участник
Топикстартер
Сообщения
18
Реакции
0
Как отобразить во фрейме начальное слово следующей страницы?
Нужно это проделать во всем документе.
Существуют ли методы более продуктивные чем копировать-вставить?
 

Maxbor

15 лет на форуме
Сообщения
215
Реакции
82
Ответ: Вставка слова со следующей страницы

Автоматически — никак.
Более того, некоторое время назад при попытке заказать соответствующий плагин, обнаружилось, что и такой возможности не подразумевает Adobe InDi SDK.
Пришлось выкручиваться скриптом.
Поскольку последний имеет совсем нетоварный вид, предложить его всем не могу.
Если есть желание разбираться в скрипте, пишите в личку.
 

Strizh

15 лет на форуме
Сообщения
982
Реакции
92
Ответ: Вставка слова со следующей страницы

Автоматически — никак.
Более того, некоторое время назад при попытке заказать соответствующий плагин, обнаружилось, что и такой возможности не подразумевает Adobe InDi SDK.

Максим, ты немного исковеркал мой ответ.
У тебя задача была:
а) взять текст;
б) вставить его в колонтитул;
в) применить к нему исходное форматирование.

Так вот пункты а и б - на это есть методы в СДК
на пункт в - нет. Возможно только применение "местного" форматирования.
 

Sashalvov

Участник
Топикстартер
Сообщения
18
Реакции
0
Ответ: Вставка слова со следующей страницы

Что подразумевается под "местным" форматированием?
 

Maxbor

15 лет на форуме
Сообщения
215
Реакции
82
Ответ: Вставка слова со следующей страницы

Это значит, что форматирование задается местно, то есть уже в колонтитуле, а не берется из источника, то есть со следующей страницы.
 

Sashalvov

Участник
Топикстартер
Сообщения
18
Реакции
0
Ответ: Вставка слова со следующей страницы

То есть чтобы изменить форматирование нужно отсоединить фрейм из цепи?
По моему даже исполнение пункта а) и б) значительно облегчает верстку.
Только вопрос как это реализовать?
 

Maxbor

15 лет на форуме
Сообщения
215
Реакции
82
Ответ: Вставка слова со следующей страницы

По идее, цепи не должно быть вобще. На мастере должен быть фрейм с переменной. В нем и задается форматирование. А вот уже если его нужно изменить, тогда на конкретной странице этот фрейм отделяется от мастера и вносятся локальные изменения.
Реализовать при помощи плагина, программирование которого нужно кому-то заказать, например, Strizh-у, автора поста #3 в текущей теме.
Если вопрос будет реализван при помощи плагина, при изменении расположения текста автоматом будет меняться колонтитул.
 

Eugenyus

12 лет на форуме
Сообщения
1 960
Реакции
3 589
Ответ: Вставка слова со следующей страницы

Код:
var myTF = app.activeDocument.selection[0].parentStory.texts[0].parentTextFrames;
for (i=0;i<myTF.length;i++){
	myTF[i].label = "MainText";
	}
var myPages = app.activeDocument.pages;
for (i=0;i<myPages.length-1;i++){
	try{
		myPages[i].textFrames.item("NextPageFirstWord").contents = myPages[i+1].textFrames.item("MainText").words[0].contents;
		}
	catch (e){
		myPages[i].textFrames.add({geometricBounds:[250,20,260,70], appliedObjectStyle:app.activeDocument.objectStyles.item("NextPageFirstWord"), contents: myPages[i+1].textFrames.item("MainText").words[0].contents, label:"NextPageFirstWord"});
		}
	}
Скрипт в таком виде работает при условии, что имеем один материал, который проходит по всей книге по всем страницам.
Перед запуском скрипта нужно:
1. создать объектный стиль с именем NextPageFirstWord для текстового фрейма, в который должно вставляться слово;
2. В параметрах (Preferences) во вкладке Units & Increments/Ruler Units/Origin выставить Page;
3. В строке скрипта geometricBounds:[250,20,260,70] выставить точные координаты (Y1,X1,Y2,X2) для фрейма со словом, где Y1,X1 — верхний левый угол, Y2,X2 — правый нижний угол фрейма.
4. Установить курсор в текст, из которого должны браться слова.

При первом запуске скрипт создает на каждой странице фреймы и вписывает первое слово следующей страницы.
При повторном запуске скрипт использует уже существующие фреймы, заменяя содержимое.

Проверяйте на копии файла.
 
  • Спасибо
Реакции: dega

Sashalvov

Участник
Топикстартер
Сообщения
18
Реакции
0
Ответ: Вставка слова со следующей страницы

Что-то не получается. При запуске скрипта в ИД выдает ошибку в первой строке undefined. В ExtendScript тоже при отладке зависает на первой строке: undefined is not an object.
 

Eugenyus

12 лет на форуме
Сообщения
1 960
Реакции
3 589
Ответ: Вставка слова со следующей страницы

П.4 из инструкции в посте 8 выполнен?
 

Sashalvov

Участник
Топикстартер
Сообщения
18
Реакции
0
Ответ: Вставка слова со следующей страницы

Огромное спасибо!
Все заработало, прозевал п.4.

Есть еще одно пожелание. Если последнее слово имеет перенос, то во фрейм оно вставляется полностью. Возможно ли вставлять только вторую часть?
 

Eugenyus

12 лет на форуме
Сообщения
1 960
Реакции
3 589
Ответ: Вставка слова со следующей страницы

Та можно в принципе, только с ходу в это время суток чего-то не придумывается.:)

Не по теме:
Честно говоря, не очень хорошо, когда слово переносится между страницами. Внутри разворота еще допустимо, если очень-очень закрыть глаза... В параметрах переносов даже птиц специальных надавали, чтобы контролировать
 

Sashalvov

Участник
Топикстартер
Сообщения
18
Реакции
0
Ответ: Вставка слова со следующей страницы

Не по теме:
Да оно не хорошо, но что делать при верстке 36 пт на А-4? Увеличеный трекинг при двух словах в строке, зрелище довольно грустное.
 

Sashalvov

Участник
Топикстартер
Сообщения
18
Реакции
0
Ответ: Вставка слова со следующей страницы

Проблема: Скрипт работает хорошо при одинаковых внешних и внутренних полях. При разности полей фреймы на одних страницах смещаются.
 

Eugenyus

12 лет на форуме
Сообщения
1 960
Реакции
3 589
Ответ: Вставка слова со следующей страницы

Код:
var GBLeft = [250,20,260,70];
var GBRight = [250,15,260,70];
var myGB = new Array();
var myTF = app.activeDocument.selection[0].parentStory.texts[0].parentTextFrames;
for (i=0;i<myTF.length;i++){
	myTF[i].label = "MainText";
	}
var myPages = app.activeDocument.pages;
for (i=0;i<myPages.length-1;i++){
	try{
		myPages[i].textFrames.item("NextPageFirstWord").contents = myPages[i+1].textFrames.item("MainText").words[0].contents;
		}
	catch (e){
				if (i%2 == 0){myGB = GBRight;} else {myGB = GBLeft;}
		myPages[i].textFrames.add({geometricBounds:myGB, appliedObjectStyle:app.activeDocument.objectStyles.item("NextPageFirstWord"), contents: myPages[i+1].textFrames.item("MainText").words[0].contents, label:"NextPageFirstWord"});
		}
	}
В первой и второй строках задайте координаты для левой и правой страниц отдельно.
Это не фреймы смещаются. Это они визуально выглядят смещенными относительно полей.

PS. Вам скорее всего потребуется удалить старые фреймы. Это можно сделать так:
Код:
app.activeDocument.textFrames.item("NextPageFirstWord").remove();
 

Sashalvov

Участник
Топикстартер
Сообщения
18
Реакции
0
Ответ: Вставка слова со следующей страницы

Спасибо!
 

boriskasmoscow

15 лет на форуме
Сообщения
343
Реакции
410
Ответ: Вставка слова со следующей страницы

Eugenyus, для определения правая или левая страница есть свойства PageSideOptions: напр.: if(myPage.side == PageSideOptions.leftHand){...
 

Eugenyus

12 лет на форуме
Сообщения
1 960
Реакции
3 589
Ответ: Вставка слова со следующей страницы

Если последнее слово имеет перенос, то во фрейм оно вставляется полностью. Возможно ли вставлять только вторую часть?
Код:
var GBLeft = [287,0,297,90];
var GBRight = [287,120,297,205];
var myGB = new Array();
var myTF = app.activeDocument.selection[0].parentStory.texts[0].parentTextFrames;
for (i=0;i<myTF.length;i++){
	myTF[i].label = "MainText";
	}
var myPages = app.activeDocument.pages;

//************Изменения начинаются отсюда************//
for (i=0;i<myPages.length-1;i++){
	var myText = String(myPages[i+1].textFrames.item("MainText").texts[0].contents);
	var myWords = myText.split(" "); //Признак отдельного слова - обычный пробел
	try{
		myPages[i].textFrames.item("NextPageFirstWord").contents = myWords[0];
		}
	catch (e){
				if (myPages[i].side == PageSideOptions.RIGHT_HAND){myGB = GBRight;} else {myGB = GBLeft;}
		myPages[i].textFrames.add({geometricBounds:myGB, appliedObjectStyle:app.activeDocument.objectStyles.item("NextPageFirstWord"), contents: myWords[0], label:"NextPageFirstWord"});
		}
	
	//Контроль неразрывных пробелов и слов за ними, и знаков припинания, попавших во фрейм
	app.findGrepPreferences = app.changeGrepPreferences = null; 
	
	app.findGrepPreferences.findWhat = "\\s.+";
	myPages[i].textFrames.item("NextPageFirstWord").changeGrep();
	
	app.findGrepPreferences.findWhat = "[[:punct:]]";
	myPages[i].textFrames.item("NextPageFirstWord").changeGrep();
	}
 

boriskasmoscow

15 лет на форуме
Сообщения
343
Реакции
410
Ответ: Вставка слова со следующей страницы

А так не проще?
...
myWords = myPages[i+1].textFrames.item("MainText").lines[0].contents.split(/\s/);
myWords[0] = myWords[0].replace(/\.|\,|!/gi, ""); // в replace добавить других знаков препинания при необходимости
// Grep не нужен.
 

Eugenyus

12 лет на форуме
Сообщения
1 960
Реакции
3 589
Ответ: Вставка слова со следующей страницы

Проще.:)
Ну я не буду еще раз дублировать весь код, ладно? В любом случае оба варианта скрипта рабочие, осталось дождаться, что скажет ТС.

Не по теме:
Вообще-то там дорабатывать еще много чего. Например, возможность задавать диапазон страниц, учет того, что в документе может быть несколько материалов, а на странице — несколько фреймов; табличная верстка тоже не учтена... Но этим уже предлагаю заняться тем, у кого есть желание.:)
 
Статус
Закрыто для дальнейших ответов.