InDesign:マンチカンという名前の数列加工置換スクリプト作りました

はしがき

InDesignの正規表現検索機能、けっこう満足しています。
戻り読みの字数が確定していないといけないところなど目を瞑るべき点もあるものの。
正規表現には使用者のスキルが関わりますが、
検索形式を併せて絞り込めば、ほぼ大体の用事はこなせてしまいますね。

でも、置換のほうはどうでしょう。
正規表現でヒットした多様な文字列に対して、形式の変換や文字列の追加を一意にこなすしかできません。

中でも数字を扱う際、数字を「数」として扱いたいのに、ドキュメント上に点在している数字はただの「字」です。足したり引いたりはできません。
それでも、足したり引いたりをまとめて処理したくなる作業がしばしば発生します。

そんな理由で、今まではその場だけなんとかするスクリプトを書き、
次回の要件には微妙に合わず、また新しくスクリプトを都度々々(つどどど)書いてきました。

ここで公開している物、社内で提供した物を含め、

id_aibansShifter.jsx(選択範囲内の数字すべて一律に増減する)
id_charCodeShifter.jsx(選択範囲内の数字すべて文字コードをずらす)
id_numberShifter.jsx(忘れたけど確か番号ずらすやつ)
id_番号ズラッシャー.jsx(これもなんとかしてなんか番号ずらすやつ)
図番をズバンと変更.jsx(図番号を検索して、プロンプトで連続的に手入力していくやつ)

だの、なんだの…案件数ぶんスクリプトが増えていってます。
正直、どれがどれだか、書いた本人もまったく把握できておりません。

だもんで、いつかはこれらの統括スクリプトを作ってやろう
…と、もやもや思っていたのが今回ようやく少しカタチになってきた感じです。

 


Munchkin.jsx

InDesignCS6で動作確認。
CS4以降で動作する可能性はふんだんにはらんでいます。
なお、CC2015以降は後述のリターンキーばしばし連続置換ができません。CEP開発を気長に待ちましょう。
*コードの改変は任意ですがフィードバックいただけるとうれしいです。
*サイトを経由しない二次配布は固くおことわりします。
*不具合報告はコメント欄とかに随時どうぞ。
*改変リクエストは料金お支払い気分でお願いします。

リリース情報
2018.04.19 ver.1.12 初リリース
2018.04.25 ver.1.13 リクエストによりパレットを「閉じる」ボタンを増設
2018.04.26 ver.1.14 数値の増減タブ内に「文字コードで増減」を増設
2018.04.27 ver.1.15 置換文字列固定チェックボックスを増設
2018.12.11 ver.1.16 検索文字列から数字以外を削除するチェックボックスを増設
2019.04.09 ver.1.17 文字コード増減の際、増減値欄で文字to文字の計算式に対応
2020.01.08 ver.1.18 「^」だけで検索するとハングするアプリケーション固有のバグをダサく回避
2021.03.08 ver.1.19 CC2015で機能しなかった「returnキーばしばし」をなんとか修正、増減、桁数調整なしでも置換文字列がヘンな計算済みになっていた不具合を修正
2021.06.02 ver.1.20 前述「returnキーばしばし」をなんとかするためにあれこれやっていた名残が悪さしていたのを修正。報告&検証くださった照山さんに感謝を。


読み方、ムンチキンでもなんでもいいですけど、いちおうマンチカンです。
「萬置換」のニュアンスです。
スケベな事を連想してもらっても別に全然ちっともかまいません。
それはあなたが勝手にスケベなだけですから。スケベなのはあなたなのです。やーいスケベ。
むしろかわいいネコチャンの方を想像したほうが健康的です。プッシーのほう。


あそびかた

マンチカンは、数字に特化して、置換文字列を個々に制御するスクリプトです。

数値の増減(これは半角数字限定)

文字種の変換

文字列の追加

手入力

一連の処理を取捨選択して組み合わせ、連続的に置換するという、とってもかわいいやつです。
かわいいかわいい。

検索については、InDesign標準の検索置換ウィンドウの「正規表現」タブ内で設定してください。
・検索文字列
・検索オプション
・検索形式
の3つの設定が生かされます。
逆にいうと、検索に関わる設定は、検索対象のドロップダウンリスト(ドキュメント、ストーリーetc.の所)以外すべてここで行ってください。

