Welcome! 登入 註冊
美寶首頁 美寶百科 美寶論壇 美寶落格 美寶地圖

Advanced

InDesign的JavaScript程式設計-- 錨定物件

InDesign的JavaScript程式設計-- 錨定物件

分類標籤: 程式設計
一般的物件,如文字框,矩形框,圖片,是放在頁面上,
錨定物件則是將這些物件放在文章裡面,或者說把這些物件放在包含這些文章的物件(如文字框)裡面

(一)手動設定的方法:

(1)直接插入:
假設在Indesign裡面,有一個文字框,且包含文字如下:
[img]http://algebra.byethost11.com/InDesign%20Image%20for%20Mepo/sshot-1.png[/img]
如果我們想要在圖中的文字「圖片」和「進來」之間插入一個圖片
可以先利用游標將插入點放在「圖片」進來」之間
然後再執行正常程序的「置入」圖片
就可以得到下面的結果
[img]http://algebra.byethost11.com/InDesign%20Image%20for%20Mepo/sshot-2.png[/img]
現在,這個圖片就是一個錨定物件




(2)剪下、貼上
也可以先以正常程序在「頁面」上置入圖片
然後將這個圖片剪下,再將插入點放在「圖片」和「進來」之間
再執行「貼上」,結果也會和上面一樣



(3)錨定物件的意義:

(a)先提一個題外話,上面說「這個圖片就是一個錨定物件」,這句話有點不對
問題不在「錨定物件」,而是在「圖片」
因為當我們在Indesign中置入一個「圖片」的時候,Indesign「一定」會順便送你一個「矩形框」(rectangle),把它包起來
「圖片」一定在某一個「矩形框」裡面(上面的結果,看不到這個矩形框,但是它真的存在),
所以其實上面的情形,應該說那個「矩形框」才是「錨定物件」
(關於圖片的這個性質,下次再另為文說明)

(b) 錨定物件是在一個「字元」(character)裡面:
我們知道,當「文字框」的大小被改變的時候,文字框的內容也會跟著適應,現在,我們試著隨便改變一下上面那個文字框的大小,結果如下:
[img]http://algebra.byethost11.com/InDesign%20Image%20for%20Mepo/sshot-3.png[/img]
結果這個「錨定物件」就跟著其它文字一樣,一起去適應這個新的文字框大小
就好像它是在文字「圖片」和「進來」之間的另一個「文字」
事實上,Indesign確實把「圖片」和「進來」之間看成有一個文字,但這個文字並不是那個「錨定物件」,
比較明確的定位是:「錨定物件」是那個文字所包含的一個物件
其實如果只是單純設計,不是寫程式的話,把那個「錨定物件」看成就像一個「文字」也還好,
只是如果要寫程試去操控InDesign話,它們之間的定位應該是:
Indesign把「圖片」和「進來」之間看成有「一個字元(character)」這個字元裡面又包含了一個物件,就是那個矩形框
我們可以把包含這個框形框的字元,叫這個框形框的「爸爸」(在Indesign的物件模型裡面,這個字元就是這個矩形框的 parent 屬性,父母?家長?爸爸?)
他的爸爸是一個「字元」(character),但沒有「字元」的內容,卻包含了一個「矩形框」




(4)設定錨定物件的性質:

(a) 錨定物件會跟著文章一起改變位置,這是「錨定物件」最大的特性,常常也是我們想要作出一個錨定物件的原因。它之所以會動,詳細的說,是因為它的爸爸是文章中的一個字元,文章中的字元當然會跟著文章一起動,它的爸爸會動,它是在它的爸爸裡面的一個物件,所以它當然也就跟著一起動。
但是,重點來了,它雖然一定會跟著它的爸爸一起動,但它在它的爸爸裡面的位置是可以改變的,也就是我們可以設定它在它爸爸裡面的「相對位置」,比如說,你可以設定它一定要在它的爸爸的下面10公分的地方,如果它的爸爸往左移了20公分,它也會跟著往左移20公分,所以它就還是保持著它在它的爸爸下面的10公分

