主にInDesignによる新聞組版Tips中心です。Mac使いですが業務はWin多め。Win DTP Tipsを増やしたい

【InDesign】フォルダー内inddを一括でversion up(もしくはダウングレード)

14ヶ月放ったらかしですね。そうですね いやメンテナンスはしていたんだよ

まあ今さら小ネタ晒しも・・・ と思ってたんですが、やる事ないならやるべきですね(意味不明)

条件テキスト一括指定辺りとやってる事は変わり映えありませんが、沈黙破りとして。


たまに「テンプレート100枚を全部ダウングレードして」やら、アップグレードやらの依頼がきます。昔はBookに収めてそのBookを上位バージョンで開けば、登録inddが全てBookを開いたバージョンに自動アップデートされちゃうという荒業が存在した記憶があるのですが、これは非常に迷惑 最近のBookは事前に警告メッセージを出した挙げ句、同期をかけた瞬間登録*.inddを全て上位に手動変換アクションが始まります。

f:id:chocomarine:20220308132031j:plain
上位バージョンで下位Bookを開いたところ

100枚分、ヤメテ止めて。付き合ってられんわ。ということで自動化です。

フォルダー内*.inddを一括でidml化(ダウングレード下準備)

//DESCRIPTION:フォルダー内inddを一括IDML書き出し(サブフォルダー含)(らーで閣下)
//2019.1.30

(function()
{
    alert("フォント検索、画像のリンク切れor更新もれがあった際は処理を終了します") ;

 try {
        var folderObj = Folder.selectDialog ("処理するInDesignファイルのあるフォルダを選択");
        if (! folderObj)
        {
            exit(); //キャンセル押されたら
            } else
        {
        app.colorSettings.mismatchAskWhenOpening = false; //ファイルを開いた時、カラー設定の不一致ダイアログを表示しない
        var count = 0;
            makeList (folderObj);
            //--------------------------- inddファイルを求める関数
            function makeList (folderObj)
            {
                var fileList = folderObj.getFiles("*.indd"); //ファイルとフォルダを取得
                for (i=0; i<fileList.length; i++)
                {
                    fileObj = new File(fileList[i].fsName);
                    app.open(File(fileObj)); 

                    var saveObj = folderObj + "/" ; //末尾に区切りのスラッシュを追加
                    var myDoc = app.activeDocument; //今開いている分
                    var myDocName = myDoc.name ; //ドキュメント名を取得
                    var fsArray = myDocName.split(".") ;
                    var inddName = fsArray[0] ; //ドキュメント名取得できた
                    var saveIDMLName2 = new File(saveObj+ inddName + ".idml") ; //保存フルパス
                    myDoc.exportFile(ExportFormat.INDESIGN_MARKUP, saveIDMLName2, false);
                    //最後のブーリアン= 保存オプションを出すか否か
                    }
                //サブフォルダへもぐっていく
                for (var j=0; j<fileList.length; j++)
                {
                    try { //不可視fileとか、変なもの居る可能性もあるので
                        var filename =
                        decodeURI (fileList[j].fsName);
                        } catch(e) {
                            var filename = fileList[j].fsName;
                            }
                        count = count + 1;
                } //try前のforの閉じ

            fileList = folderObj.getFiles();
            for (var k=0; k<fileList.length; k++)
            {
                //フォルダかどうか調べる
                if (fileList[k].getFiles)
                {
                    makeList (fileList[k]);//フォルダなら再帰呼び出し
                    }
                }

            } //MakeListのfunction閉じ
        } //最初のelseの閉じ

    } //最初のtryの閉じ
catch(e) {
    alert(e+"\n処理を中止します") ;
    if (myDoc == 0)
    myDoc.close(SaveOptions.no) ;
    } //e処理(最初のtry)の閉じ

alert ("end"); //終了時のメッセージ
app.quit(SaveOptions.no);

})();

フォルダー内*.idmlを一括でindd化(最新・旧バージョンへ)

//DESCRIPTION:IDMLを探しinddに一括保存(サブフォルダ含)(らーで閣下)
//2019.1.30

