InDesign:コピペの罠ァ 5 もっかいテキスト

前回はこちら
その前の コピペの罠ァ 3 でテキスト絡みについてやったんですが、ひとつ書き漏らしがあって。
それなりの量になってしまったので追記ではなくこちらで。


今回の素材。ここからマゼンタのテキストを削除してテスト素材とします。

こんなかんじでストーリーの最後の段落で改段落しちゃってるの、自分では好きでないので基本的に削除しちゃってるんですが、ヨソから来たデータだとしょっちゅう見かけます。

このスミ文字を「書式なしでペースト」で上書きしようと思います。
ついでに無駄な改段落文字も消しちゃおう、という意思でテキストを選択すると、こうですね。

では「書式なしでペースト」はい、どん。
うおお、お前(属性)どっから来た!


考察の前に、他のパターンでテストをやりきっちゃいましょう。
次は、改段落文字を残して選択した場合。

はい、どん。
おっ、いいかんじ、というかふつうだ。このあとどうしても気になるなら改段落文字はあらためて削除。


最後のテスト。元のテキストの先頭を1文字残して選択。
これ、自分含めQuark時代にやってる人けっこういたような。

どん。まあふつう。このあと、残しておいた1文字目を忘れずに削除しないといけない。
なんだかとっても危なっかしい。実際たまにやらかすのでもうやってません。


では実際なにが起こっているのか

テキストを選択して上書きペーストした場合、
「置換」ではなく「選択テキストを削除してからペースト」が行われている
という認識でおそらく説明がつきます。

置換とどう違うの

ためしに最初の選択範囲と同じテキストが対象になるように検索置換を実行すると、当初の期待どおりの結果となるです。
スクショの検索文字列を参考に、手元でもやってみてね。

削除してからの場合、改段落文字が削除されると、その前後の段落は所属スタイルのマージが行われます。くっつきます。
見た目の属性は残っていてもマージ先の段落スタイルからオーバーライドした状態となるわけです。

これを軸に考えた場合、もろもろ合点がいくことになります。

*段落をまるごと選択した場合、段落そのものがなくなり、後続段落が繰り上げでペースト対象となる
*改段落文字を残して選択した場合、削除とペーストはその段落内で完結するので後続段落の影響を受けない
*先頭の文字を残して選択した場合、後続段落は削除対象となり,選択した段落だけが生き残りペースト対象となる

要は、選択テキストを削除したあと、各種パネルが指す属性がペースト後の属性となるかんじです。

ほんとはちがうんですが、いったんここまでで納得してください
そのほうが絶対に覚えやすいので。


ほんとはそうじゃないみたい

こっからが沼です。罠です。
「空の後続段落」、実はそんなもん存在しません(なんだってーMMR)。
検索置換ウィンドウで段落スタイルを検索するとナイナイって言われます。
検索置換に関しては原則として「文字」が対象なので仕方ないとはいえ。
正規表現で「^」だけとか「$」だけとかが効くのもテキストが1文字でもある場合だけなので。

スクリプトで段落の数を参照すると「1」が返る。これでもう決定的。
マゼンタ文字の段落は存在していない。

では、いまパネル群に現れている属性はどこで参照できるのだろう、という疑問。
テキストフレーム内に挿入点が立った状態、見た目に文字は選択されていませんが、
実体は「挿入点(InsertionPoint)が選択された」状態だったりします。

ところでこの挿入点の所属する段落は前の段落のおけつだったりする?
しない。というか段落に含まれていないことになっている。

え、じゃこの子の親は誰なの。
ストーリー直下のオブジェクトになっている。

そのストーリーの、末尾挿入点の塗りカラーを参照。
でたー。

んじゃんじゃ、親ストーリーの段落数は?
え、1こしかない。もうわからん!

このあたり、広義ではバグなのかもしれません。わかりません。
違ったら恥ずかしいので大声では言いません…

とりあえず挙動とその覚え方は参考になったら幸いです。
まとめませんが、
*ペースト前にいったんただ削除してみる
*削除後にパネル群で表示されている属性がペースト後のお前だ
と覚えておきましょう。

ではでは

InDesign:UXPに着手しています(うちの無課金チャピーが)

どもども。タイトルの通りです。
17年ぐらい連れ添ってきたExtendScriptが終わる終わる言われて3、4年。
自分が満足に使えるスクリプト言語ってこれしかないんですが。
とにかく規格が古い。らしい。と知ったのは、CEPでJavaScriptをさわり始めてから。
けっこう前だけと実感が出てきたのはここ数年。CEP 11ならv88およびNode.js v15.9.0に対応しとるそうです。
正直なんのこっちゃですが、ExtendScriptが準拠しているECMA3が相当古いのはわかりました。
便利を知ると、それまでの当たり前を不便に感じてしまう。

よし、これからはCEPだな、モダンなJavaScriptのお勉強にもなるし。
…と思った矢先、UXPの到来です。CEPもう部活やめるってよ。それももう4、5年前。
でもUXP、まだまだふわふわしていて、覚えた端から仕様が変わる、とは先人たちの声。
そんじゃあ固まってきてから覚えるとしよう。前にもこんなのあったな。ActionScriptか。

でも、さすがにそろそろなんじゃない? とそわそわし始めはしてて。

やろうとはずっと思っていた