(b)那要怎麼設定「錨定物件」跟它爸爸之間的「相對距離」呢?就這樣:
(b-1)先選取這個錨定物件
(b-2)再選功能表裡的「物件」-->「錨定物件」-->「選項」
(b-3)會出現一個「錨定物件選項」的對話視窗,這視窗裡面的一堆設定,就是在設定「錨定物件」跟「它的爸爸」之間的相對距離
(b-4)至於每一個設定是什麼意思?有空再聊了


(二) JavaScript 設定「錨定物件」的方法:

(a) 以上面的情形為例子,如果我們想要在「圖片」和「進來」之間置入一個圖片, 那就是在「圖片」和「進來」之間的「插入點」插入一個圖片,我們先把這個插入點叫做 myInsertionPoint
如果上面的例子裡,Indesign只有一個文件,這個文件只有一頁,而且這頁只有這個文字框,我們可以這樣寫:

myInsertionPoint = app.documents[0].pages[0].textFrames[0].insertionPoints[14];

假設這個圖片放在電腦的c:\crab.jpg
要在這個插入點置入上面這個圖片,可以這樣寫:

myInsertionPoint.place('c:\crab.jpg');

這樣,結果就會如上面的第二圖所示

但如果,要給插入的這張圖取一個名字,以便之後的操作,可以這樣寫

myImages = myInsertionPoint.place('c:\crab.jpg');

但,麻煩來了,myImages 並不是這張圖,因為 place() 函式傳回的是一個陣列(array),這個陣列了包含了一堆place()函式所設定的物件,(這有點無聊,因為明明只設定了一個物件,但沒辦法,它就是要傳回陣列),因為我們只設定了一個物件,這個物件就是這傳回陣列的第一個元素,所以要找到這張圖,可以這樣寫:

myImage = myImages[0];

這樣 myImage 就是我們放的這張圖了。(所以,請注意,我一開始用的名字是 myImages,後面有加s,表示傳回的是一堆,之後的這個名字才沒有s)

或者也可以直接這樣寫

myImage = myInsertionPoints.place('c:\crab.jpg')[0];

這樣 myImage就直接代表了這張圖了

但我前面提到,圖片一定包含在一個「矩形框」裡面,這個矩形框就是這個圖片的parent屬形,所以要給這個矩形框取一個名字叫做myRectangle的話,可以這樣做:

myRectangle = myImage.parent

另一個跳過myImage,直接給myRectangle取名字的方法是

myRectangle = myInsertionPoint.place('c:\crab.jpg')[0].parent;

很high吧,javascript的便利性很大


(b)另外提一下:
如果不是要插入圖片,而是要在 myInsertionPoint新建一個錨定的文字框,可以這樣寫:

myTextFrame = myInsertionPoint.textFrames.add();


(c)它的爸爸:
我們前面提到,「錨定物件」一定有一個爸爸,這個爸爸是一個字元,前例中插入圖片後,錨定物件應該是指那個「矩形框」,這個矩形框的爸爸就是這個字元,我們可以這樣指到他的爸爸

myCharacter = myRectangle.parent





(3)JavaScript 設定「錨定物件」的性質(相對位置)
「錨定物件」的相對位置的設定是在該錨定物件的anchoredObjectSetting屬性裡面

如前例,如果要設定插入之後的錨定物件跟它的爸爸之間的相對位置,那就要設定 myRectangle.anchoredObjectSetting

anchoredObjectSetting 下面的子屬性如下:



(a) anchoredPosition:就是「錨定物件選項」視窗中的「位置」選項,它有下列3種可能值

AnchorPosition.INLINE_POSITION :對應到選項視窗中的「行中」
AnchorPosition.ABOVE_LINE:對應到選項視窗中的「行上方」
AnchorPosition.ANCHORED :對應到選項視窗中的「自訂」