設定し終わったら検索置換ウィンドウは閉じてしまってかまいません。
注意点として、検索履歴から検索文字列を呼び出し、そのまま閉じてしまうと空欄になってしまうので、
履歴の呼び出し後はてきとうに文字を打ってすぐ削除する、などして、いじっておいてください。
*クエリの呼び出しについてはこの限りではなく、リストから選択してそのまま閉じても大丈夫です。

マンチカンをカチカチするとパレットが出ます(厳密にパネルと呼べないのです)。

まずは下部の検索対象ドロップダウンリストから、検索範囲を設定します。
標準機能のやつは、選択範囲の状況に応じて勝手にころころ変わるところが大嫌いなので、わざわざ用意しました。
こちらは勝手にころころ変わらない代わりに、設定した検索対象に選択範囲がそぐわない場合はウンともスンとも動かないので気をつけましょう。
念のための補足ですが、選択された複数のテキストフレームを対象にしたいときは選択範囲ではありません。ストーリーです。
テキストフレームを内包するグループオブジェクトを対象にしたい場合は、ダイレクト選択(白矢印)ツールを持ちます。選択し直さなくても、持ち替えるだけでOKです(ちなみに標準機能と同じ挙動です)。

次に検索ボタンをカチ。


検索結果があればパレット最下部にヒット数が出て、ドキュメント上では最初の検索結果のテキストが選択状態になります。
「1/12を表示中」と出ていたら、12個見つかったうちの1個目を表示中という意味です。
そして上部の「置換文字列」欄には、検索結果と同じ内容の文字列が出ます。まだ何も加工していないわけで。


つかいかた

加工パートを順に説明していきます。

数値の増減

検索結果が半角数字だけで構成されている場合に限り、その数を足したり引いたりすることができます。
このため、最低限の正規表現習熟が必要とされます。
入力欄には、半角の「+」「-」と数字しか入力できません。小数も未対応。のちのち改良するかも。
増減が不要な場合は空欄にしておきます。
計算の都合上、元の文字列の先頭にゼロがついていると計算後はそのゼロが失われた置換文字列を返しますが、
隣の「桁数引上げ」をうまく併用してがんばりましょう。

…という機能に、文字コードを増減のチェックボックスを増設しました(ver1.14)。
このチェックが入っている場合に限り、半角数字以外の文字でも増減対象となります。

20までの丸数字とか1ケタまでのローマ数字とか、若干ながら増減に対応できるかと思います。
何言ってるかわからないという方は、まあほっといてください。

上記文字コードを増減のチェックボックスがオンの場合に限り、
増減値入力欄には 文字 - 文字 という差分式を使用できるようにしました(ver1.17)。
要は、いくらぶん増減すれば目的通りに変換できるのか計算するのがめんどくさかったわけです…
例えば「アイウエオ」を「カキクケコ」に変換したければ文字コードの差分は +9ですが、
増減値入力欄に「カ-ア」と入れておくだけで済むようにしました。
置換文字 マイナス 元の文字 です。

文字種変換

左(変換元)-> 右(変換先)とあります。
右のリストは初期状態はグレーアウトしていて触れませんが、左リストを「しない」以外にすることで操作可能となります。
プリセットとして、半角数字、全角数字、全角ローマ数字(大文字)、全角ローマ数字(半角)、丸数字、カッコ付き数字、漢数字 がドロップダウンリストに格納されています。
これらは、検索結果が何桁であっても1文字ごとの変換となります。したがって、プリセットでの置換はほぼ1〜9限定の用途となります。
また、ゼロを持たない種類の文字種についてはゼロだけが未変換のままとなりますのでご注意ください。
このほか、左リスト内に「任意テーブル」という項目があります。このときも右リストは操作不能となります。


「任意テーブル」を選択すると、すぐ下の「テーブル定義ファイルを選択」ボタンが押せるようになります。
ボタンを押すとファイル選択ダイアログが出るので、置換テーブル定義ファイル(タブ区切りのプレーンテキスト)を選択します。
こんな感じで、「元の文字列 [tab文字] 置換文字列」 のように記述した物を用意して使います。

プリセットでの文字種変換は1文字ずつ行のに引き換え、任意置換テーブルを使用する場合は、検索結果とテーブル内の文字列は先頭から末尾までの完全一致を置換条件とします。文字が余ると置換対象にはなりません。
これは主に漢数字や2ケタ以上のマル数字への変換を目的に実装したものですが、なんかうまいこと応用して便利に、あの、どうぞどうぞ。

文字列追加

これたぶん説明いらないので省略。

置換ログについては後述。


