テキスト変数で特定の段落スタイル

[8479]テキスト変数で特定の段落スタイル 投稿者:圭 投稿日:2015/01/05 13:27:17
Mac 10.9.5
CS 6です。

特定の段落スタイルを設定したテキストを
テキスト変数でインデックスとして
画像のように挿入(矢印部分)したいのです。

前ページからの継続+すべて を挿入したいのですが
テキスト変数の定義に
ページの先頭 か ページの最後 しかないので
やはり無理でしょうか?

宜しくお願い致します。

attached image
[8482]Re: テキスト変数で特定の段落スタイル 投稿者:(z-) 投稿日:2015/01/06 19:54:54
スクリプト書き首脳陣、各人あたまひねり中。。
(放置はしていませんという意思表示です)
こういう手の案件は大昔は手作業で行っていましたが、近年は自動処理するようになってきていまして、
InDesignでのテキスト変数は、こういう接続したり、本文と見出しが連動するように考えて動いてくれないので、
結局のところ、スクリプトを都度書いて実行してたりします。

#target indesign
var tgtStyleName="見出し"; // 段落スタイル名を指定(スタイルグループは未対応)
var kgPos=5; // 小口からの距離(単位はドキュメントに依存)
var tnPos=18.5; // からの距離(単位はドキュメントに依存)
var hsrObjSize=[8,145]; // 柱の枠の幅と高さをカンマで区切って指定(単位はドキュメントに依存)
var hsrKhk="縦"; // 柱を縦にするか横にするかの指定
var jnStr="/"; // 柱を結合する際の区切り文字

///////////////////////////////////////////////////////////////////////////////////////////////
var NLN="[柱]"+gdt(1);
if(app.documents.length!=0){
if(app.selection.length==1){
var doc=app.activeDocument;
var sel=app.selection[0];
if(sel.hasOwnProperty('contents')){
// 選択テキストフレームのストーリーをテキストフレーム毎に確認して
// 見出しと本文の出現関係から柱を生成する
var a=sel.parentStory.textContainers;
var rslt=[];
for(var i=0;i<a.length;i++){ // 枠毎にループ
var pp=a[i].parentPage; // ページ名を取得(cs5以降?)
var tmp=[], mds=[];
for(var j=0;j<a[i].lines.length;j++){
if(a[i].lines[j].contents!=""){
if(a[i].lines[j].insertionPoints[0].appliedParagraphStyle.name==tgtStyleName){
tmp.push("1"); // 指定したスタイルと一致したので見出し扱い
mds.push(a[i].lines[j].contents); // 見出しの文字を取得
}else{
tmp.push("0"); // 指定したスタイルと一致しないので本文扱い
}
}else{
tmp.push("0"); // 空行も本文扱い
}
}
// 柱から改行の類を除去してから格納
rslt.push([pp.documentOffset,i,tmp.join(""),mds.join(jnStr).replace(/\r/gm,"")]);
}
// 取得した内容を確認して同ページのアイテムをまとめる(保険)
rslt.sort(); // ページの出現位置を先頭に格納しているので、それでorder
for(var i=0;i<rslt.length-1;i++){
if(rslt[i][0]==rslt[i+1][0]){
if(rslt[i][3]!="" && rslt[i+1][3]==""){
rslt[i+1][3]=rslt[i][3]; // 後の要素へ移動
}else if(rslt[i][3]!="" && rslt[i+1][3]!=""){
rslt[i+1][3]=rslt[i][3]+jnStr+rslt[i+1][3]; // 後の要素へ移動
}else if(rslt[i][3]=="" && rslt[i+1][3]==""){
rslt[i+1][3]="\u3000"; // 空要素同士なので空白を投入
}else{
alert("error...\r"+rslt[i][3]+"\r"+rslt[i+1][3]); // 後の要素へ移動できない可能性の場合
}
rslt[i+1][2]=rslt[i][2]+rslt[i+1][2]; // 後の要素へ移動
rslt[i][0]=rslt[i][1]=rslt[i][2]=rslt[i][3]=""; // 先の要素を消す
}
}
//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//-//
var flg=true;
for(var i=0;i<rslt.length;i++){
if(rslt[i][0].toString().match(/^\d+$/)){ //保険
if(flg){
// 初出
var hsr=rslt[i][3];
flg=false;
var mem=rslt[i][2];
}else{
// 2ページ目以降
if((mem.substr(mem.length-1,1)+rslt[i][2].substr(0,1)).match(/^[01]0$/)){
// 前ページの柱から最終要素を抽出
if(hsr.match(new RegExp(jnStr))){
var hsrArr=hsr.split(jnStr);
var hsr=hsrArr[hsrArr.length-1]+jnStr+rslt[i][3];
}else{
var hsr=hsr+rslt[i][3];
}
var mem=rslt[i][2];
}else{
// 前ページの柱を継続しなくても良い
var hsr=rslt[i][3];
var mem=rslt[i][2];
}
}
var tP=doc.pages[rslt[i][0]];
var nTXF=tP.textFrames.add({contents:hsr});
nTXF.itemLayer=LC(doc,NLN); // 指定したレイヤーへ
// ページの小口位置を取得
if(tP.side==PageSideOptions.RIGHT_HAND){ // 右なのか?
x=tP.bounds[3]-hsrObjSize[0]-kgPos;
nTXF.visibleBounds=[tnPos,x,tnPos+hsrObjSize[1],x+hsrObjSize[0]];
}else{
nTXF.visibleBounds=[tnPos,kgPos,tnPos+hsrObjSize[1],kgPos+hsrObjSize[0]];
}
if(hsrKhk=="縦"){ // テキストフレームの組方向
nTXF.parentStory.storyPreferences.storyOrientation=StoryHorizontalOrVertical.VERTICAL;
}else{
nTXF.parentStory.storyPreferences.storyOrientation=StoryHorizontalOrVertical.HORIZONTAL;
}
}
}
}else{
alert("対象のテキストフレームを選択して下さい。");
}
}else{
alert("対象のテキストフレームを1つ選択して下さい。");
}
}else{
alert("ドキュメントを開いて下さい。");
}

