読者です 読者をやめる 読者になる 読者になる

とあるDTPオペレーターのInDesignスクリプト備忘録

DTPオペレーターのInDesign用スクリプトのメモ。

スクリプトの勉強をするにあたり、あるといいモノ

スクリプト習得において、必要と思われるものを書いていきます。★は重要度です。
なお、ここでいうスクリプトは特にことわりがない場合「ExtendScript」を指します。
また、Adobeスクリプトの命令文の集合体は「オブジェクトモデル」とか呼ばれますが、InDesignでも普通に「オブジェクト」という言葉を使うので、混乱しないようにここでは「命令」とか「命令文」と記述します。オブジェクトとかプロパティとか、スクリプト側とInDesign側とで用語を共用しているのは結構初心者泣かせじゃないですか?
そう思うのは私だけですか…そうですか…

1 ESTK(★★★★★)
ESTKとは、Adobeスクリプトエディタです。
どんなソフトでも文字さえ打てればスクリプト作成はできますが、やはりAdobe用のスクリプトAdobeの用意したエディタで作った方が楽です。
エラーを教えてくれたり、スクリプト内部の動きが見られたり、エディタ上からスクリプト実行や停止が出来たりと、やはり専用エディタならではの便利さがあります。
最初のうちは用意された機能の用途も分からないかもしれませんが、文字が勝手に色付けされるだけでもそれっぽい気分になれるはずです(笑)

2 本
Adobeスクリプトの本はあまりありません。全てを網羅した本は皆無です。それでも以下の2冊は基本を学ぶのにとても役立ちました。
① スッキリわかるJava入門(★★★☆☆)
これはAdobe用ではなく、完全なJavaスクリプトの本です。AdobeスクリプトExtendScriptはほぼJavaなので、私のように完全なゼロの状態からスクリプトを学ぶためにはこうした本が必須でした。
本書はプログラム初心者にもとてもわかり易く、のちの勉強に大いに役立ちました。ただし、後半はAdobeスクリプトの勉強にはあまり関係ないかもしれません。

② ESTK基本編(★★★★☆)
 エディタの入門書のようなタイトルですが、内容的にはスクリプトの書き方の基礎が網羅されています。実用的な例文も豊富に用意されているので、カスタマイズすればそのまま使えるようなものもあるかもしれません。たとえば「フォルダ内のInDesignファイルをサブフォルダまで探し、全て開く」という処理は多くのスクリプトで役立つことでしょう。

本はなくても、ネットで調べられるという人はなんとかなると思います。特に①の本は似たような本を身近な人から借りれば充分かもしれません。

3 インターネット環境(★★★★☆)
入門書が少ないのに対し、スクリプトの説明や実用的なスクリプトを掲載したサイトはたくさんあります。スクリプトをある程度習得している人は、いますぐ私のサイトを閉じてそちらに行くべきかもしれません(笑)。
最初のうちは「ネットで見つけたスクリプトを改造して使う」という目的でそれらのサイトを見に行くと思いますが、ある程度書けるようになると、「この処理の書き方は?」とか「このオブジェクトモデル(命令文とかです)の正しい使い方は?」といった「ヒント」や「確認」の意図で見に行くことが増えると思います。また、あまり使っている人のいないような命令文を使う場合、探し方にちょっとしたコツがあるので、そのコツについてもいずれ紹介したいと思います。

4 必要に迫られているという状況(★★★★★)
急に精神的な話になってごめんなさい。「人手が足りない、仕事が多すぎる、作業が大変すぎるetc…」
ともあれ「スクリプトを覚えなきゃ!」という状況に立たされているというのはとても大事です。
人間、「役立つ場面の分からない技術」「必要のない道具」の使い方を学ぶというのは難しいものです。
活用する予定の全くない外国語を学ぶのって身が入らないですよね。スクリプトも同じです。

5 英語力(★☆☆☆☆)
英語力のない私が言うのもなんですが、英語が堪能な方はスクリプト習得において有利だと思います。スクリプト自体が簡単な英語で構築されているので、英語が詳しければそれぞれの命令文が何をするためのものなのかなんとなく分かると思いますし、海外のサイトを参考にすることも出来ちゃいます。海外のInDesignユーザーの方が、マニアックな命令文をよく使っている気がします。