ここまでの設定を済ませ検索ボタンを押すと、上部の置換文字列欄には検索結果に応じた加工済みの文字列が表示されます。

また、置換文字列欄には任意の文字列を直接入力する事も可能です。これも大事なのです。
*当記事の最後で実用例を紹介しております。

検索後に設定を変更したり置換文字列を自身で書き換えたあとは、「再取得」ボタンで置換文字列を更新することができます。
固定のチェックを入れておくことで、検索結果の文字列の内容に関係なく、ずっと同じ文字列で置換する事ができます(ver1.15より)。

これだと普通の検索置換と変わらないわけですが、ウチはリターンキーをタンタンするだけでそれを済ませたかったんです。

置換の実行

置換、次を検索、置換して検索、すべてを置換、の4つのボタンについては説明不要と思われますが、
1つ1つ確認しながら置換作業を進めるなり、一気にやっちゃうなり、お好みでどうぞどうぞ。
「すべてを置換」は1回の取り消しで実行前まで戻せるようになっています。
CC2015以降はドキュメントウィンドウを前面に出さないとキーボードショートカットでの取り消しができないのでご注意ください。(ver_1.19で修正済み)

一点だけ、InDesign標準の検索置換ウィンドウのボタン群との違いがありまして。
「置換」ボタンで置換した後、「次を検索」するまでは直前の置換結果が現状のターゲットとなります
置換→やべえしくじった→取り消し→加工設定を変更→再取得→置換(2回目)などの流れを想定しています。いちおう。

置換処理の履歴

置換作業については「置換ログ」タブ内に逐一記録されます。
「保存」ボタンで内容のテキストを保存します。保存先はデスクトップ限定となっています。
既にログファイルが存在する場合は、既存テキストの末尾に追記されます。
ぶっとばしてやらかした時の検証に役立ててください。


おてほん

と、お待たせしました。
ウチの業務で実際に役立ったケースをいくつか紹介します。
このためにわざわざレイアウトをでっち上げるのがとても大変だー。

事例1:図表の追加による番号ズレの修正

よくあるやつですね。

検索文字列は当該の数字だけ拾うようにします。

マンチカン上の設定は、「数値の増減」に「+1」と入力。

順送りに選択されていくので、マンチカン上でボタン操作します。
置換して検索」は、置換文字列上でリターンキーを押すことでも同様に動作します。
*現状、CC2015以降では一度のリターンキー操作後、置換文字列からフォーカスが外れます。いちおうtabキーで再びハイライトしますが…いずれ改善できれば。(ver.1.19で修正済み)


事例2:目次機能を使えないとき

ほんとにね、もくじ、さくいん…便利機能がInDesignにはあるのに、本文よりも先に出校しなきゃいけない時があったりしてて。
仕方なくダミーノンブルで出さないといけなかったりしてて。
こんな赤字が来ちゃうわけですよ。

まあカチカチ選択、タカタカ入力でも構わないんでしょけど。
ウチはカチカチが苦手なのです。「カッチカチ」になっちゃう。カッチカチやでー古い。

そこで、検索文字列を、こう。
今回に限り「00$」でも足りるといえばそうなんですが。

マンチカンのほうは何もいじらず、検索ボタン。
置換文字列上でリターンキーを叩くと置換して検索ボタンと同様の働きをするので、
ひたすら置換文字列を入力してリターンキーをタン、の繰り返し。
このサンプルデータ、15秒ほどで修正作業ぜんぶ終わりました。マジです。
まあ、ウチ個人が基本的に優秀なだけなんですけど

以上、とりあえずですが2例だしてみました。
いいでしょー。

 

