InDesignがクッソクソに遅くなってたのがやっと直った話

弊社、まだメイン作業バージョンがInDesign2021だったりします。
膨大な在阪データ中の、Type1フォントがいろいろで。
MacPro2013はそろそろ厳しくなるかと思いきやまだまだ健闘中。
Montereyまでの命なので、あと2年たぶんこのまま。いまBig Surです。

で、先日ちょっと気になるスクリプトの話題があって、
StartupScriptにイベントハンドラ仕込んでごにょっごにょしてたんですが。
とつぜんInDesignの挙動が重たくなり。
具体的には別アプリからInDesignをアクティブにした時、5秒待たされるように。
アプリ間コピペ作業とかもう地獄。
ただでさえ局所的に忙しくなってて、ろくにメンテもできず。

ある日、とうとう頭きて、初期設定をまるっと退避して、キャッシュもごそっと削除。
環境設定はスクショをもとにポチポチ復元。
PDF書き出しプリセットがすっ飛んだこと、
プリフライトプロファイルが消えたことが誤算ではあったけど、
一度はなんとか元通り軽くなったんですわ。

でも、初期状態のままだと人間のパフォーマンスが落ちるので、
おそるおそる少しずつ以前の初期設定ファイルを戻して様子見してたわけ。
結局またすぐ重たくなって。

今日、また頭きて(短気ですこと)
また初期設定を初期化。
でも今回は微妙に軽くなくて。
で、思い立って、Scripts Panel内を一掃。
180項目ありまして…
最低限、35項目に減らしました。
これが正解。すっと軽くなりましたわ。

スクリプトの個数の問題ではない気がしてて、
ちょっと怪しいと思ったのが、idleTaskのテスト。
今回、これ以外を全部戻してみました。
結果、改善。よかったー。

いずれヒマになったら、おもち先生の名作 JSXTimerをCEP移植したいので
idleTaskは避けて通れないのだが。
これのおかげで、CS6時代は選択するだけでスクリプトが発火するという
非常にピーキーな作業環境で鬼神の如き作業速度を…奇人かもしれない。

いつヒマになるんだ…………

InDesign:アピアランスないけど装飾でがんばれ

InDesignは悲しいアプリ(硬派なアプリ)

InDesignにはIllustrator様のようにアピアランスなんて便利な物はないです。ありませーん。
でもInDesignの文字や段落はわりとハデに動きます。流れていきます。
なので、せめて文字の装飾は文字・段落の機能で済ませて抗います。
それで文字の移動にどこまでもついてきてほしい。
手に負えない場合は別途アンカー付きオブジェクトをストーリーに配置しますが、
ここはぜひなるべく全力で抗いたいところです。

やりようは多少だけどある

いくつかの武器(機能)がありますね。
いっぱい重ねて使いますね。
この序列・重なり順をたまに忘れてしまってて、試しながらやってしまうことが多いので、
今回はわかりやすくまとめようと思いました。
記事の最後には覚え唄もあるよっ!(うそですないです)

というわけで、図にしてみました。
赤文字は文字スタイル・段落スタイルで設定するやつです。

効果は用途が薄いので、この際いいかなーと思ったけど
過去にスミ文字の白フチを効果で付けていた文化もあったので、
まあついでだし、いちおう。

おまけ

効果ごとの上下関係も手間ない範囲で確認してみました。

具体的な用法を一切書かないあたりがすこし不親切な気もするけど、
それで皆さんのイマジネーションの幅を狭めるなんて酷なこと、
うちにはとてもできません!

そんな感じでまあ、がんばりましょう。

InDesign:文献の参考頁の桁数を合わせるやつ

どうもどうも。
前にTwitterに投げたちょっとのスクリプトを少しだけ整理しました。
こういう、2分で書けたのに将来的に数十分もお得で、
しかもMPが温存できる類のものはいいですねえ。捨てるに惜しい書き捨て系。
売り物にはならないやつ。

普段は「とりあえずは要件通り動いたからまあいっか」なんですが
今回「もうちょっとなんとかならないものなのかとも思う」
という、自分にしてはけっこう珍しい引っ掛かりを感じたので、
誰かが教えてくださるのをここで待ちます。アンコウの構え。

コード全体はこちら。今回ダウンロードありません。


あそびかた

論文なんかの、文末や巻末にある文献で、
その文献の参考にしたページ範囲の表記ってのがありまして。
pp.1234-1256」みたいな箇所ですね。
これがたまに方言なのか、変動していない桁を省略して
pp. 1234-56」なんて書き方があるようで、ここによく桁数を一致させる旨の赤字が入ります。
たいして面倒ではないんだけど、ものすごく自動化の香りがしますね。

まあ、当該テキストを選択して実行すると、

いい感じになるわけです。


解説のつもり

ではコードひもとき。

var sel = app.selection[0];

ここの説明は不要かもですが、選択オブジェクトをひとつ変数に入れています。
雑に書いたスクリプトなので、何も選択されていないとのっけからエラーで止まります。


var str = sel.contents;

選択されたのがテキストだと決め打ちした上で、その文字列を変数に入れています。
雑に書いたスクリプトなので、テキスト以外が選択されていると余裕でエラーが出ます。


var reg = str.match(/\d+|[^\d+]/g);
var numA = reg[0]; //前のスウジ
var hyph = reg[1]; //間のキゴウ
var numB = reg[2]; //後のスウジ

ここは最初に2分間で書いたものが雑すぎたので少し直しました。
「数字のひとかたまり、または 数字じゃないひとかたまり」をつかんで、
その結果を3種の変数に順に入れています。
ここも選択範囲内のテキストが要件に適っていなかったら余裕でエラーが出ます。
これでも雑だっていう話ですな…


var aryNumA = numA.split("").reverse();
var aryNumB = numB.split("").reverse();

変数 numA と numB を1文字ずつばらして配列化しています。
さらに後工程のために、配列の並びを逆にしています。
“ビートルズ” が “ずうとるび” になります(ならないです)。


for(var i = 0; i < aryNumB.length; i++){
aryNumA[i] = aryNumB[i];
}

今回の肝となる処理。
前の数字 aryNumA をベースにして、それよりも桁数が短い後の数字 aryNumB の数字を
桁ごとにもらっています。aryNumB にはない桁は元々の aryNumA の物が残る仕組み。


var res = numA + hyph + aryNumA.reverse().join("");
sel.contents = res;

仕上げ。前の数字と、間の記号 まではそのまま。
加工した配列 aryNumA を、配列の並びを逆にして結合。
で元の選択範囲の文字列に指定。
つまり、選択した文字列の先頭・末尾に余計な文字が入っている場合はこの瞬間に消えてなくなります。
どこまでも雑。


仕上げ部分のロジックを図にすると、こう。

aryNumAをベースに、aryNumBに存在する桁だけを入れ替える。 aryNumBに存在しない桁はaryNumAのものがそのまま残るという仕組み。


ということで

配列化するのが無駄だとか、
Bの存在する要素をAに、ではなくAだけに存在する要素をBに代入したほうがスマートだとか
そういうのはなんとなくわかるんだけど、もっとこう、
ビット演算的ななんか、なかったかなあ、と思ってやまない。
ので、誰かそっとおしえてください。
そこまで求道しないって人は現状でそのまま使ってもらって大丈夫です。動きます。
エラー回避の練習してみたい人にはちょうどいいかもしれません(すごい詭弁)。