6 プログラム的な考え方(★★★★☆)
初心者が書いたスクリプトがうまく動かない理由のほとんどは、「プログラム的な書き方をされていないから」だと思います。人間に「これやって」と頼む感覚に近いんですね。
たとえば塗りがC100のフレームを消させる場合、初心者はド直球に「塗りがC100のフレームを探して」という書き方をしようとしますが、スクリプトで書く場合は「フレームを片っ端から調べて。そんでそれが塗りC100だったらアレして」という書き方になります。また、プログラム的な考え方が出来るようになると、「エラーやバグが出ないような書き方」に留意できるようになると思います。

7 ひらめき・発想(★★★★★)
スクリプトを書くためにはたくさんの命令文や構文を知らないといけないんだろうなあ」というのは初心者をスクリプトから遠ざける一因だと思います。
実際は命令文をほとんど知らなくても、ひらめきと発想があれば最小限の知識で大掛かりな処理をするスクリプトが書けたりしちゃいます。
「これをこうしてこうすればこういう処理ができそう」とひらめくことは何より大事です。

8 InDesignの知識(★★★☆☆)
InDesignの経験がほぼないのにものすごく有益なスクリプトを作ってしまうSEさんを知っていますが、InDesignを熟知しているというのは、InDesignスクリプトの作成においてとても助けになります。「手作業ならこの機能とこの機能で出来る」という頭があれば、あとはその機能をスクリプトで呼び出す方法を調べればいいわけですから。
InDesign経験がないのに(プログラマの人は本当にすごい)スクリプトを書いてしまえる人は、「プログラムの下地が段違い」「調べる能力が優れている」「理解する能力が優れている」という、元々のスペックがものすごく優秀なんだと思います。


次回は基本的な命令にプログラム的な指示のし方をからめつつ、あれこれ書いてみようと思います。

スクリプトを覚えたい人向けコラム

現時点で読者の全然いないブログですが、スクリプトを勉強したいという人向けに、ぽつぽつとコラムを書いてみようと思います。
スクリプト歴1年やそこらの人間が講釈を垂れるのもあれなんで、これは講義でも講座でもなくただのコラムです。
「覚える人向け」ではなく「覚えたい人向け」です(どれだけ予防線を張るのか(笑))

がしかし、スクリプト歴1年の人間だからこそ、初心者の気持ちはよく分かります。つまづきそうなところも…

読者がいないのでしばらくは気の向くまま前置きを書き連ねますが、いずれは実践的なことも書きたいと思っています。
更新ペースや記事のクオリティは読者数や反応と比例します(笑)

自己紹介は過去にもしてますが、スクリプトに重点を置きつつあらためて自己紹介


スクリプトを初めて書いたのは43歳のときです。結構行ってますね(笑)。それまではプログラムのプの字も分からない人間でした。
数学も英語も苦手だったので、当然(?)プログラムに手を出す気もありませんでした。
そんななんの下地もない中年が独学で、なんとか仕事で使える程度のスクリプトを書けるようになったのです。

私がスクリプトを書くようになったのは、ひとえに「仕事を楽に進めたいから」でした。
大型案件を少数のチームで回す仕事をナリワイとしているのですが、まともにやっていたら毎日終電! ミス連発!なのは目にみえていたので、
うすぼんやりと「スクリプトでやれば楽なんだろうなあ…」と思ったのがきっかけ。

当時の自分は「正規表現スタイル」とInDesignの標準機能を駆使して作業時間短縮の模索をしていたので、その延長線上にスクリプトが現れるのは必然でした。
ネットで情報を探しながら組み上げたボロボロのスクリプトが無事動作し、複雑な処理が1分くらいで完了し、作業が劇的に楽になったときは
世界がひらけたような気がしたのを覚えています。

それから1年のあいだに100くらいスクリプトを書いたと思います(合体できるものは合体してしまっているので実数はもっと少ないですが)
仕事が楽になるから、ミスがなくなるから、みんなが喜ぶから、会社のため…

動機はいろいろあるかもしれませんが、私がスクリプトにハマったのは、「スクリプトを書くのが楽しいから」に尽きると思います。
特に宣伝もしないので、たまたまこのブログにアクセスした初心者さんがつまづいているポイントを解きほぐし、有益な情報を発信できたらこのうえない幸いです。

次回は「スクリプトを書くために必要なもの」を投稿します。本だったり、調べ方だったり、考え方だったり、心構えだったり…