16 thoughts on “InDesign:マンチカンという名前の数列加工置換スクリプト作りました

  1. CEPで(^-^)/

  2. これは素晴らしい!!! placeoptionaltextと共にメインスクリプトになりました

  3. アレ、ダウンロードができない…。

  4. ありがとうございます!

  5. […] えー本題。 春頃に公開したマンチカンというやつ。 いずれ、(日)(月)…にも対応しなきゃなあとは思っておりますがw 文中の数字を増減したり別種の数字にしたりと、さぞ世界中で […]

  6. はじまして。Indesign CS6の初心者です。

    いろいろ探していてこちらのサイトにたどり着きました。

    英文中に(1)(2)(3)…というように空所があります。この空所が増減するので連番を振りなおしたいのですが、正規表現を使ってするのはどうしたらいいのでしょうか?

    例えば、次の英文で(1)をもとのliteratureに戻した場合、(2)以降をすべて(1)から振りなおしたのです。

    Alice’s Adventures in Wonderland is a work of children’s (1) by the English mathematician and author, Reverend Charles Lutwidge Dodgson, written under the (2) Lewis Carroll. It tells the story of a girl named Alice who falls down a rabbit-hole into a (3) realm populated by talking playing cards and anthropomorphic creatures. The (4) is fraught with satirical (5) to Dodgson’s friends and to the lessons that British schoolchildren were expected to memorize.

    正規表現をネットで調べてみたいのですが、よくわかりませんでした。

    ご教授いただければ幸いです。

    • どうもどうも。
      連番振り直しの機能は実装していないのです。たまに欲しくなるのでそのうち実装したいなあとは思っているのですが。
      で、ですねご質問のケースでは、
      検索文字列を

      (?<=\()\d+(?=\)) とします。これで "(" と ")" で挟まれた半角数字をつかまえられます。 (厳密には [0-9]+ と書かないと0〜9以外の数字も拾ってしまうのですが、詳しくは詳しいところを調べてみてください) マンチカン上での操作は「数値の増減」のところに -1 で期待通りの結果が得られると思います。2が1になり、3が2になり…という感じです。 ですので、仮に、なくなるのが(1)ではなく(3)だった場合にこれをやると、(1), (2), (4),(5)... が(0), (1), (3), (4)...になってしまいます。 その場合、( ) の中が何十番とかまで続かず、せいぜい1ケタなのであれば (?<=\()[4-9](?=\)) で済んだりしますが、そうでない場合はちょっとかなり厄介。 正規表現を身につけるには、 ・詳しいサイトを見つける(ちょっとわかりかけたら何度でも訪問して理解を深める) ・どこかDTPerの集まる掲示板で、今回のようにいま必要な内容を訊いちゃう(そして2〜3日様子をみると数名からの最適解が勝手に出る) ・講習会に参加する(より実践的な例で教えてもらえる) あたりが有効かと思います。がんばってください。

      • 早速の回答ありがとうございます。

        途中の番号が変わった場合に連番振り直しをしようとすると、置換を部分的に分けて行う必要があるようですね。

        普段はwordのVBAで連番振り直しをしているのですが、その際は(1)(2)(3)…すべてをいったん(###)とかに置換して、それを順番に(1)(2)(3)…とまた置換するというやり方をしているのですが、同じことをIndesignのスクリプトで行うことは難しいでしょうか?

        今後はIndesignを使わないといけない機会が増えるので、徐々に勉強しようと思ってい入るのですが...

        今回を機に正規表現については勉強したいと思います。

        • >(1)(2)(3)…すべてをいったん(###)とかに置換して、それを順番に(1)(2)(3)…とまた置換するというやり方をしているのですが、同じことをIndesignのスクリプトで行うことは難しいでしょうか?

          (###)までは標準機能でいけますね。それを捕まえ直して連番…はInDesignではスクリプトの領分となりますが、決して難しくはありません。が、自身であまり需要がなかったため未実装です。いずれ盛り込んでみようかとは薄々思っておりました。

          仮に(3)が抜けた場合、(1)と(2)を除いた他すべての番号だけ捕まえる正規表現が書ければ一発で行けるよ、という趣旨で一度返答したものの、ちょっと休日スマホ上で試しにくかったので式があやふやでしたが、いま改めて検討しても一発でとなると、仮に(15)まであるとしたら

          \(1\)|\(2\)|\(4\)|\(5\)|\(6\)|\(7\)|\(8\)|\(9\)|\(10\)|\(11\)|\(12\)|\(13\)|\(14\)|\(15\)

          みたいなひどい感じになってしまいますね…
          あとは、元から(1)(2)を選択せずに(4)以降だけ選択の上、実行すればこの問題からは脱却できますが 
          まあ連番機能については気長にお待ちください。

        • (このあと返信コメント投稿いただきましたが、お名前が出ちゃっていたので一旦承認保留させていただきました)

          あえて線引きさせていただきますが、フリーで公開している物については、どこまでもウチの気分やコンディション次第です。誰かのリクエストに応えるといった事も、内容次第気分次第です。ご了承ください。

  7. すみません。

    名前が出ているコメントについては削除していただけますか?

    お手数をおかけしますが、よろしくお願いします。

    連番のスクリプトについては、いつかできたらということでかまいません。

    とりあえずは今の作業はwordのvbaでしていくつもりです。

starwars へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。

*