(function()
{
    alert("フォント検索は基本放置を(OKで進んで下さい)") ;

    try { //idml以外はスルー
        var folderObj = Folder.selectDialog ("処理する「IDML」ファイルのあるフォルダを選択");
        if (! folderObj)
        {
            exit(); //キャンセル押されたら
            } else
        {
            app.colorSettings.mismatchAskWhenOpening = false;
            var count = 0; //41Lで使う
            makeList (folderObj);

            //--------------------------- inddファイルを求める関数
            function makeList (folderObj)
            {
                var myFileList = folderObj.getFiles("*.idml"); //ファイルとフォルダを取得
                for (i=0; i<myFileList.length; i++)
                {
                    fileObj = new File(myFileList[i].fsName);
                    app.open(File(fileObj)); 

                    var myDoc = app.activeDocument; //今開いている分
                    var myDocName = myDoc.name ; //ドキュメント名取得
                    var fsArray = myDocName.split(".") ; //ドットで分割(拡張子をカット)
                    var inddName = fsArray[0] ; //splitの先頭だけ取得
                    var saveINDDName = new File(folderObj + "/" + inddName + ".indd") ; //保存フルパス(上書きモード)
                    myDoc.save(saveINDDName);
                    }
                //サブフォルダへもぐっていく
                for (var j=0; j<myFileList.length; j++)
                {
                    try { //不可視fileとか、変なもの居る可能性もあるので
                        var myFileName =
                        decodeURI (myFileList[j].fsName);
                        } catch(e) {
                            var myFileName = myFileList[j].fsName;
                            }
                        count = count + 1;
                } //try前のforの閉じ

            myFileList = folderObj.getFiles();
            for (var k=0; k<myFileList.length; k++)
            {
                //フォルダかどうか調べる
                if (myFileList[k].getFiles)
                {
                    makeList (myFileList[k]);//フォルダなら再帰呼び出し
                    }
                }

            } //MakeListのfunction閉じ
        } //最初のelseの閉じ

    } //最初のtryの閉じ
    catch(e) {
        alert(e+"\n処理を中止します") ;
        if (myDoc == 0)
        myDoc.close(SaveOptions.no) ;
        } //e処理(最初のtry)の閉じ

alert ("end"); //終了時のメッセージ
app.quit(SaveOptions.no);

})();

何やら懇切丁寧なComments付き…

参考にしたのは、条件テキストのページにあります「再帰処理」の方々です。フォルダーを潜りながら拡張子*.inddを探して開き、idml書き出ししているだけ。最後にアプリケーションも終了しています。

途中の

app.colorSettings.mismatchAskWhenOpening = false; //ファイルを開いた時、カラー設定の不一致ダイアログを表示しない

は、賛否両論あるかと思いますが、ノータッチ一括を重視して。本当は設定を取得→false→最後に戻す が必要ですが、プロファイルから取得か個別に取得変更か…など考え出すと面倒なので、取り敢えず無理やり変更・戻さない形で← いつもの

どうせスタイルの並びや一部設定名称が欧文化するなど、開いてチェックする必要はあるかと思うので(本末転倒と言わないで)、そのついでにカラー設定をドキュメントに付け直す前提に。


****

一番最初のBook警告メッセージ、

これ、最後までよく読んだら、自動変換設定が付けられるんやないすか(呆)

・・・・まあ、わざわざブックに入れて設定全てOFFって、するより速い。はず(

【InDesign】右クリック→(リンク)編集ツール のカスタマイズ

Windows DTP屋の皆様、お元気ですか。

Adobeアプリには、右クリック→(元データを編集)編集ツール→ からアプリを指定し直接開ける機能があります。

Mac版は、システムで見つかる関連アプリをメーカーに依らず全Version表示しますが(これはこれで鬱陶しい)、Win版はOS側の関連付けの性質が悪く、直近のAdobeインストールVersionを1~2しか表示しません。

(cc2019~cc2021までインストール済み・cc2020で作業中)

毎回「その他...」からドライブ(C:)を一から掘り起こさねばならない。 近いディレクトリをDirect Foldersに登録して使っていましたが、それでも2 touchくらいロスが出る。*.exeそのものの登録実行はできなかった

しかし、ボヤいたら神が降臨して下さいました。あるふぁ(仮)さん。本当に神です、いつも本当にありがとうございますーー!


用意するもの

検証環境:Windows 10(2004、20H2)InDesign CC2020(15.0~15.1.2辺り)Illustrator CC2020(24.2.3)

追記:20H2?のアップデート以降、既に起動中の関連アプリがアクティブウィンドウになりません。(2021.3.10)

記述
  1. ExtendScript Toolkit CCをインストール後、起動。新規ドキュメント(ソース)に以下をコピペ

    ※下記セッション名(targetengine)は、他と被らない名で任意
    ※異versionを同時に立ち上げた時も重複してしまうので注意

      //DESCRIPTION:オブジェクトを右クリック「編集ツール」にadobeアプリを追加する(Startup Scripts)
      /*
          最初のとこのアプリ名のリストは、左側がメニュー名(なんでもいい)、右側がBridgeTalkでアプリを特定する文字列。
          調べるには対象にしたいアプリでalert(BridgeTalk.appSpecifier)というスクリプトを実行する
          */
    
      #targetengine "sessionAppMenu"
      apuriNames=[
      ["Illustrator CC 2019","〓"],
      ["InDesign CC 2019","〓"],
      ];
    
      for(var i=0;i<apuriNames.length;i++)
      {
          var m = app.scriptMenuActions.add (apuriNames[i][00]);
          m.addEventListener("onInvoke", (function (t)
          {
              return function()
              {
                  var gs = [], ls = [], s = app.selection;
                  for(var i=0; i<s.length; i++)
                  {
                      if (s[i].hasOwnProperty("itemLink")) gs.push(s[i]);
                      else gs.push.apply(gs,s[i].allGraphics);
                      }
                  for(var i=0; i<gs.length; i++)
                  {
                      if(gs[i].itemLink.status == LinkStatus.NORMAL) ls.push(File(gs[i].itemLink.filePath) + "");
                      }
                  var bt = new BridgeTalk;
                  bt.target = t;
                  bt.body = "var p='"+ls.join(",")+"'.split(',');for(var i=0;i<p.length;i++)app.open(File(p[i]))";
                  bt.send();
                  }
              })
          (apuriNames[i][1]) );
    
          app.menus.item("レイアウトのコンテキストメニュー").submenus.item("編集ツール").menuItems.add(m);
          }
    

  2. Windowsの隠しファイルを表示=ON

    タスクバー「ここに入力して検索」→ 隠しファイル(入力)→隠しファイルを表示する
  3. PC→ Windows(C:)→ ユーザー→ (ユーザー名)→ AppData→ Roaming→ Adobe→ InDesign→ Version xxxx-J→ ja_JP→ Scripts→

    Startup Scripts 名のフォルダを作り、ここへ保存


対象アプリの文字列を調べる
  1. 対象アプリケーションとAdobe ExtendScript Toolkit CC(以下ESTK)を起動
  2. ESTKで対象アプリケーションを指定
    (ドキュメントの左上→ プルダウンリスト)
  3. 新規ドキュメント(ソース)に下記をコピペ、(メニュー)デバッグ→実行

     $.writeln(BridgeTalk.appSpecifier)
    

    デバッグ→ 実行)

  4. (メニュー)ウインドウ→ JavaScriptコンソール展開

  5. アプリバージョン箇所をコピー、最初の記述内 〓 に差し替え、上書き保存
    例:["InDesign CC 2020","indesign-15.064"],

    文字列が分かれば、もうこのソース.jsxは不要です。