何度か、最初のステップを踏み外しては逃げ帰って、を繰り返してました。
まず、先人の例文が何を書いているかさっぱり頭に入らない。目がすべる。すべっすべ。
なんとなくJavaScriptじゃねこれ、ぐらいはわかるんだけど、手続きの意味がわからない。
みたいなー。

だもんで、ちょっと方針を変えました。
チャピーに書かせてみて、修正の変遷を見ながら概念と傾向を掴んでいこう、と。雰囲気慣れ作戦。
ちなみに同じ目論見でSwiftアプリを作ってもらったことがあったんですが学習は一歩も進みませんでした…

いや、でもCEPという下地があってのことか、ちょっとずつ見えてきた。UXPが。
これまで一歩も踏み出せなかった原因も明確になったでした。
というわけで。

UXPがとっつきにくかった理由

なんか新しい言語を学習してやろう、となると、通例だいたい “Hello World!” の出力ってことになると思うんです。
UXPの場合、プラグインのUI(パネル)内にテキストを表示したり、コンソールに出力したり、になるのかな。

でもExtendScript出身者は、ExtendScriptでいちばん手軽だった alert(“Hello World!”) をやりたいじゃんすか。だって、そうだろう。
しかしそれがむずい。というか、それだけがむずい。できなくはない。しかしめんどう。しかも違和感。
ここだけ乗り切れば、もしくは無視すれば、ほぼあとはほぼCEPの差分でほぼいけますほぼ。個人の感想です。

以下、うちが目を背けた点を、ばらして雑に紹介していきます。
あ、InDesignでやってます。

冒頭にある未知の宣言

const { app } = require("indesign");

これについては残念ながら絶対に身に付けないと進めないやつでした。
モジュールを同期的に読み込んでいる、らしんですが、ExtendScriptしか知らない浦島だとここで足が止まります。
CEPでいくらかモダンなJavScriptにも慣れてきてたつもりでいたのに。

{ } の中は最低限でappが入りますが、Enumerationオブジェクトを扱う用事があるたんび順次列挙する必要があり、どんどこ増えていきます。
よくわからない人は、大文字で始まる定数っていう認識でたぶん最低限大丈夫です。SaveOptions とか AnchorPoint とかのあれです。

alert() が、ほんとにむずい

厳密には、alert(), confirm(), prompt() と3つ。
河野さん、お〜まちさんの記事などをたぐって、manifestに追記などして、それでも動かなくて、チャピーに泣きついて、どうにか出すことができたものの、欲しかったのはコレじゃないすぎる。にしても大味だなあ。

いろいろとぐぐった感じ、自作のダイアログボックスを出す、が王道のようです。
しかし結果として、今のところはピンポイントにdoScript()でExtendScriptを使う、が自分的には一番しっくりくる感じでした。

これだよこれ

UXPがExtendScriptの完全上位互換とは思わないほうがいい、と聞いてはいたけど、かなりだな。
アプリ間通信もまだ用意されていない。

他はだいたいいける

変数の宣言にvarは使わない(ほうがいい)。const と let を使う。
アロー関数など、見たことない記法は、とにかく JavaScript でぐぐる。
async, await などの同期処理も。
見たことない関数も、まずは JavaScript でぐぐる。
それでだいたいいけるのが判明。関数も引数も ExtendScript と共通しているものが多いのです。

そんなかんじで、将来ほんとにUXPしか選択肢がなくなったとしてもゼロから覚えないといかん感じからはどうにか抜け出せました。こわさが減った。スキルの幅が狭いと新しいもの覚えるのに苦労するわけで。
作品のほうはUIの匙加減が整いしだいリリースしたい感じです。

とりあえず全般、河野さんのブログにすがって情報を得ています。
また、お〜まちさんの記事が初心者視点に配慮してくれてて(俺だよ俺)、何よりInDesignをベースに進めておられててたいへん参考になりました。
うちは、ゴッコ気質のままてきとうにがんばります…

InDesign:コピペの罠ァ 4

前回に続き、今後は画像で少し。

InDesignは画像を配置するとき、必ずグラフィックフレームが必要となります。
例外はありません。

既存の画像をコピーした場合、グラフィックフレームをコピーした場合はそのままの内容でペーストされるけど、
中身の画像だけをコピーした場合はペースト時に自動で新規グラフィックフレームが作成されます。
ここはうまいこと使い分けましょう。

選択範囲内へペースト

要はグラフィックフレーム内に画像をペーストする機能なんですが、
コピー元の画像領域とかぶる場合はドキュメント上の座標を保持する特性があります。
そうでないときはセンタリングされます。これも上手に使い分けたい。

グラフィックフレームごとコピーした場合は入れ子のペーストとなります。

この結果の座標だけ欲しい場合は、あらためて画像だけをコピーして親の親に「選択範囲内へペースト」
するとよいです。集版の画像差し替え作業なんかではだいぶこの知識が重宝したです。

元の位置にペースト

元と同じ座標にペーストされます。
別のドキュメントやスプレッド上でも座標はキープされます。
Illustratorの「前面にペースト」と似ています。重なり順に関してちょっとだけ違う。

ちなみに、環境設定>単位と増減値 で定規の開始位置を「ページ」にしても無駄で、
必ずスプレッド上の絶対座標が基準となります。融通きかない。

全4回、以上でだいたい網羅したんじゃないかなって思います。
ではでは。