function gdt(opt){
Z=new Date();
y=Z.getFullYear();
M=Z.getMonth()+1; m=(M>9)?M:"0"+M;
D=Z.getDate(); d=(D>9)?D:"0"+D;
B="";
if(opt==1){
// タイムスタンプも付加して返値する
H=Z.getHours(); h=(H>9)?H:"0"+H;
F=Z.getMinutes(); f=(F>9)?F:"0"+F;
S=Z.getSeconds(); s=(S>9)?S:"0"+S;
B=""+H+""+F+""+S;
}
return ""+y+""+m+""+d+""+B;
}
function LC(o,s){
p=o.layers.itemByName(s);
return (p.isValid)? p: o.layers.add({name:s});
}
連投失礼しました…

最後に、実行後のドキュメント状態をキャプチャした画像を添付しておきます。

スクリプト先頭に必要な設定類を書いておきましたので、実行時に調整してみてください。

# 例外処理は実務用よりも少なめですので、ご利用の際には念入りにチェックして下さいね。(あくまでも自己責任にて

では…

attached image
[8489]Re: テキスト変数で特定の段落スタイル 投稿者:Subi 投稿日:2015/01/07 12:47:00
流星さんお疲れ様です。
スクリプトを試してみて気づいたことです。

・時間のタイムスタンプが一桁のときにゼロが入らないです。
119行目を「B=""+h+""+f+""+s;」と小文字にすると入ります。(しない場合、01:11:01と11:01:01がどちらも1111になる)

・柱に段落スタイルを指定するには、スクリプトを実行する前に何も選択してない状態で柱に適用したい段落スタイルを選択して、そこからテキストフレーム選択してスクリプト実行で柱にスタイル指定できました。
この記事の書き込み元へのリンク (コメントや質問などはこちらへどうぞ)