ESTKを入れられなかった人は、メモ帳などで
$.writeln を
alert に差し替えてScript Panelフォルダへ保存。拡張子を(.jsx)にリネームしInDesignスクリプトパネルから実行、アラートで出た名称を記述内に記入して下さい。雑説明


InDesignを再起動して、運用してみましょう

(いぇあー)

編集ツール→ その他メニューに、任意のAdobeアプリケーションが追加されましたー

※リンクパネルの同機能に反映・応用はできません


基本機能と違い、編集後リンクバッジのクリックが必要になりますが、なに、そのくらいの手間は甘んじましょう。

これでまたひとつ、InDesignをアナタ色に染める事ができました!

※そう、このコメントを送ったのは私でした

Windowsから見えるMacの不可視ファイルを一括削除

※〜MacOS 10.6〜10.14且つHFS+(Mac OS拡張ジャーナリング1 限定。10.15及びAPFSは手元に環境がない為、カスを吐くのか現時点では検証できません(2020.10)

※当方紙媒体DTP戦士なため、基本的に最新OSの運用は致しません。ご了承下さい。

Automator内の説明・記述を再度修正しました orz(2020.11.3)
サポートのHARMAN移管に伴い、Adobe AIR配布Link先を修正しました(2021.3.9)


NASもしくはUSBメモリーなどで、Windowsと直接生データの遣り取りをしている方。

Macからは見えない、先頭が「._」で始まる謎のデータが発生

WindowsLinux側からはこういったデータが見えていて、知らずに相手方(もしくはサーバ管理者)に迷惑をかけているかもしれません。事前にMac側から消しておいてあげましょう。まあ目障りなだけで、然程実害ないんですが。 ただプログラムがコレも数としてカウントしてしまうので、困る事はあります

MacからのNAS(smb)接続でデータコピーや移動に失敗したり、互換USBメモリFAT32exFATボリューム)のイジェクトに失敗するのは、この見えないカスが影響している可能性もあります。試してみて下さい。

これらは俗にAppleDouble 2(のカケラ)、リソースフォークなどと呼ばれます。面倒なので説明はWiki先生に任せて← まず結論から、削除方法。


NAS or 互換USBメモリーに上げた後のフォルダに対して処理して下さい。 それ以前、リソースフォーク生成前には意味ありません。発生条件は下に記載します

MacOS(~10.14)側から削除