(b) anchorPoint:錨定物件的「參考點」,這個只在「位置」選「自訂」時才有意義,也就是 anchoredPosition = AnchorPosition.ANCHORED
它是「自訂」視窗中的「錨定物件」「參考點」的位置設定
它有下列9個可能值,分別對應到一個方形圖裡的9個參考點(邊邊8個,中間1個)
AnchorPoint.TOP_LEFT_ANCHOR
AnchorPoint.TOP_CENTER_ANCHOR
AnchorPoint.TOP_RIGHT_ANCHOR
AnchorPoint.LEFT_CENTER_ANCHOR
AnchorPoint.CENTER_ANCHOR
AnchorPoint.RIGHT_CENTER_ANCHOR
AnchorPoint.BOTTOM_LEFT_ANCHOR
AnchorPoint.BOTTOM_CENTER_ANCHOR
AnchorPoint.BOTTOM_RIGHT_ANCHOR


(c)horizontalReferencePoint:這個也是只在「位置」選「自訂」時才有意義,在「自訂」視窗中的「X相對於:」,有5個可能值
AnchoredRelativeTo.COLUMN_EDGE:欄邊緣
AnchoredRelativeTo.TEXT_FRAME:文字框
AnchoredRelativeTo.PAGE_MARGINS:頁面邊緣
AnchoredRelativeTo.PAGE_EDGE:頁面邊界
AnchoredRelativeTo.ANCHOR_LOCATION:錨點標記


(c)verticalReferencePoint:這個也是只在「位置」選「自訂」時才有意義,在「自訂」視窗中的「Y相對於:」,有9個可能值
VerticallyRelativeTo.COLUMN_EDGE
VerticallyRelativeTo.TEXT_FRAME
VerticallyRelativeTo.PAGE_MARGINS
VerticallyRelativeTo.PAGE_EDGE
VerticallyRelativeTo.LINE_BASELINE
VerticallyRelativeTo.LINE_XHEIGHT
VerticallyRelativeTo.LINE_ASCENT
VerticallyRelativeTo.CAPHEIGHT
VerticallyRelativeTo.TOP_OF_LEADING

(d)anchorXoffset:X偏移量,它是一個數值

(e)anchorYoffset:Y偏移量,它也是一個數值


(f)pinPosition:這個也是只在「位置」選「自訂」時才有意義,在「自訂」視窗中的「保持在項端/底部的邊界內」
這的個logical值,只有「true」跟「false」兩種可能值



Edited 22 time(s). Last edit at 03/13/2010 12:39AM by RandomVariable.
(編輯記錄)

才從QuarkXpress.AppleScript的世界出走,初學JavaScript.Indesign,有RandomVariabe兄的分享,比自己看原文省力多了!

感恩.....為了在受氣時不侵犯女性..時常把他爸爸掛嘴上...用在解釋parent真是太洽如其分了...^^

Re: InDesign的JavaScript程式設計-- 錨定物件

分類標籤: 程式設計
Jony 兄 真抱歉
沒有注意到你的回文

結果已經是好幾月前的事了

當初寫這幾篇文章
是因為 寫程式的過程中 好不容易弄懂的東西
一段時間沒碰 很容易就 整個忘光光

而且 indesign 的 javascript 設計 甚至 vbscript applescript
一直是個 資源非常稀少的領域 不管是 台灣 還是 國外
連 adobe 自已出的手冊 功能都很粗略

稍微深入一點的功能 大概都要自已摸索

所以 那時就把自已好不容易弄清楚的觀念 趁著 它還熱熱的時候 趕快把它記下來
免得下次要再用的時候 又要從新開始

難得看到同好 觀迎來交流~~~~



Edited 1 time(s). Last edit at 08/05/2010 10:08PM by RandomVariable.
(編輯記錄)

看到 Jony 兄的回應才發現「他的爸爸」實在用得很妙......

其實如果在和 InDesign 搏鬥的半夜裡看到,應該會突然笑出來......