フレームサイズで条件分岐

フレーム幅を条件にした処理をしたいときの話。
たとえば幅60mmのテキストフレームだけにある処理をしたいよーというとき、まず思いつくのはこんな書き方ではないでしょうか。

var myTF = app.activeDocument.textFrames;
for (var i=0; i<myTF.length; i++) {
    var y1 = myTF[i].visibleBounds[0];  //左上y
    var x1 = myTF[i].visibleBounds[1];  //左上x
    var y2 = myTF[i].visibleBounds[2];  //右下y
    var x2 = myTF[i].visibleBounds[3];  //右下x

if (y2-y1 == 60){
    なんらかの処理
}

でもこの書き方だと、条件に合致するにも関わらず処理が行われない場合が。ナゼ?
それは、InDesignの画面上ではたしかにW=60mmですが、InDesignの内部的には59.99999……
みたいな寸法になっていることがあるからなのです(ESTKのデータブラウザで確認可)。

なので、if文をこんな感じで書くと、フレームの寸法を条件化することができマス。

if (y2-y1 > 59.9 && y2-y1 <60.1){
    なんらかの処理
}

roundを使って四捨五入するのが本筋なのかもしれませんが、この方が楽なのでこっちを使ってます。
もっとスマートな書き方があれば教えてくださいませ…

自動組版と謎の文字FEFF

最近はDTP作業以上に自動組版(DBパブリッシャー使用)案件の比重が増えてきて、社内で唯一の自動組版設計者としては日に日に求められることが増えてきて、やったこともないようなことや頭の中だけでうまくいってることを実務に取り入れることが多い。

テキスト文書を読み込ませて、ターゲットにその内容を流し込んでいくというスクリプトをDBパブリッシャードキュメント上で使用したところ、書き戻ししたテキストに奇妙な文字化けが…その文字化けのせいで、流し込みの結果もなんだかおかしなことに。
そしてこの文字化け、どうやっても触れない。ためしに正規表現で削ろうとしても削れない。ユニコードで検索しても引っかからない。さあ困った。


あれこれ調べてみたところ、どうやらこやつの正体はU+FEFFというコードのキャラクターで、またの名を「ノンブレークスペース」というらしい。文字ではなく制御記号ということなので、触れないし削れないのもなんとなく納得。
作業時に必ず走らせるスクリプトに以下の処理を付け加えることにした。FEFFを削除するスクリプト(といってもただ検索置換してるだけですが)

var myDoc = app.activeDocument;
    app.findTextPreferences.findWhat = "<FEFF>";
    app.changeTextPreferences.changeTo = ""
    myDoc.changeText (); //アクティブなドキュメントのみ検索対象

        app.findTextPreferences = NothingEnum.nothing;
        app.changeTextPreferences =NothingEnum.nothing; //検索置換を初期化

ニューラーメンショップ 桶川店

ラーメンショップは学生時代によく食べたこともあって、たまに食べるとノスタルジックな気持ちになってしまう。
時々訪れる「ラーショ行きたい発作」に負け、桶川まで車を走らせた。

ものすごく美味しいわけではないんだけど、時々無性に食べたくなる、それがラーショというもの。
とくに戸田にあったラーショ新曽店は、戸田に行くたびに立ち寄るくらいどストライクな味だった。
すべてがちょうどいい、というか自分好みの味のお気に入り店だったが、最近「イマイ帝国」という二郎インスパ系の店に変わり、私はすっかりラーショ難民になってしまった。
近くの大学に通ってた頃に埼大通り店を贔屓にしてた頃もあったけど、その店は割りと臨時休業が多く、ついでの用事でもない限りその店には行かなくなってしまった。

そんな矢先、年中無休のラーショが桶川にあるという話を聞き、行きつけラーショ候補として私の中で急浮上した。

店に着いたのが日曜の11時半くらい。混雑してるのを覚悟していたが客はほとんどいない。駐車場を共用している目の前の丸亀製麺所に客を取られているのではないか。
ニューラーメンショップ桶川店はラーショにしては広い店内で、一蘭のようにカウンターがついたてで仕切られている。一蘭ほどキッチリ仕切られているわけではないが、隣の席との間隔が広いのはうれしい。
ラーショはカウンターがゴチャゴチャしてて狭い店が多いのだ(おまけにカウンターの下の棚には漫画や新聞がつまっている。それもラーショの味わいなのだが)。

注文したのは「ネギチャーシュー小 1000円」「ネギ丼 350円」。ネギ丼て250円じゃなかったっけ? と思いつつも、頭がネギ丼になっていたのでそのまま注文。
割りとすぐに注文の品がやってきた。
ラーショの象徴である藤色の平たい丼から一口スープをすすって「これだ!」と心の中で叫ぶ。これぞラーショの味。


◆麺
あまりラーショっぽくない麺。つるつる感が強い。スーパーで売ってる生麺のような感じ。慣れの問題かもしれないがラーショにはつるつる感のない中太ストレートが合うと思った。

◆スープ
ラーショのスープはしょっぱいものが多いが、ここのはその中でもしょっぱい部類かも。スープを飲みながら食べると後半きつくなる。

◆チャーシュー
ラーショのチャーシューは割りとパサッとしたものが多いが、ここのはトロトロしている。結構好きな味。

◆その他の具
ネギはまさしくラーショのネギ。ただ意外と量が少ない

◆ネギ丼
結構量が多くてビックリ。100円値上げして量を増やしたのか? 気軽に注文できる量ではないな。とにかくしょっぱく、常食したらヤバそうなレベル。
ネギが山盛りで、ラーメンに移せばよかったかもしれない。


食べ終わる頃には塩分過多で体が悲鳴を上げていた気がする。夏場、運動をした後にはいいかもしれないな。
次に行くことがあったらネギ丼はやめて、ラーメンは味薄めにしてもらおう。

f:id:rokuyaN:20170219153131j:plain
f:id:rokuyaN:20170219153137j:plain

中浦和 つむじ

中浦和のつむじにてラーメンを食べました。
もともと北浦和にあったお店(当時の屋号は旋)で、その当時はいつ行ってもすんなり入店できることはほぼないほどの人気店でした。

しかし、いまは店が広くなったことを差し引いても客の入りはいまひとつ。
中浦和という立地もあるのかな? 利用する側としては空いてる方がありがたいですが。
カウンター席の間隔もゆったりめで、足元には手荷物を入れておけるカゴが置いてあります。

北浦和時代と比べるととにかく店内が広く、店員さんも四人くらいいたり…
店員さんは平均年齢が若そう。北浦和時代は創業者夫妻の家族経営みたいな感じだった気が?
とはいえ、北浦和時代にこの店に入ったことは数回しかないので、記憶に自信はありません。

入店し、券売機で「特製ラーメン 1000円」と「ミニサイズのチャーシュー丼 200円」を購入。
で、当時の記憶を呼び起こしながら味わってみました。

スープ
スープはあっさりめのダブルスープ(説明書きには「鶏」と「魚介」とある)で、ほんのり鰹節っぽい香り。
味は甘みを強く感じる。北浦和時代はもっとコクがあってクリーミーな感じだった気が…


麺の茹で加減は硬めでプリプリ感があった。あまりスープと馴染んでない印象。
おそらくこの麺はもう少し茹でた方が美味しく味わえそう。


具のチャーシューは厚みのあるやわらか肉で美味。

サイドメニュー
チャーシュー丼は鶏肉と豚肉がゴロゴロ載っているが、少し固い。
何より、香水のような人工的な風味がして少し苦手な感じだった。
なんの匂いだろう?

全体的にあまり好みではない感じでネガティブなことばかり書いてしまったが、
お店は広くて明るくていい雰囲気なので、期待しています。

f:id:rokuyaN:20170218174609j:plain

自己紹介

一応、このブログを書いてる人間についても記しておきます。

InDesign歴…CSが付く前から使っています
スクリプト歴…1年前から勉強し始めました。それ以前は「プログラムって何? うまいの?」な人間でした。VBAも少し書けるように。
仕事…DTPオペレータ、グラフィックデザイン、イラストレーション、自動組版設計、スクリプト開発
使用アプリ…InDesign(CC)、ほかアドビアプリ、Office系アプリの扱いも得意です。
対応OS…WindowsMacintoshもイケますが、Windowsの方が慣れています。このブログのコードもWindows環境で書いています。
趣味…料理、食べ歩き、ドライブ、楽器(エレキベース)も少しだけ

こんなところでしょうか。