Automatorに登録

  1. Automatorを起動、新規「サービス」選択

  2. 検索「シェル」→ 「シェルスクリプトを実行」をつかみ、右へドラッグ

  3. 次の選択項目を受け取る:フォルダ
    検索対象:Finder
    シェル:/bin/bash
    入力の引き渡し方法:引数として

  4. 記述「do ~ done」の間に、下記コマンドを入力

     find "$f" \( -name '.DS_Store' -or -name '._*' -or -name '.Bridge*' -or -name 'Thumbs.db' \) -delete -print
    

  5. 検索窓に「リスト」→ 出てきた「リストから選択」を右下へドラッグ→ メッセージに文言を入力(削除されたファイル)
    リストから選択→ シェルスクリプトの下へドラッグ

  6. 名前をつけて保存。

    ここに保存される(ユーザ→ [ユーザー名]→ ライブラリ→ Services

    これで登録完了。


削除の実行

  1. 対象フォルダを右クリック→ サービス

    先ほど作った設定を選択

  2. find( )の条件(名称指定)で見つかった削除リストが表示される

    ※このウインドウが出る前にもうdelete済みなので、ここで実行・拒否を選びたい場合は構造と記述を少し変えないといけません(面倒臭い)← 

  3. →OKで閉じる。


ターミナルからの直接実行も可能ですが、パス指定の楽な乙女ちゃんの方が断然お勧め。

シェルスクリプト部分は、ここまで冗長でない

dot_clean --keep=dotbar "$f"

※通常ターミナルでは最後を対象フルパス or .(ピリオド=今いる場所) と書きますが、Automatorでは最初に for f in "$@"と変数宣言する様です

とするやり方もありますが、どうもデータフォーク側にも影響があるようで、新規保存し直すまで一部アプリでサムネイルが見えなくなります。やめておいた方が無難。

ドキュメントアイコンが半透明に

Bridgeウインドウ内で見えない

カスどもが確実に消えたかどうかMac OS GUI上から視認する事はできないので、ターミナルから

find [フォルダをターミナルウィンドウにドロップ] \( -name '.*' -or -name 'Thumbs.db' \) -print

→enter で確認してみましょう。 ※スクエアブラケット[]はトル

※フルパスの中にスペースがある場合、フォルダードロップではなく、
対象を右クリック→ パスをコピー→ 記述「find(半角スペース)」の後にカーソルを立て、(ターミナルメニュー)編集→「テキストをエスケープしてペースト」
で指定して下さい。

・・・USBメモリーの

.fseventsd .Spotlight-V100 .Trashes

を消していないのは分かると思いますが、これらは互換ドライブがマウントしただけでMacOSが生成する性質なためMac側から消す意味がなく、Windows上で手動削除するしかありません ←

この3つは削除してなんの問題もありませんが、Macからマウントするたびに復活します。


デキる人であれば、cronKeyboard Maestro[^3] などで自動削除スケジュールが作れると思いますが、後述の様にclientでの大量処理は負荷がキツい以上、狭い範囲の固定ディレクトリに対してのスケジュールでは、あまり意味ないのではないかと。そういう処理はサーバ側に組ませる方がいいと思います。

[^3]: Mac用キーボードユーティリティ。有償 Keyboard Maestro


ネット上でこの削除方法を探すと、'.AppleDouble' 指定のみのものをよく見ますが、複数の環境で試していずれも失敗しました。 ※10.10、10.14で検証

例え属性指定できたとしても、消さない方がいい種類のある可能性もあるので、愚直に名称でひとつひとつ指定した方がいいのではないかなと、私は思ってます。

因みにNASの場合、AFP(Apple Filing Protocol)[^4] 接続する事でAppleDoubleリソースフォーク生成(分離)は回避できます。afp対応しないnetatalk 3.x[^5] 以外のNASでは不可。NAS以外の事情は知りません

将来的にAppleが悔い改めデータフォーマットを見直す時が来れば、これらは解消するのかもしれません。 apfsはどうなってますのやろ

[^4]: AFP Wikipedia

[^5]: netatalk Wikipedia


「ネットワークボリューム・USBメモリーに最初から.DS_Storeを作らない方法(コマンド)」は広く紹介されていますが(※Macボリューム上は不可能)、AppleDouble(リソースフォーク)及び「. fseventsd .Spotlight-V100 .Trashes」を作らない方法というのは、理論上不可能。ですよね


Windowsから削除

コマンドプロントから「.AppleDouble」で削除するエントリーを見かけましたが、私が検証した限りではPowerShellコマンドプロンプトは、例え名称決め打ち指定であっても、CUI上でApple独自のリソースフォークを認識できない様です。何かしらやりようはあるんでしょうか。

GUI側ではしっかり選択・deleteできるクセに、、

Mac OSと同様に他言語からの削除はできますが、まだアプリ化する能力が私にはない為、今回は断念。  ESTKだとドキュメント・フォルダ両方削除できる再帰処理がちっと面倒だった← のもあるし、わざわざESTK起動してパスを選択しにいって、、あまり効率的ではありませんよね

なので、Windowsではカス削除くんを利用するのが一番手っ取り早いです。

カス削除くんのインストール・実行

カス削除くん

Adobe AIR(Runtime)必須。

※カス削除くん公式内のAdobe AIRはリンク切れになっています。
Adobe AIRは、2021.1よりサポート及び開発をHARMANに移管しました。2021.3.8現在

フォルダをドロップ→ カスファイルを削除する

カス削除くんMacでは、AppleDoubleカスを消す事はできませんMacからは、先に説明したAutomatorかターミナルコマンドを。

更に、ご覧になって分かるように.fseventsd .Spotlight-V100 .Trashesには対応していません←←

この3つは手動で削除して下さい、、


不可視ファイル類が発生する条件:


注意事項(共通)

  • ボリューム丸ごと突っ込まない 数が多いと処理しきれません

  • ボリューム直下・ユーザーディレクトリ直下を丸ごと突っ込まない 必須不可視データまで消してしまう危険が(あるかもしれない)


不可視ファイルの種類(削除可)

  • .DS_Store
    Winのdesktop.iniと同等。手動配置の位置、ウインドウサイズ、アイコンサイズ等、フォルダオプション情報を記録。Macデスクトップ上以外は消してOK

  • ._.DS_Store
    .DS_Store自体をMacOS側から他へコピーした事で、そのリソースフォークとして作られたもの(多分)

  • .fseventsd
    MacOSのFile System Event log。ファイルが作成、変更、または削除されるたびに通知され、実行中のMacプログラムが情報を知るために参照する

  • .Spotlight-V100
    スポットライトインデックス(database)
    MacOSが検索するためのインデックスを作成する …そういえば、これを今後作成しないターミナルコマンドが確かありましたよね

  • .Trashes
    MacOS固有の「仮ゴミ箱」システム。

  • Thumbs.db
    Windows上のアイコンプレビューを高速化するためのキャッシュ。

捨てない方がいい不可視ファイル

  • .localized
    (カラム・アイコン表示以外で)フォルダ・データ名の日本語表示に必要

  • デスクトップ上の.DS_Store
    アイコン表示での配置・アイコン等の情報が初期化されます

  • Windowsデスクトップ上のdesktop.ini
    Winのデスクトップ情報。表示オプション→ 表示→ 保護されたオペレーティングシステムファイルを表示しない→ OFF で見える(非推奨)


最後に

何か間違えてたら、ご指摘お願いします←

ちゃんとエディタでチェックしてないので、脚注3以降の表示がおかしい・・(泣

11.30 追記

次期MacOSではAFPを切り捨て、SMB接続に絞る様ですね。

カス問題も、そちらに合う様にデータ構造が改良されるのでしょう。まだまだ読めませんが。


  1. ディスクユーティリティでフォーマットできるファイル・システム・フォーマット Appleサポート

  2. AppleSingleとAppleDouble Wikipedia

【Windows】【xdoc2txt】Wordファイルをテキスト保存 ※Word不要

2020.9.25 追記あり

会社の使用PCが本格的にMac→Winになってきたので、テキスト処理の方もぼちぼち Jedit秀丸への移行を進めています。


xdoc2txt

ワンクリックでWord→txt。テキストボックスも含めてくれます(順不同、注意あり)※Win専用
EB series support page
ダウンロード→ xdoc2txt→ x64版

f:id:chocomarine:20200923170917j:plain

これ、知人の小川さんがDTP東京勉強会で紹介した気もします(忘れた)。PDFやExcel一太郎も対応ですが試していません。

こんなもの作る方はまあコマンドオタクなので、READMEを読んでも使い方はワケが分からない。というわけで。


インストール&セッティング

システム要件:Microsoft Visual C++及びVisual Studio(2015,2017,2019)必須

タスクバー「ここから入力して検索」→ アプリと機能→ 下へスクロール

zip解凍後、好きな場所へ。Commandフォルダ内にある→ xdoc2txt.exeのショートカットを作成。※ショートカット作成後は、本体の場所を移動しないで下さい もちろんプロパティからパスを直せばいいんだけど、便宜上

Windows(C;)→ 表示(タブ)→ 隠しファイル ON

f:id:chocomarine:20200923171703j:plain
これをしないとユーザーからAppDataへ入れません

Windows(C:)→ ユーザー→ (ユーザー名)→AppData→ Roaming→ Microsoft→ Windows→ SendTo へ入れる

f:id:chocomarine:20200923172031j:plain
右クリックメニュー「送る」へ入ります

xdoc2txtショートカットのプロパティ(Alt + enter)→ ショートカット→ リンク先

*.exeの後にオプションを追記

f:id:chocomarine:20200923173359j:plain
(末尾に [半角スペース]-f[半角スペース]-u)
-f… ファイルに書き出す

-u… UTF-16 LE(BOM付き)
参照→ コマンドオプション


変換処理

Wordドキュメントを用意

f:id:chocomarine:20200923173625j:plain

※実際はドキュメントを開く必要はありません

Wordドキュメントを右クリック→ 送る→ xdoc2txt
f:id:chocomarine:20200923174923j:plain
f:id:chocomarine:20200923174946j:plain
f:id:chocomarine:20200923175004j:plain

元と同じディレクトリに、*.txtができる
f:id:chocomarine:20200923175108j:plain

結果

f:id:chocomarine:20200923175137j:plain
テキストボックス文が重複していますね


  • 複数選択して一括実行もできます。

  • 書き出されたテキストボックス部分は、移動させるなり改行で区切るなり、好きに編集して使って下さい。

  • コマンドオプションは、公式のリストを見て好きな組み合わせにして下さい。

  • ルビ文字は 親文字(ルビ文字) 丸パーレンに囲まれます

  • 校正機能などを使っているドキュメントの場合、Word上で見えていない文章なども書き出される(と思います)

  • まだ使い始めて間がないので、テキストボックスがある場合にどんな結果になるか検証不足です。文章が消えていたりする危険もあるので、よく注意を。(多分、何かしら崩れます)


…つまり、オリジナルがどんなレイアウトなのか保障がないため、結局はOfficeを持っていた方がベスト ちょ

モバイル版とブラウザ版Officeが無償で提供されているので、最低限それらでチェックを。※モバイル版は2021.1.12に提供及びサポート1が終了しました 但しこれらも、有料版と同等のレイアウト表示が担保されるわけではなさげ。

support.microsoft.com

ま有料版も、バージョン変わると結局アレですけど

間違っても、OpenOfficeLibreOfficeで書き出し・体裁チェックなどしない様に。


Macの方は、タクトシステムさんからWordドキュメントをテキストに変換を利用できます。

こちら私が長年利用した限りでは、テキストボックスがある場合本文がカケる・重複する・テキストボックス文が本文の変な所に差し込まれるという現象を確認しています。Officeのバージョンにより症状は異なります。昔のWordバージョンでは、テキストボックス箇所が丸々消えるだけだったんですが

これは、xdoc2txtでも同様ではないかと予想します。


まあ結局「Wordの変態仕様による見た目上を最も忠実に再現しつつ書き出し」できるのは、ネイティブOfficeからの直接書き出しに勝るものはなく、xdoc2txtとて余程プレーンな作りのWordでない限り、積極的にお勧めはしません。

何という結論

…それでも、圧倒的に早くストレスがない方法ではあるので、素直な構造の物であればよく活用しています。

要はモノを見極め、使い分けること。


2020.9.25 追記

一部*.docで、文章中に半角スペースが大量挿入される現象を確認(テキストボックスなしドキュメント。エディタでスペースだけ一括削除すれば、問題なさそう)

【InDesign】EDICOLOR機能を再現(4)オブジェクト作成後、自動で選択ツールに切り替え(2)

その(1)の続編です。

※停止スクリプト向けに内容を修正しました(2020.9.1)

※停止スクリプトの元ネタ・てんせーのLinkを、新サイトに修正(2021.12.11)


昨年4月に(1)の方法で一旦挫折した表題ですが、弊エントリーを見かけたあるふぁ(仮)さんが、Twitterでサクッと書いて下さいました。

素晴らしい、ズバリそのものです。転載を許可して頂きありがとうございます。今後もよろしk ←

Startup Scriptsなどに入れてお使い下さい。毎回自動で稼働するようになります。 Mac版はエイリアス

スクリプトパネル→ ユーザー(右クリック)→ エクスプローラー(Finder)で表示→ ここにStartup Scriptsフォルダを作成


長方形ツール等を使ったあと選択ツールになるようにする

※オブジェクト属性(パスオープン・クローズ等含む)が変化しないものは対象外(拡大縮小、回転、シアー、自由変形、スムーズ、グラデーション系、アンカーポイントの追加・切り替えツールなど)

※避けた方がいいもの:
文字=テキストツール(入力モードにした瞬間、選択ツールへ持ち替えてしまうよ)
ペンツール(新規アンカーを打つごとに選択ツールになってしまう)
アンカーの削除(いつ実行されるか予測が難しい)

//DESCRIPTION:何か作ったあと選択ツールになる

#targetengine tool1_v2022
f_= false;
t_= "|線ツール|長方形ツール|楕円形ツール|多角形ツール|長方形フレームツール|楕円形フレームツール|多角形フレームツール|横組みグリッドツール|縦組みグリッドツール|鉛筆ツール|"

app.toolBoxTools.addEventListener ("afterAttributeChanged", function(ev)
{
    if (t_.indexOf ("|" + ev.attributeValue + "|") >-1)
f_= true
    });
var listner = app.addEventListener("afterSelectionChanged", function(ev)
{
    if (f_)
    app.toolBoxTools.currentTool = UITools.SELECTION_TOOL, f_= false;
    });
listner.name = 'toolEvent';

EventListener afterAttributeChanged=属性が変更された時(after)のイベント

app.toolBoxTools.currentTool = UITools.SELECTION_TOOL=ツールのカレント(現在)を選択ツールにする

という内容。

この仕様を停止するには、下記のスクリプトを別途用意し

#targetengine tool1_v2022
app.eventListeners.itemByName('toolEvent').remove();

実行すると、デフォルトの仕様に戻ります。再度走らせるには、元のスクリプトをまた実行すればOK。

参考:てんせー

停止は以下でもOK。ちゃんと動きました

いずれもバージョンを同時に複数立ち上げる時には、#targetengine名の重複を避けて下さい(例の様に、バージョン名を末尾に追加するなど)

#targetengine tool1_v2022
listner.remove();

removeEventListeners というメソッドもあるらしいのですが、調べるとこれ少し面倒らしく、断念します。


あるふぁさん、ご指南ありがとうございます。多謝!

【InDesign】EDICOLOR機能を再現(4)オブジェクト作成後、自動で選択ツールに切り替え(1)

しばらく放置状態でした・・・すっかりMarkDownも忘れました

毎日なんとなく訪問者様があります、ありがとうございます。


Adobeさんは新規オブジェクトを作成後、ずっとそのツール(長方形ツールなど)に留まります。

そのままctrl(cmd)を押下すると一時的に選択ツールになり(※)、作成・移動(変形)の連続操作をシームレス且つ迅速に行えるというわけで、イラスト描きさんにはこの方が楽なのかもしれません。

※正確には、選択・ダイレクト選択のうち【前回使用した方】になる

ここが「一回作ったら即掴んで移動」で身についている人は、ツールの持ち替えにいちいち「全/半角キー→(半角Mode)V」と手順を踏まねばならず、更にWindowsはキーのフォーカスをいちいち奪われやすいため、時に「escのマッハ二度押し」も必要。マジイラつきます。マジ憎い、アクセラレーターキー。やや脱線


EDICOLORは新規作成後、必ず自動で選択ツールに戻る仕様となっています。意識せず即編集・移動作業へ移行できる。

逆に留めたい場合、Alt押下しながらツールをクリックでおけ。初級ユーザーを考慮し、且つユーザー側に選択権もある親切設計。素晴らしい設計思想だネッ!← いやマジで

InDesignのeventListnerでどうにか仕込めないか…と、2019.4開催DTPerのスクリプトもくもく会にてビッグ3、Yusukeさんこうちゃんさんお〜まちさんに相談しました。

が、上記のeventは「ちょっと現実的ではない」「他の方法は思いつかない」という回答。

結果、以下が妥協点です。


F1ショートカットキーに「選択ツールに持ち替え」スクリプトを割り当てる

(menuAction:選択ツールを選ぶ)

//DESCRIPTION:F1ショートカットキーに「選択ツールに持ち替え」スクリプトを割り当てる(らーで閣下)
// このスクリプトに、ショートカットキー「F1」を割り当てて下さい。
//(メニュー)編集→ キーボードショートカット→ 機能エリア=スクリプト→(このスクリプトに新規ショートカット)F1割当→ 保存(Myセットを保存)

#target "InDesign"
app.menuActions.item('$ID/Selection Tool').invoke();

要するにほぼ敗北ですが、仕方ない orz

因みに私はIllustratorも、選択を解除=F1にしています(escと連携しやすい)。

F1デフォルトはいわゆる「ヘルプ」ですが、単一で使え且つ扱いやすい位置というと、これが無難かなと。…Windowsは有効キーが少なくていけない。 escは選択トグル関係で外せないため、却下。WIN/変換/無変換はユーティリティを導入しないと使えない。


余談ですが、テキスト入力モードからフレーム選択状態へ(選択ツール)ショートカットは、デフォルトでesc。

これを一歩進んで、

選択を解除= esc(割り当て追加)
セル/テキストの選択へトグル= 削除(空欄)

f:id:chocomarine:20200821150155j:plain
機能エリア:テキストと表

で、escを完全に「入力モードのトグル」&「選択解除」に限定させてしまうと、世界が変わったかの様に色々と捗ります。

Yusukeさん、教えてくれて本当に感謝します!

あと個人的な悩みなんですが、表のセル内でタブ入れるのに適したショートカットキーって、何がいいでしょうかねえ。


※その2 に続きます

【InDesign】EDICOLOR機能を再現(3)【オブジェクトを均等アキに分布】

今回は、自作ではなくご紹介です。



こういうオブジェクト群があるとき、

f:id:chocomarine:20200529165125j:plain

我々が望む等間隔の整列(分布)とは

f:id:chocomarine:20200529165157j:plain

大体こうだろうと思うんですが、整列パネルの「分布」を使うと

f:id:chocomarine:20200529165236j:plain
整列(パネル)→(選択範囲に揃える)→ 分布(左)

f:id:chocomarine:20200604152205j:plain

結果はこうなります。違う、そうじゃない・・

そりゃま算数で数値を出したりひと手間加えれば出来ますが、速攻でやって欲しいわけです。



EDICOLORでは出来ます

f:id:chocomarine:20200529171358j:plain
公式ユーザーズガイド(v10)
も、もういいよね?出しちゃっても

で、これをInDesignで実現するには、スクリプトという事になります

dtptokadensyo.blog.fc2.com DTPとか電書(ゆう様)

この結果を得たい時は、整列パネルが必ずこうである必要があります

f:id:chocomarine:20200529172641j:plain
(チェック)選択範囲に揃える 間隔を指定=OFF

スクリプトを実行

属性

結果 ↓

f:id:chocomarine:20200529165157j:plain
だーーーーーーん
ただ配布のままだとctrl + Z一回で「実行前」までに戻れないので、下記にdoScript追加版を記します。


doScript(ctrl + Zで処理前まで戻れる)版(水平)

//DESCRIPTION:水平(左右)方向:均等アキ整列(CS6以降)
(function()
{
    app.doScript (Main, ScriptLanguage.JAVASCRIPT, null, UndoModes.FAST_ENTIRE_SCRIPT);
    function Main()
    {
        var 
        mD = app.activeDocument,
        mS = app.selection,
        selKey = mD.selectionKeyObject;
        if (dType)
        {
            var dType = mS[0].constructor.name;
            }
        if(mS == 0 || dType =="Text"|| dType =="Paragraph"|| dType =="TextColumn"|| dType =="Character")
        { //選択オブジェクトが左記以外ならなにもしない
            } else {  //何か選択していて、
                if (selKey == null)
                { //キーオブジェクトが選択されていなければ選択範囲内で、
                    mD.distribute (
                    mS,
                    DistributeOptions.HORIZONTAL_SPACE,  //水平方向に等間隔に分布
                    // DistributeOptions.VERTICAL_SPACE,  //垂直方向に等間隔に分布
                    AlignDistributeBounds.ITEM_BOUNDS,);
                    } else {  //キーオブジェクトを起点に、
                        var dis = prompt("左右何ミリ空きにしますか?","0","間隔を指定して、水平方向に等間隔に分布");
                        if(dis != null)
                        {
                            mD.distribute (
                            mS,
                            DistributeOptions.HORIZONTAL_SPACE,  //水平方向に等間隔に分布
                            // DistributeOptions.VERTICAL_SPACE,  //垂直方向に等間隔に分布
                            AlignDistributeBounds.KEY_OBJECT,
                            true,
                            dis+"mm",
                            mD.selectionKeyObject ,);
                            }else{
                                }
                            }}
                    }
                })();

doScript(ctrl + Zで処理前まで戻れる)版(垂直)

//DESCRIPTION:垂直(天地)方向:均等アキ整列(CS6以降)
(function()
{
    app.doScript (Main, ScriptLanguage.JAVASCRIPT, null, UndoModes.FAST_ENTIRE_SCRIPT);
        function Main()
        {
            var
            mD = app.activeDocument,
            mS = app.selection,
            selKey = mD.selectionKeyObject;

            if (dType)
            {
                var dType = mS[0].constructor.name;
                }
            if (mS == 0 || dType =="Text"|| dType =="Paragraph"|| dType =="TextColumn"|| dType =="Character"){ //選択オブジェクトが左記以外ならなにもしない
                } else {  //何か選択していて、
                    if (selKey == null)
                    { //キーオブジェクトが選択されていなければ選択範囲内で、
                        mD.distribute (
                        mS,
                        //DistributeOptions.HORIZONTAL_SPACE,  //水平方向に等間隔に分布
                        DistributeOptions.VERTICAL_SPACE,  //垂直方向に等間隔に分布
                        AlignDistributeBounds.ITEM_BOUNDS,);
                        } else {  //キーオブジェクトを起点に、
                            var dis = prompt("上下何ミリ空きにしますか?","0","間隔を指定して、垂直方向に等間隔に分布");
                            if (dis != null)
                            {
                                mD.distribute (
                                mS,
                                //DistributeOptions.HORIZONTAL_SPACE,  //水平方向に等間隔に分布
                                DistributeOptions.VERTICAL_SPACE,  //垂直方向に等間隔に分布
                                AlignDistributeBounds.KEY_OBJECT,
                                true,
                                dis+"mm",
                                mD.selectionKeyObject ,);
                                }else{
                                    }
                                }}
                        }
                    })();




因みに、「等間隔に分布」の使い方だけさらっと。

属性

f:id:chocomarine:20200529175337j:plain
「選択範囲に揃える」チェック時