chalcedony_htnの日記 2019-08-20T12:59:47+09:00 chalcedony_htn Hatena::Blog hatenablog://blog/13208692334729900786 Illustrator CC 2019で、環境設定の「選択された文字の異体字を表示」をJavaScriptで切り替える hatenablog://entry/26006613400699420 2019-08-20T12:59:47+09:00 2019-08-20T13:16:33+09:00 はいこんにちは。Illustrator CC 2019の環境設定には[選択された文字の異体字を表示]なる設定があるのですが、どうもこれがクリックで切り替えられない呪いがかかっているらしい。Windowsでは試してないのでわかりませんが。Illustrator CC 2019の[異体字を表示]オプションをオフにできないことがあるときの対処方法 | DTP Transit上の記事ではタブキーでフォーカスして……と書いてあるのだけど、それすら私の環境ではできなかったのです。 というわけで、この呪いを解く呪文を考えました。 結論 先に呪文だけ書いておきます。 var bool = app.prefer… <p>はいこんにちは。</p><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Illustrator">Illustrator</a> CC 2019の環境設定には[選択された文字の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B0%DB%C2%CE%BB%FA">異体字</a>を表示]なる設定があるのですが、どうもこれがクリックで切り替えられない呪いがかかっているらしい。<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a>では試してないのでわかりませんが。</p><p><a href="https://dtptransit.design/illustrator/howto-turnoff-character-altenates.html">Illustrator CC 2019&#x306E;&#xFF3B;&#x7570;&#x4F53;&#x5B57;&#x3092;&#x8868;&#x793A;&#xFF3D;&#x30AA;&#x30D7;&#x30B7;&#x30E7;&#x30F3;&#x3092;&#x30AA;&#x30D5;&#x306B;&#x3067;&#x304D;&#x306A;&#x3044;&#x3053;&#x3068;&#x304C;&#x3042;&#x308B;&#x3068;&#x304D;&#x306E;&#x5BFE;&#x51E6;&#x65B9;&#x6CD5; | DTP Transit</a></p><p>上の記事ではタブキーでフォーカスして……と書いてあるのだけど、それすら私の環境ではできなかったのです。<br /> というわけで、この呪いを解く呪文を考えました。<br /> <br /> <br /> <br /> </p> <div class="section"> <h4>結論</h4> <p>先に呪文だけ書いておきます。</p> <pre class="code js" data-lang="js" data-unlink>var bool = app.preferences.getBooleanPreference(&#34;text/enableAlternateGlyph&#34;); app.preferences.setBooleanPreference(&#34;text/enableAlternateGlyph&#34;, !bool);</pre><p>実行するたびに設定が切り替えられます。<br /> オフにするだけなら</p> <pre class="code js" data-lang="js" data-unlink>app.preferences.setBooleanPreference(&#34;text/enableAlternateGlyph&#34;, false);</pre><p>でOK。<br /> <br /> <br /> <br /> </p> </div> <div class="section"> <h4>過程</h4> <p>せっかくなので、作る過程を書いておきます。<br /> 呪いだけ解きたい人はこの先は読まなくてもいいです。あと、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac">Mac</a>前提で話をしますがたぶん<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a>でも同様に見つけられると思います。</p><br /> <p>前提として、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Illustrator">Illustrator</a>の環境設定を<a class="keyword" href="http://d.hatena.ne.jp/keyword/JavaScript">JavaScript</a>(<a class="keyword" href="http://d.hatena.ne.jp/keyword/ExtendScript">ExtendScript</a>)で制御することは可能。<br /> ただし、そのためのプロパティ(各設定に対応するキー名)は<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C6%A5%A3%A5%F3%A5%B0">スクリプティング</a>の資料には載っていない。なんでだよ。</p><p><a href="http://chuwa.iobb.net/tech/archive/2014/04/illustrator-preferences-1.html">Illustrator preferences 1 - &#x624B;&#x629C;&#x304D;Lab&#xFF20;DTP&#x306E;&#x73FE;&#x5834;</a><br /> <a href="http://chuwa.iobb.net/tech/archive/2014/05/preferences-keeper.html">preferences keeper (AI preferences 2) - &#x624B;&#x629C;&#x304D;Lab&#xFF20;DTP&#x306E;&#x73FE;&#x5834;</a></p><p><a href="https://github.com/ten-A/Extend_Script_experimentals/blob/master/preferencesKeeper.jsx">&#x629C;&#x304D;&#x66F8;&#x304D;&#x3057;&#x305F;&#x3082;&#x306E;&#x3092;GitHub&#x306B;&#x5171;&#x6709;</a>してくれているのだけど、<br /> この中にそれらしい名前のものは見つからなかった。</p><br /> <br /> <p>しかたがないので自力で探すことにする。</p><p><a href="https://forums.adobe.com/thread/2604760">Preference Key for Illustrator |&nbsp;Adobe Community</a></p><p>このスレッドによると、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Illustrator">Illustrator</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/SDK">SDK</a>をダウンロードすればドキュメントの中に手がかりがあるらしい。<br /> というわけでダウンロード。</p><p><a href="https://console.adobe.io/downloads">https://console.adobe.io/downloads</a></p><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Illustrator">Illustrator</a> CC 2019 <a class="keyword" href="http://d.hatena.ne.jp/keyword/SDK">SDK</a>を選んでダウンロード。<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/dmg">dmg</a>ファイルなので、マウントしてdocs/references/sdkdocs.tar.gzを展開。sdkdocs/index.htmlを開くとリファレンスが見られます。<br /> (このへんは<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a>だと違うかもしれません)</p><br /> <p>Suite > AIPreferenceSuite を開くと解説が載っている。</p> <blockquote> <p>For predefined prefixes and suffixes of application and <a class="keyword" href="http://d.hatena.ne.jp/keyword/Adobe">Adobe</a> plug-in preferences, see AIPreferenceKeys.h.</p> </blockquote> <p>とのことなので、AIPreferenceKeys.h File Reference(_a_i_preference_keys_8h.html)を開く。</p><p>適当に「alternate」とか「glyph」とかで検索し、それっぽい物を発見。</p> <blockquote> <p>#define kAIPrefTextEnableAltGlyph ((const char*)"text/enableAlternateGlyph")<br /> Making Alternate Glyph <a class="keyword" href="http://d.hatena.ne.jp/keyword/Widget">Widget</a> on screen visible.</p> </blockquote> <p>よくわかんないけどこのtext/enableAlternateGlyphあたりがキーだと思う。なんとなくだよ!</p><br /> <br /> <p>環境設定の値を取得するときは(Boolean値の場合)</p> <pre class="code js" data-lang="js" data-unlink>app.preferences.getBooleanPreference(&#34;キー&#34;);</pre><p>でできるようなので、まずはキーがあってるか確かめる。</p> <pre class="code js" data-lang="js" data-unlink>$.write(app.preferences.getBooleanPreference(&#34;text/enableAlternateGlyph&#34;));</pre><p>trueが出力されたのでたぶんあってる。<br /> 設定をオフにしてみる。こちらはsetBooleanPreference()を使う。</p> <pre class="code js" data-lang="js" data-unlink>app.preferences.setBooleanPreference(&#34;text/enableAlternateGlyph&#34;, false);</pre><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Illustrator">Illustrator</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/GUI">GUI</a>で確かめてみたところ、ちゃんとオフになってる!<br /> 解呪成功!!</p><br /> <br /> <p>せっかくならオン/オフを切り替えられるようにしたい、ということでちょっと修正。<br /> 冒頭に書いたものとおなじです。</p> <pre class="code js" data-lang="js" data-unlink>var bool = app.preferences.getBooleanPreference(&#34;text/enableAlternateGlyph&#34;); app.preferences.setBooleanPreference(&#34;text/enableAlternateGlyph&#34;, !bool);</pre><p>これで実行するたびに切り替わるようになりました。</p><br /> <br /> <p>以上です。あ、そういえばどうもお久しぶりです。</p> </div> chalcedony_htn InDesignのパネルメニューをJavaScriptから実行するときはパネルがvisibleな必要がある hatenablog://entry/17680117126976451155 2015-07-03T22:21:16+09:00 2019-02-22T17:00:04+09:00 タイトルで用は済んでるのですが、忘れないようにもう少しメモしておきます。 以下、OSX10.9 + CS6を前提に書いたものです。 直接DOMをいじるよりInDesignのメニューコマンドを叩いてしまうほうが処理が楽なことって結構ありますが、パネルメニューの場合はそのパネルが表示状態になってないと動きません。 表示状態というのはパネルのメニューボタンが押せる状態のことで、他のパネルとくっつけてタブ表示された状態であっても、それが背面になっていたら動かないってことです。 なので、MenuActionオブジェクトをたどるだけじゃなくて、パネルの表示状態も変更する必要があります。 // サンプル /… <p>タイトルで用は済んでるのですが、忘れないようにもう少しメモしておきます。<br /> 以下、OSX10.9 + CS6を前提に書いたものです。</p><br /> <br /> <p>直接DOMをいじるより<a class="keyword" href="http://d.hatena.ne.jp/keyword/InDesign">InDesign</a>のメニューコマンドを叩いてしまうほうが処理が楽なことって結構ありますが、パネルメニューの場合はそのパネルが表示状態になってないと動きません。<br /> 表示状態というのはパネルのメニューボタンが押せる状態のことで、他のパネルとくっつけてタブ表示された状態であっても、それが背面になっていたら動かないってことです。<br /> なので、MenuActionオブジェクトをたどるだけじゃなくて、パネルの表示状態も変更する必要があります。</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synComment">// サンプル</span> <span class="synComment">// 各スタイルで未使用の項目をすべて削除する</span> <span class="synComment">// 空のドキュメントだと[基本○○]とかを消そうとしてエラーになるので注意</span> (<span class="synIdentifier">function</span>()<span class="synIdentifier">{</span> <span class="synComment">// パネル名を処理したい順に並べておく</span> <span class="synIdentifier">var</span> arr = <span class="synIdentifier">[</span><span class="synConstant">&quot;オブジェクトスタイル&quot;</span>, <span class="synConstant">&quot;表スタイル&quot;</span>, <span class="synConstant">&quot;セルスタイル&quot;</span>, <span class="synConstant">&quot;段落スタイル&quot;</span>, <span class="synConstant">&quot;文字スタイル&quot;</span><span class="synIdentifier">]</span>; <span class="synStatement">for</span>(<span class="synIdentifier">var</span> i = 0, len = arr.length; i &lt; len; i++)<span class="synIdentifier">{</span> app.panels.itemByName(arr<span class="synIdentifier">[</span>i<span class="synIdentifier">]</span>).visible = <span class="synConstant">true</span>; <span class="synComment">// ★ここで表示状態にしてる</span> <span class="synIdentifier">var</span> menu = app.menus.itemByName(arr<span class="synIdentifier">[</span>i<span class="synIdentifier">]</span> + <span class="synConstant">&quot;パネルメニュー&quot;</span>); menu.menuItems.itemByName(<span class="synConstant">&quot;未使用をすべて選択&quot;</span>).associatedMenuAction.invoke(); <span class="synComment">// 未使用のものがなかったらエラーになるのではじいておく</span> <span class="synStatement">try</span><span class="synIdentifier">{</span> menu.menuItems.itemByName(<span class="synConstant">&quot;スタイルを削除...&quot;</span>).associatedMenuAction.invoke(); <span class="synIdentifier">}</span> <span class="synStatement">catch</span>(e)<span class="synIdentifier">{}</span> <span class="synIdentifier">}</span> <span class="synIdentifier">}</span>()); </pre><p>リハビリ的エントリでした。</p> chalcedony_htn InDesignのDOMをprototypeで拡張するメモ2 hatenablog://entry/17680117126976451193 2015-02-26T21:33:36+09:00 2019-02-22T17:00:05+09:00 昨日かいたやつがeveryItem()やitemByRange()で取得したオブジェクトに対応できてなかったことに気付きまして。twitterで騒いだところ、判別しないで対応すればいいじゃないと教えていただきました。https://twitter.com/peprintenpa/status/570915349459136512というわけで、書き直し。 (function(){ // Paragraph拡張 // 引数に指定した数値ずつサイズを下げる。単位は無視して数値しか見ない // 成功するとtrueを返す Paragraph.prototype.downSize = function(n… <p><a href="http://d.hatena.ne.jp/chalcedony_htn/20150225/1424862211">&#x6628;&#x65E5;&#x304B;&#x3044;&#x305F;&#x3084;&#x3064;</a>がeveryItem()やitemByRange()で取得したオブジェクトに対応できてなかったことに気付きまして。</p><p><a href="https://twitter.com/chalcedony/status/570904239511248898">twitter&#x3067;&#x9A12;&#x3044;&#x3060;&#x3068;&#x3053;&#x308D;</a>、判別しないで対応すればいいじゃないと教えていただきました。</p><p><a href="https://twitter.com/peprintenpa/status/570915349459136512">https://twitter.com/peprintenpa/status/570915349459136512</a></p><p>というわけで、書き直し。</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink>(<span class="synIdentifier">function</span>()<span class="synIdentifier">{</span> <span class="synComment">// Paragraph拡張</span> <span class="synComment">// 引数に指定した数値ずつサイズを下げる。単位は無視して数値しか見ない</span> <span class="synComment">// 成功するとtrueを返す</span> Paragraph.prototype.downSize = <span class="synIdentifier">function</span>(num)<span class="synIdentifier">{</span> <span class="synIdentifier">var</span> arr = <span class="synIdentifier">this</span>.getElements(); <span class="synStatement">for</span>( <span class="synIdentifier">var</span> i=0, len = arr.length; i&lt;len; i++ )<span class="synIdentifier">{</span> <span class="synIdentifier">var</span> tmp = arr<span class="synIdentifier">[</span>i<span class="synIdentifier">]</span>; <span class="synIdentifier">var</span> origin = tmp.pointSize; <span class="synIdentifier">var</span> size; <span class="synStatement">if</span>( num.constructor.name != <span class="synConstant">&quot;Number&quot;</span> )<span class="synIdentifier">{</span> <span class="synStatement">throw</span> <span class="synConstant">&quot;downSize Error: 引数が数値ではありません&quot;</span>; <span class="synIdentifier">}</span> size = origin - num; <span class="synStatement">if</span>( size &lt;= 0 ) <span class="synIdentifier">{</span> <span class="synStatement">throw</span> <span class="synConstant">&quot;downSize Error: これ以上サイズを下げられません&quot;</span>; <span class="synIdentifier">}</span> tmp.pointSize = size; <span class="synIdentifier">}</span> <span class="synComment">// ループ終わり</span> <span class="synStatement">return</span> <span class="synConstant">true</span>; <span class="synIdentifier">}</span> <span class="synComment">// 例:全ページの「target」って名前のテキストフレーム内の全段落のサイズを1下げる</span> <span class="synStatement">try</span> <span class="synIdentifier">{</span> app.activeDocument.pages.everyItem().textFrames.item(<span class="synConstant">&quot;target&quot;</span>).paragraphs.everyItem().downSize(1); <span class="synIdentifier">}</span> <span class="synStatement">catch</span>(e) <span class="synIdentifier">{</span> <span class="synIdentifier">}</span> <span class="synIdentifier">}</span>()); </pre><p>最近everyItem()の便利さにちょっと目覚めました。</p> chalcedony_htn InDesignのDOMをprototypeで拡張するメモ hatenablog://entry/17680117126976451231 2015-02-25T20:03:31+09:00 2019-02-22T17:00:06+09:00 自分で書かないと忘れるのでメモしておきます。たとえばParagraphに「指定した数値だけポイントサイズを下げる」ってメソッドを生やすとか。 (function(){ // Paragraph拡張 // 引数に指定した数値ずつサイズを下げる。単位は無視して数値しか見ない // 成功するとtrueを返す Paragraph.prototype.downSize = function(num){ var origin = this.pointSize; var size; if( num.constructor.name != "Number" ){ throw "downSize Error: … <p>自分で書かないと忘れるのでメモしておきます。</p><p>たとえばParagraphに「指定した数値だけポイントサイズを下げる」ってメソッドを生やすとか。</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink>(<span class="synIdentifier">function</span>()<span class="synIdentifier">{</span> <span class="synComment">// Paragraph拡張</span> <span class="synComment">// 引数に指定した数値ずつサイズを下げる。単位は無視して数値しか見ない</span> <span class="synComment">// 成功するとtrueを返す</span> Paragraph.prototype.downSize = <span class="synIdentifier">function</span>(num)<span class="synIdentifier">{</span> <span class="synIdentifier">var</span> origin = <span class="synIdentifier">this</span>.pointSize; <span class="synIdentifier">var</span> size; <span class="synStatement">if</span>( num.constructor.name != <span class="synConstant">&quot;Number&quot;</span> )<span class="synIdentifier">{</span> <span class="synStatement">throw</span> <span class="synConstant">&quot;downSize Error: 引数が数値ではありません&quot;</span>; <span class="synIdentifier">}</span> size = origin - num; <span class="synStatement">if</span>( size &lt;= 0 ) <span class="synIdentifier">{</span> <span class="synStatement">throw</span> <span class="synConstant">&quot;downSize Error: これ以上サイズを下げられません&quot;</span>; <span class="synIdentifier">}</span> <span class="synIdentifier">this</span>.pointSize = size; <span class="synStatement">return</span> <span class="synConstant">true</span>; <span class="synIdentifier">}</span> <span class="synComment">// 例:段落が一行におさまるまで0.5ずつ文字を小さくする</span>  <span class="synComment">// エラー投げられたら止まるようにしておく</span> <span class="synIdentifier">var</span> p = app.selection<span class="synIdentifier">[</span>0<span class="synIdentifier">]</span>.paragraphs<span class="synIdentifier">[</span>0<span class="synIdentifier">]</span>; <span class="synStatement">while</span>(p.lines.length &gt; 1)<span class="synIdentifier">{</span> <span class="synStatement">try</span> <span class="synIdentifier">{</span> p.downSize(0.5); <span class="synIdentifier">}</span> <span class="synStatement">catch</span>(e) <span class="synIdentifier">{</span> <span class="synStatement">alert</span>(e); <span class="synStatement">break</span>; <span class="synIdentifier">}</span> <span class="synIdentifier">}</span> <span class="synIdentifier">}</span>()); </pre><p>エラー処理はてきとーです。</p><p>Paragraph(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>)のpointSizeの値しか見てないので、段落内で文字サイズが違う場合対応できない。実験だとpointSizeは最初の文字のサイズが返ってきてるみたい。</p> chalcedony_htn Adobe ExtendScriptのプリプロセッサディレクティブ hatenablog://entry/17680117126976451288 2015-02-20T22:33:02+09:00 2019-02-22T17:00:07+09:00 ExtendScriptって名前、検索しづらいにもほどがあると思います。どうもこんばんは。スクリプトをいくつかのファイルに分割したり、単機能のライブラリとして読み込んだりしたいとき、#includeディレクティブ(指示文)を記述するとインクルードすることができます。 他にも#targetとか#targetengineだとかあって、使うたびに調べてて面倒になったのでまとめておこうと思いました。元ネタは「JavaScriptToolsGuideCC.pdf」。Mac 10.9 + ExtendScript Toolkit CCでの実験結果を含みます。 書き方 #include "file1.jsx… <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/ExtendScript">ExtendScript</a>って名前、検索しづらいにもほどがあると思います。どうもこんばんは。</p><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>をいくつかのファイルに分割したり、単機能のライブラリとして読み込んだりしたいとき、#includeディレクティブ(指示文)を記述するとインクルードすることができます。<br /> 他にも#targetとか#targetengineだとかあって、使うたびに調べてて面倒になったのでまとめておこうと思いました。</p><p>元ネタは「JavaScriptToolsGuideCC.pdf」。<a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac">Mac</a> 10.9 + <a class="keyword" href="http://d.hatena.ne.jp/keyword/ExtendScript">ExtendScript</a> Toolkit CCでの実験結果を含みます。<br /> <br /> </p> <div class="section"> <h4>書き方</h4> <pre class="code lang-javascript" data-lang="javascript" data-unlink> #include <span class="synConstant">&quot;file1.jsxinc;folder/file2.jsxinc&quot;</span> </pre><p>Cとかに似てるそうですね、知らんけど。</p><p>ポイントは以下の通り。</p> <ul> <li>先頭に#、続けてディレクティブ名、スペース、引数。</li> <li>末尾に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BB%A5%DF">セミ</a>コロンはつけない。</li> <li>引数に複数の値を指定するときは<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BB%A5%DF">セミ</a>コロンで区切る。</li> <li>引数の引用符は必須ではないけど、英数字以外を含む場合や、複数指定する場合は必要。'でも"でもOK。</li> </ul> </div> <div class="section"> <h4>各ディレクティブ説明</h4> <p>指定できるディレクティブは以下の6つ。</p> <ul> <li>#include</li> <li>#includepath</li> <li>#script</li> <li>#strict</li> <li>#target</li> <li>#targetengine</li> </ul><p>順番にいきましょう。<br /> <br /> </p> <div class="section"> <h5>#include</h5> <pre class="code lang-javascript" data-lang="javascript" data-unlink> #include <span class="synConstant">&quot;../folder/file1.jsxinc&quot;</span> </pre><p>他の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>ファイルをインクルード(読み込んで実行)します。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C1%EA%C2%D0%A5%D1%A5%B9">相対パス</a>、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%E4%C2%D0%A5%D1%A5%B9">絶対パス</a>どちらも使えるっぽいです。</p><p>ちなみに.jsxincというのは普通の.jsxファイルの拡張子を変えただけのファイルです。インクルード専用のファイルだということを明示するために付ける拡張子。<a class="keyword" href="http://d.hatena.ne.jp/keyword/InDesign">InDesign</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>パネルなどから直接実行できなくなります。</p><p>ディレクティブは複数書いても大丈夫みたいですね。その場合は上から順に読み込まれます。<br /> <br /> </p> </div> <div class="section"> <h5>#includepath</h5> <pre class="code lang-javascript" data-lang="javascript" data-unlink> #includepath <span class="synConstant">&quot;folder1;../folder2&quot;</span> </pre><p>インクルードするファイル(#includeで記述)のパスを指定します。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C1%EA%C2%D0%A5%D1%A5%B9">相対パス</a>、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%E4%C2%D0%A5%D1%A5%B9">絶対パス</a>どちらも使えます。引数は複数指定可能。</p><p>これがなかなかややこしいというか、下手に使うと失敗しそうです。例を挙げると、</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink>#includepath <span class="synConstant">&quot;../lib/folder1;../lib/folder2&quot;</span> #includepath <span class="synConstant">&quot;../lib&quot;</span> #include <span class="synConstant">&quot;multi.jsxinc&quot;</span> </pre><p>こんなふうに記述した場合、インクルードされるファイルは以下の4つ。(数字)は読み込み順です。</p> <ul> <li>../lib/folder1/multi.jsxinc (3)</li> <li>../lib/folder2/multi.jsxinc (2)</li> <li>../lib/multi.jsxinc (1)</li> <li>./multi.jsxinc (4)</li> </ul><p>最後のは、実行中の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>と同じ階層にあるファイルです。<br /> 確かに#include自体<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C1%EA%C2%D0%A5%D1%A5%B9">相対パス</a>とみなせるので理解はできるんだけど……ちょっと怖いのは私だけですか。主に順番とか。</p><p>面倒なので実験はしてないけど、これで#includeが複数あるともっとややこしくなりそうです。<br /> ファイル名をユニークにすること、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B0%A5%ED%A1%BC%A5%D0%A5%EB%CA%D1%BF%F4">グローバル変数</a>を最低限にすることが大事っぽい。<br /> <br /> </p> </div> <div class="section"> <h5>#script</h5> <pre class="code lang-javascript" data-lang="javascript" data-unlink> #script <span class="synConstant">&quot;Script Name&quot;</span> </pre><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>の名前を指定します。<br /> 「The <i>name</i> <a class="keyword" href="http://d.hatena.ne.jp/keyword/value">value</a> is displayed in the Toolkit Editor tab.」って書いてあるんだけど、どこで使われるんだかよくわからない。知ってる人いたら教えてください。<br /> <br /> </p> </div> <div class="section"> <h5>#strict</h5> <pre class="code lang-javascript" data-lang="javascript" data-unlink> #strict on </pre><p>エラーチェックをstrict(厳密)モードにします。<br /> オブジェクトのプロパティがreadonly(読み込み専用)に設定されているとき、通常は<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>で上書きしようとしても無視されてそのまま進むだけなんだけど、strictモードがonだとエラーで止まるようになるみたいです。<br /> <br /> </p> </div> <div class="section"> <h5>#target</h5> <pre class="code lang-javascript" data-lang="javascript" data-unlink>#target <span class="synConstant">&quot;indesign&quot;</span> </pre><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>が動作するアプリケーションを指定します。<br /> ここで指定しておくと、.jsxファイルをダブルクリックしたとき、アプリケーションを起動して実行するかどうかのダイアログが出ます。指定しない場合はESTKで開くだけで、実行はされません。<br /> <br /> </p> </div> <div class="section"> <h5>#targetengine</h5> <pre class="code lang-javascript" data-lang="javascript" data-unlink> #targetengine <span class="synConstant">&quot;session&quot;</span> </pre><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>が動作する<a class="keyword" href="http://d.hatena.ne.jp/keyword/JavaScript">JavaScript</a>エンジンを指定します。<br /> 通常、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>で使用した<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B0%A5%ED%A1%BC%A5%D0%A5%EB%CA%D1%BF%F4">グローバル変数</a>は実行後に破棄されるんだけど、ここでmain以外を指定しておくと、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>が動作したアプリケーションが起動している間はずっと変数が保持され、同じエンジンを指定した<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>から参照できるようになります。<br /> ScriptUIを使ってウィンドウやらパレットやらを作りたいときには指定必須です。<br /> <br /> </p> </div> </div> <div class="section"> <h4>おしまい</h4> <p>正直#includepathのとこが書きたかっただけです。</p> </div> chalcedony_htn InDesignの段落相互参照をJavaScriptで作る hatenablog://entry/17680117126976451376 2014-08-06T18:04:47+09:00 2019-02-22T17:00:09+09:00 はいこんばんは。 相互参照の作り方がけっこうめんどくさかったので自分用にメモ。ついでに実験。 10.9 + CS6でしか動かしてません。あと、テキストアンカーへの参照は別の作り方するはずです。調べてない。 必要なものは 参照先ドキュメント (A) 参照先マーカー挿入箇所(InsertionPoint) (A-1) 段落参照先オブジェクト(ParagraphDestination) (A-2) 参照元(ソース)ドキュメント (B) 相互参照形式(CrossReferenceFormat) (B-1) 相互参照挿入箇所(Text系オブジェクト) (B-2) 相互参照ソースオブジェクト(CrossR… <p>はいこんばんは。<br /> 相互参照の作り方がけっこうめんどくさかったので自分用にメモ。ついでに実験。<br /> 10.9 + CS6でしか動かしてません。あと、テキストアンカーへの参照は別の作り方するはずです。調べてない。</p><br /> <p>必要なものは</p> <ul> <li>参照先ドキュメント (A) <ul> <li>参照先マーカー挿入箇所(InsertionPoint) (A-1)</li> <li>段落参照先オブジェクト(ParagraphDestination) (A-2)</li> </ul></li> </ul> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%BB%B2%BE%C8%B8%B5">参照元</a>(ソース)ドキュメント (B) <ul> <li>相互参照形式(CrossReferenceFormat) (B-1)</li> <li>相互参照挿入箇所(Text系オブジェクト) (B-2)</li> <li>相互参照ソースオブジェクト(CrossReferenceSource) (B-3)</li> </ul></li> </ul><pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synIdentifier">var</span> destinationDoc = app.documents.item(<span class="synConstant">&quot;destination.indd&quot;</span>); <span class="synComment">// A</span> <span class="synIdentifier">var</span> sourceDoc = app.documents.item(<span class="synConstant">&quot;source.indd&quot;</span>); <span class="synComment">// B</span> <span class="synIdentifier">var</span> destinationPoint = destinationDoc.(DOMツリー).insertionPoints<span class="synIdentifier">[</span>0<span class="synIdentifier">]</span>; <span class="synComment">// A-1</span> <span class="synIdentifier">var</span> destination = destinationDoc.paragraphDestinations.add(destinationPoint); <span class="synComment">// A-2</span> <span class="synIdentifier">var</span> format = sourceDoc.crossReferenceFormats.item(<span class="synConstant">&quot;formatName&quot;</span>); <span class="synComment">// B-1</span> <span class="synIdentifier">var</span> sourseText = sourceDoc.(DOMツリー).texts<span class="synIdentifier">[</span>0<span class="synIdentifier">]</span>; <span class="synComment">// B-2</span> <span class="synIdentifier">var</span> source = sourceDoc.crossReferenceSources.add(sourseText, format); <span class="synComment">// B-3</span> <span class="synComment">// 相互参照挿入</span> sourceDoc.hyperlinks.add(source, destination); </pre><p><br /> で、たとえばこんなのを作れるねっていう思いつき。変数名は上のと一緒にしてます。</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synComment">// 選択中のテキストと同じ文言をドキュメント内から検索し、まとめて段落相互参照を設定します。</span> <span class="synComment">// 辞書系ドキュメントの見出し語を選択して実行→本文中の同じ文言が全部相互参照になるとか。</span> <span class="synComment">// 単なるテキスト検索なので精度を上げるには工夫が必要。あくまで例です。</span> <span class="synIdentifier">var</span> destinationDoc = app.activeDocument; <span class="synIdentifier">var</span> sourceDoc = app.documents.item(<span class="synConstant">&quot;source.indd&quot;</span>); <span class="synComment">// 相互参照を挿入したいほうのドキュメント</span> <span class="synIdentifier">var</span> destinationPoint = app.selection<span class="synIdentifier">[</span>0<span class="synIdentifier">]</span>.insertionPoints<span class="synIdentifier">[</span>0<span class="synIdentifier">]</span>; <span class="synIdentifier">var</span> destination = destinationDoc.paragraphDestinations.add(destinationPoint); <span class="synIdentifier">var</span> format = sourceDoc.crossReferenceFormats.item(<span class="synConstant">&quot;見出し参照&quot;</span>); <span class="synComment">// 相互参照形式は事前に作っておく</span> <span class="synComment">// テキスト検索</span> app.findTextPreferences = NothingEnum.nothing; app.changeTextPreferences = NothingEnum.nothing; app.findTextPreferences.findWhat = app.selection<span class="synIdentifier">[</span>0<span class="synIdentifier">]</span>.contents; app.findTextPreferences.appliedParagraphStyle = <span class="synConstant">&quot;本文&quot;</span>; <span class="synComment">// 念のため段落スタイル指定</span> <span class="synIdentifier">var</span> foundTexts = sourceDoc.findText(); <span class="synComment">// 検索実行</span> <span class="synStatement">for</span> (<span class="synIdentifier">var</span> i = 0, len = foundTexts.length; i &lt; len; i++) <span class="synIdentifier">{</span> <span class="synIdentifier">var</span> sourseText = foundTexts<span class="synIdentifier">[</span>i<span class="synIdentifier">]</span>; <span class="synIdentifier">var</span> source = sourceDoc.crossReferenceSources.add(sourseText, format); sourceDoc.hyperlinks.add(source, destination); <span class="synComment">// destinationは使い回せる</span> <span class="synIdentifier">}</span> </pre><p>使いどころは限定されると思う。</p><br /> <p>実際のところ、私が使ったのは逆パターン(選択したテキストから参照先の見出しを探す)のほうだったりします。<br /> そもそも相互参照じたい使ってる人少なそうだけどねー。</p> chalcedony_htn PhotoshopドキュメントをJavaScriptで別名保存する hatenablog://entry/17680117126976451431 2014-07-25T23:43:07+09:00 2019-02-22T17:00:10+09:00 たまにはアプリケーションに特化したことを書こうのコーナーです(今考えた)。いわゆる「別名保存」はDocment.saveAs()メソッドを使うんだけど、オプション類をいちいち調べるのが嫌になったのでまとめます。 なお、以下はPhotoshop CS6 Javascript Scripting Reference(リンク先PDF)を信用して書いたものです。ESTK付属のオブジェクトモデルビューアよりずっと使いやすいのでおすすめ。 Document.saveAs() 書式 Document.saveAs(saveIn[, options][, asCopy][, extensionType]); … <p>たまにはアプリケーションに特化したことを書こうのコーナーです(今考えた)。</p><p>いわゆる「別名保存」はDocment.saveAs()メソッドを使うんだけど、オプション類をいちいち調べるのが嫌になったのでまとめます。<br /> なお、以下は<a href="http://wwwimages.adobe.com/content/dam/Adobe/en/products/photoshop/pdfs/cs6/Photoshop-CS6-JavaScript-Ref.pdf">Photoshop CS6 Javascript Scripting Reference</a>(リンク先PDF)を信用して書いたものです。ESTK付属のオブジェクトモデルビューアよりずっと使いやすいのでおすすめ。</p> <div class="section"> <h4>Document.saveAs() 書式</h4> <pre class="code lang-javascript" data-lang="javascript" data-unlink> Document.saveAs(saveIn<span class="synIdentifier">[</span>, options<span class="synIdentifier">][</span>, asCopy<span class="synIdentifier">][</span>, extensionType<span class="synIdentifier">]</span>); </pre> <table> <tr> <th>引数</th> <th>型</th> <th>説明</th> </tr> <tr> <td>saveIn </td> <td>File </td> <td>必須。保存先になるFileオブジェクト。ここで拡張子つけても無視してpsd形式にされる。他の形式にしたい場合はオプションで指定する必要がある。</td> </tr> <tr> <td>options </td> <td>varies<br />(いろいろ)</td> <td>保存オプション。ファイル形式、および保存時のオプションを指定する。ファイル形式ごとにオブジェクト(クラス)が異なる。詳しくはあとで。</td> </tr> <tr> <td>asCopy </td> <td>boolean </td> <td>複製として保存するかどうか。オプション。</td> </tr> <tr> <td>extensionType</td> <td>Extension </td> <td>拡張子の書式。オプション。<br /><br />Extension.LOWERCASE 小文字<br />Extension.NONE 拡張子なし<br />Extension.UPPERCASE 大文字</td> </tr> </table> </div> <div class="section"> <h4>保存先Fileオブジェクト</h4> <pre class="code lang-javascript" data-lang="javascript" data-unlink> <span class="synIdentifier">var</span> fileobj = <span class="synStatement">new</span> File(<span class="synConstant">&quot;ファイルパス&quot;</span>); </pre><p>とかして作ればいいんじゃないですかね(投げやり)。</p> </div> <div class="section"> <h4>保存オプション</h4> <p>オプションは保存形式ごとに別々のクラスが用意されている。ふつうに<a class="keyword" href="http://d.hatena.ne.jp/keyword/GUI">GUI</a>で保存するときもそうだけど、形式によってオプションがまるで違うからだと思う。<br /> 例えばjpg形式なら、</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synIdentifier">var</span> saveOptions = <span class="synStatement">new</span> JPEGSaveOptions; saveOptions.embedColorProfile = <span class="synConstant">true</span>; saveOptions.formatOptions = FormatOptions.STANDARDBASELINE; saveOptions.quality = 12; <span class="synComment">// 他、各プロパティを設定</span> app.activeDocument.saveAs(fileobj, saveOptions, <span class="synConstant">false</span>, Extension.LOWERCASE) </pre><p>って感じでオブジェクトを作ってから、saveAs()実行時に引数として渡す。</p> <ul> <li><a href="#BMP">BMPSaveOptions</a></li> <li><a href="#DCS1">DCS1_SaveOptions</a></li> <li><a href="#DCS2">DCS2_SaveOptions</a></li> <li><a href="#EPS">EPSSaveOptions</a></li> <li><a href="#GIF">GIFSaveOptions</a></li> <li><a href="#JPEG">JPEGSaveOptions</a></li> <li><a href="#PDF">PDFSaveOptions</a></li> <li><a href="#PSD">PhotoshopSaveOptions</a></li> <li><a href="#PICTFile">PICTFileSaveOptions</a></li> <li><a href="#PICTResource">PICTResourceSaveOptions</a></li> <li><a href="#PXR">PixarSaveOptions</a></li> <li><a href="#PNG">PNGSaveOptions</a></li> <li><a href="#RAW">RawSaveOptions</a></li> <li><a href="#SGIRGB">SGIRGBSaveOptions</a></li> <li><a href="#TGA">TargaSaveOptions</a></li> <li><a href="#TIFF">TiffSaveOptions</a></li> </ul><p>とりあえず順番にいきましょう。これ使うの?ってのもあるけど。<br /> <br /> </p> <div class="section"> <h5><a name="BMP">BMP</a></h5> <p>BMPSaveOptions</p> <table> <tr> <th>プロパティ</th> <th>型</th> <th>説明</th> </tr> <tr> <td>alphaChannels </td> <td>boolean </td> <td>アルファチャンネルを保持するかどうか。たぶん32bitのときだけ。</td> </tr> <tr> <td>depth </td> <td>BMPDepthType </td> <td>ビット数。<br /><br />BMPDepthType.ONE 1bit<br />BMPDepthType.FOUR 4bit<br />BMPDepthType.EIGHT 8bit<br />BMPDepthType.SIXTEEN 16bit<br />BMPDepthType.TWENTYFOUR 24bit<br />BMPDepthType.THIRTYTWO 32bit<br /><br />詳細モードだともっとあるけど略</td> </tr> <tr> <td>flipRowOrder </td> <td>boolean </td> <td>行の順序の反転。osTypeが<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a>のときだけ動作。</td> </tr> <tr> <td>osType </td> <td>OperatingSystem</td> <td>ファイル形式。<br /><br />OperatingSystem.OS2 <a class="keyword" href="http://d.hatena.ne.jp/keyword/OS/2">OS/2</a><br />OperatingSystem.<a class="keyword" href="http://d.hatena.ne.jp/keyword/WINDOWS">WINDOWS</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a></td> </tr> <tr> <td>rleCompression</td> <td>boolean </td> <td>RLE圧縮するかどうか。osTypeが<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a>でdepthが4bitか8bitのときだけ動作。</td> </tr> <tr> <td>typename </td> <td>string </td> <td>オブジェクトのクラス名。readonly。"BMPSaveOptions"</td> </tr> </table> </div> <div class="section"> <h5><a name="DCS1">DCS 1.0</a></h5> <p>DCS1_SaveOptions</p> <table> <tr> <th>プロパティ</th> <th>型</th> <th>説明</th> </tr> <tr> <td>dCS </td> <td>DCSType </td> <td>プレビュー用ファイルの形式。<br /><br />DCSType.COLORCOMPOSITE カラープレビュー<br />DCSType.GRAYSCALECOMPOSITE グレースケールプレビュー<br />DCSType.NOCOMPOSITE プレビューなし</td> </tr> <tr> <td>embedColorProfile</td> <td>boolean </td> <td>カラープロファイルを埋め込むかどうか。</td> </tr> <tr> <td>encoding </td> <td>SaveEncoding</td> <td><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%F3%A5%B3%A1%BC%A5%C7%A5%A3%A5%F3%A5%B0">エンコーディング</a>形式。<br /><br />SaveEncoding.ASCII ASCII<br />SaveEncoding.BINARY バイナリ<br />SaveEncoding.JPEGLOW <a class="keyword" href="http://d.hatena.ne.jp/keyword/JPEG">JPEG</a>(低画質)<br />SaveEncoding.JPEGMEDIUM <a class="keyword" href="http://d.hatena.ne.jp/keyword/JPEG">JPEG</a>(標準画質)<br />SaveEncoding.JPEGHIGH <a class="keyword" href="http://d.hatena.ne.jp/keyword/JPEG">JPEG</a>(高画質)<br />SaveEncoding.JPEGMAXIMUM <a class="keyword" href="http://d.hatena.ne.jp/keyword/JPEG">JPEG</a>(最高画質)</td> </tr> <tr> <td>halftoneScreen </td> <td>boolean </td> <td><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%CF%A1%BC%A5%D5%A5%C8%A1%BC%A5%F3">ハーフトーン</a>スクリーンを保持するかどうか。</td> </tr> <tr> <td>interpolation </td> <td>boolean </td> <td>プレビューに画像補間方式(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%AD%A5%E5%A1%BC%A5%D3%A5%C3%A5%AF">バイキュービック</a>)を適用するかどうか。</td> </tr> <tr> <td><a class="keyword" href="http://d.hatena.ne.jp/keyword/preview">preview</a> </td> <td><a class="keyword" href="http://d.hatena.ne.jp/keyword/Preview">Preview</a> </td> <td>EPSプレビュー形式。<br /><br /><a class="keyword" href="http://d.hatena.ne.jp/keyword/Preview">Preview</a>.EIGHTBITTIFF 8bitTIFF<br /><a class="keyword" href="http://d.hatena.ne.jp/keyword/Preview">Preview</a>.MACOSEIGHTBIT <a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac">Mac</a> 8bitTIFF<br /><a class="keyword" href="http://d.hatena.ne.jp/keyword/Preview">Preview</a>.MACOSJPEG <a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac">Mac</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/JPEG">JPEG</a><br /><a class="keyword" href="http://d.hatena.ne.jp/keyword/Preview">Preview</a>.MACOSMONOCHROME <a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac">Mac</a> 1bitTIFF(モノクロ)<br /><a class="keyword" href="http://d.hatena.ne.jp/keyword/Preview">Preview</a>.MONOCHROMETIFF 1bitTIFF(モノクロ)<br /><a class="keyword" href="http://d.hatena.ne.jp/keyword/Preview">Preview</a>.NONE なし</td> </tr> <tr> <td>transferFunction </td> <td>boolean </td> <td><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C8%A5%E9%A5%F3%A5%B9%A5%D5%A5%A1%A1%BC">トランスファー</a>関数を保持するかどうか。</td> </tr> <tr> <td>typename </td> <td>string </td> <td>オブジェクトのクラス名。readonly。"DCS1_SaveOptions"</td> </tr> <tr> <td>vectorData </td> <td>boolean </td> <td><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%AF%A5%BF%A1%BC">ベクター</a>データを保持するかどうか。</td> </tr> </table> </div> <div class="section"> <h5><a name="DCS2">DCS 2.0</a></h5> <p>DCS 1.0のプロパティに加えて、以下のプロパティがある。typenameは当然"DCS2_SaveOptions"になる。<br /> DCS2_SaveOptions</p> <table> <tr> <th>プロパティ</th> <th>型</th> <th>説明</th> </tr> <tr> <td>multiFileDCS</td> <td>boolean</td> <td>カラーチャンネルを複数ファイルとして出力するかどうか。falseで単一ファイルになる。</td> </tr> <tr> <td>spotColors </td> <td>boolean</td> <td>特色チャンネルを保持するかどうか。</td> </tr> </table> </div> <div class="section"> <h5><a name="EPS">EPS</a></h5> <p>ほとんどDCSとかぶってるけど改めて全部書いておく。<br /> EPSSaveOptions</p> <table> <tr> <th>プロパティ</th> <th>型</th> <th>説明</th> </tr> <tr> <td>embedColorProfile</td> <td>boolean </td> <td>カラープロファイルを埋め込むかどうか。</td> </tr> <tr> <td>encoding </td> <td>SaveEncoding</td> <td><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%F3%A5%B3%A1%BC%A5%C7%A5%A3%A5%F3%A5%B0">エンコーディング</a>形式。<br /><br />SaveEncoding.ASCII ASCII<br />SaveEncoding.BINARY バイナリ<br />SaveEncoding.JPEGLOW <a class="keyword" href="http://d.hatena.ne.jp/keyword/JPEG">JPEG</a>(低画質)<br />SaveEncoding.JPEGMEDIUM <a class="keyword" href="http://d.hatena.ne.jp/keyword/JPEG">JPEG</a>(標準画質)<br />SaveEncoding.JPEGHIGH <a class="keyword" href="http://d.hatena.ne.jp/keyword/JPEG">JPEG</a>(高画質)<br />SaveEncoding.JPEGMAXIMUM <a class="keyword" href="http://d.hatena.ne.jp/keyword/JPEG">JPEG</a>(最高画質)</td> </tr> <tr> <td>halftoneScreen </td> <td>boolean </td> <td><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%CF%A1%BC%A5%D5%A5%C8%A1%BC%A5%F3">ハーフトーン</a>スクリーンを保持するかどうか。</td> </tr> <tr> <td>interpolation </td> <td>boolean </td> <td>プレビューに画像補間方式(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%AD%A5%E5%A1%BC%A5%D3%A5%C3%A5%AF">バイキュービック</a>)を適用するかどうか。</td> </tr> <tr> <td><a class="keyword" href="http://d.hatena.ne.jp/keyword/preview">preview</a> </td> <td><a class="keyword" href="http://d.hatena.ne.jp/keyword/Preview">Preview</a> </td> <td>EPSプレビュー形式。<br /><br /><a class="keyword" href="http://d.hatena.ne.jp/keyword/Preview">Preview</a>.EIGHTBITTIFF 8bitTIFF<br /><a class="keyword" href="http://d.hatena.ne.jp/keyword/Preview">Preview</a>.MACOSEIGHTBIT <a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac">Mac</a> 8bitTIFF<br /><a class="keyword" href="http://d.hatena.ne.jp/keyword/Preview">Preview</a>.MACOSJPEG <a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac">Mac</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/JPEG">JPEG</a><br /><a class="keyword" href="http://d.hatena.ne.jp/keyword/Preview">Preview</a>.MACOSMONOCHROME <a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac">Mac</a> 1bitTIFF(モノクロ)<br /><a class="keyword" href="http://d.hatena.ne.jp/keyword/Preview">Preview</a>.MONOCHROMETIFF 1bitTIFF(モノクロ)<br /><a class="keyword" href="http://d.hatena.ne.jp/keyword/Preview">Preview</a>.NONE なし</td> </tr> <tr> <td>psColorManagement</td> <td>boolean </td> <td>PostScript<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AB%A5%E9%A1%BC%A5%DE%A5%CD%A5%B8%A5%E1%A5%F3%A5%C8">カラーマネジメント</a>を有効にするかどうか。</td> </tr> <tr> <td>transferFunction </td> <td>boolean </td> <td><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C8%A5%E9%A5%F3%A5%B9%A5%D5%A5%A1%A1%BC">トランスファー</a>関数を保持するかどうか。</td> </tr> <tr> <td>transparentWhites</td> <td>boolean </td> <td>白色部分を透明として扱うかどうか。モノクロ二階調時(document.modeがDocumentMode.BITMAPのとき)のみ有効。</td> </tr> <tr> <td>typename </td> <td>string </td> <td>オブジェクトのクラス名。readonly。"EPSSaveOptions"</td> </tr> <tr> <td>vectorData </td> <td>boolean </td> <td><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%AF%A5%BF%A1%BC">ベクター</a>データを保持するかどうか。</td> </tr> </table> </div> <div class="section"> <h5><a name="GIF">GIF</a></h5> <p>GIFSaveOptions</p> <table> <tr> <th>プロパティ</th> <th>型</th> <th>説明</th> </tr> <tr> <td>colors </td> <td>number </td> <td>表示色数。</td> </tr> <tr> <td>dither </td> <td>Dither </td> <td>ディザ方式。<br /><br />Dither.DIFFUSION 誤差拡散法<br />Dither.NOISE ノイズ<br />Dither.NONE なし<br />Dither.PATTERN パターン</td> </tr> <tr> <td>ditherAmount </td> <td>number </td> <td>ディザの適用量(1〜100)。誤差拡散法の適用時のみ有効。</td> </tr> <tr> <td>forced </td> <td>ForcedColors</td> <td>使用しているかどうかに関わらず強制的にパレットに含む色。<br />ForcedColors.BLACKWHITE 白黒<br />ForcedColors.NONE なし<br />ForcedColors.PRIMARIES レッド、グリーン、ブルー、シアン、マゼンタ、イエロー、黒、白<br />ForcedColors.WEB Webセーフカラー</td> </tr> <tr> <td>interlaced </td> <td>boolean </td> <td><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%BF%A1%BC%A5%EC%A1%BC%A5%B9">インターレース</a>を有効にするかどうか。</td> </tr> <tr> <td>matte </td> <td>MatteType </td> <td>マット。透明部分(不透明度が100%でない箇所)の背景色を塗りつぶす色の設定。transparencyプロパティがtrueの場合は完全な透明部分(不透明度0%の箇所)には適用されない。<br /><br />MatteType.BACKGROUND 背景色<br />MatteType.BLACK 黒<br />MatteType.FOREGROUND 描画色<br />MatteType.<a class="keyword" href="http://d.hatena.ne.jp/keyword/NETSCAPE">NETSCAPE</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%CD%A5%C3%A5%C8%A5%B9%A5%B1%A1%BC%A5%D7">ネットスケープ</a>グレー<br />MatteType.NONE なし<br />MatteType.SEMIGRAY 50%グレー<br />MatteType.WHITE 白<br /></td> </tr> <tr> <td>palette </td> <td>PaletteType </td> <td>パレットの設定。<br /><br />PaletteType.EXACT 使用中の色をすべて割り付ける<br />PaletteType.LOCALADAPTIVE ローカル(割り付け)<br />PaletteType.LOCALPERCEPTUAL ローカル(知覚)<br />PaletteType.LOCALSELECTIVE ローカル(特定)<br />PaletteType.MACOSPALETTE <a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac">Mac</a><br />PaletteType.MASTERADAPTIVE マスター(割り付け)<br />PaletteType.MASTERPERCEPTUAL マスター(知覚)<br />PaletteType.MASTERSELECTIVE マスター(特定)<br />PaletteType.PREVIOUSPALETTE 前回と同じ<br />PaletteType.UNIFORM ?<br />PaletteType.WEBPALETTE Web<br />PaletteType.WINDOWSPALETTE <a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a></td> </tr> <tr> <td>preserveExactColors</td> <td>boolean </td> <td>同一色の保持。ディザの設定が誤差拡散法の場合、カラーテーブルに含まれる色を保護するかどうか。</td> </tr> <tr> <td>transparency </td> <td>boolean </td> <td>透明箇所を維持するかどうか。</td> </tr> <tr> <td>typename </td> <td>string </td> <td>オブジェクトのクラス名。readonly。"GIFSaveOptions"</td> </tr> </table> </div> <div class="section"> <h5><a name="JPEG">JPEG</a></h5> <p>JPEGSaveOptions</p> <table> <tr> <th>プロパティ</th> <th>型</th> <th>説明</th> </tr> <tr> <td>embedColorProfile</td> <td>boolean </td> <td>カラープロファイルを埋め込むかどうか。</td> </tr> <tr> <td>formatOptions </td> <td>FormatOptions</td> <td><a class="keyword" href="http://d.hatena.ne.jp/keyword/JPEG">JPEG</a>フォーマット。<br /><br />FormatOptions.OPTIMIZEDBASELINE ベースライン(最適化)<br />FormatOptions.<a class="keyword" href="http://d.hatena.ne.jp/keyword/PROGRESSIVE">PROGRESSIVE</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%ED%A5%B0%A5%EC">プログレ</a>ッシブ<br />FormatOptions.STANDARDBASELINE ベースライン(標準)</td> </tr> <tr> <td>matte </td> <td>MatteType </td> <td>マット。透明部分(不透明度が100%でない箇所)の背景色を塗りつぶす色の設定。<br /><br />MatteType.BACKGROUND 背景色<br />MatteType.BLACK 黒<br />MatteType.FOREGROUND 描画色<br />MatteType.<a class="keyword" href="http://d.hatena.ne.jp/keyword/NETSCAPE">NETSCAPE</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%CD%A5%C3%A5%C8%A5%B9%A5%B1%A1%BC%A5%D7">ネットスケープ</a>グレー<br />MatteType.NONE なし<br />MatteType.SEMIGRAY 50%グレー<br />MatteType.WHITE 白<br /></td> </tr> <tr> <td>quality </td> <td>number </td> <td>画質。1〜12の数値。</td> </tr> <tr> <td>scans </td> <td>number </td> <td><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%ED%A5%B0%A5%EC">プログレ</a>ッシブ形式のスキャン数(完全に表示されるまでの段階の数)。3〜5の数値。</td> </tr> <tr> <td>typename </td> <td>string </td> <td>オブジェクトのクラス名。readonly。"JPEGSaveOptions"</td> </tr> </table> </div> <div class="section"> <h5><a name="PDF">PDF</a></h5> <p>PDFSaveOptions<br /> 多すぎ。プリセット作って適用するのがいいと思う。</p> <table> <tr> <th>プロパティ</th> <th>型</th> <th>説明</th> </tr> <tr> <td>alphaChannels </td> <td>boolean </td> <td>アルファチャンネルを保持するかどうか。</td> </tr> <tr> <td>annotations </td> <td>boolean </td> <td>注釈を保持するかどうか。</td> </tr> <tr> <td>colorConversion </td> <td>boolean </td> <td>カラー変換するかどうか。</td> </tr> <tr> <td>convertToEightBit </td> <td>boolean </td> <td>16bit画像を8bit画像に変換するかどうか。</td> </tr> <tr> <td>description </td> <td>string </td> <td>保存オプションの説明文。</td> </tr> <tr> <td>destinationProfile </td> <td>string </td> <td>出力先カラープロファイル。文字列で指定。</td> </tr> <tr> <td>downgradeColorProfile </td> <td>boolean </td> <td>(非推奨)</td> </tr> <tr> <td>downSample </td> <td>PDFResample </td> <td>ダウンサンプル方式。<br /><br />PDFResample.NONE なし<br />PDFResample.PDFAVERAGE ダウンサンプル(バイリニア法)<br />PDFResample.PDFBICUBIC ダウンサンプル(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%AD%A5%E5%A1%BC%A5%D3%A5%C3%A5%AF">バイキュービック</a>法)<br />PDFResample.PDFSUBSAMPLE サブサンプル(ニアレストネイバー法)</td> </tr> <tr> <td>downSampleSize </td> <td>number </td> <td>画像ダウンサンプル後の解像度。<a class="keyword" href="http://d.hatena.ne.jp/keyword/ppi">ppi</a>で指定。</td> </tr> <tr> <td>downSampleSizeLimit </td> <td>number </td> <td>画像ダウンサンプルを行う対象になる解像度(この値を超えたら適用)。<a class="keyword" href="http://d.hatena.ne.jp/keyword/ppi">ppi</a>で指定。</td> </tr> <tr> <td>embedColorProfile </td> <td>boolean </td> <td>カラープロファイルを埋め込むかどうか。</td> </tr> <tr> <td>embedFonts </td> <td>boolean </td> <td>(非推奨)</td> </tr> <tr> <td>embedThumbnail </td> <td>boolean </td> <td>サムネイルを埋め込むかどうか。</td> </tr> <tr> <td>encoding </td> <td>PDFEncoding </td> <td>画像の圧縮形式。<br /><br />PDFEncoding.<a class="keyword" href="http://d.hatena.ne.jp/keyword/JPEG">JPEG</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/JPEG">JPEG</a>(画質を数値で指定可能)<br />PDFEncoding.JPEG2000HIGH <a class="keyword" href="http://d.hatena.ne.jp/keyword/JPEG2000">JPEG2000</a>最高<br />PDFEncoding.JPEG2000LOSSLESS <a class="keyword" href="http://d.hatena.ne.jp/keyword/JPEG2000">JPEG2000</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%ED%A5%B9%A5%EC%A5%B9">ロスレス</a>?<br />PDFEncoding.JPEG2000LOW <a class="keyword" href="http://d.hatena.ne.jp/keyword/JPEG2000">JPEG2000</a>最低<br />PDFEncoding.JPEG2000MED <a class="keyword" href="http://d.hatena.ne.jp/keyword/JPEG2000">JPEG2000</a>中<br />PDFEncoding.JPEG2000MEDHIGH <a class="keyword" href="http://d.hatena.ne.jp/keyword/JPEG2000">JPEG2000</a>高<br />PDFEncoding.JPEG2000MEDLOW <a class="keyword" href="http://d.hatena.ne.jp/keyword/JPEG2000">JPEG2000</a>低<br />PDFEncoding.JPEGHIGH <a class="keyword" href="http://d.hatena.ne.jp/keyword/JPEG">JPEG</a>最高<br />PDFEncoding.JPEGLOW <a class="keyword" href="http://d.hatena.ne.jp/keyword/JPEG">JPEG</a>最低<br />PDFEncoding.JPEGMED <a class="keyword" href="http://d.hatena.ne.jp/keyword/JPEG">JPEG</a>中<br />PDFEncoding.JPEGMEDHIGH <a class="keyword" href="http://d.hatena.ne.jp/keyword/JPEG">JPEG</a>高<br />PDFEncoding.JPEGMEDLOW <a class="keyword" href="http://d.hatena.ne.jp/keyword/JPEG">JPEG</a>低<br />PDFEncoding.NONE なし<br />PDFEncoding.PDFZIP ZIP8bit<br />PDFEncoding.PDFZIP4BIT ZIP4bit</td> </tr> <tr> <td>interpolation </td> <td>boolean </td> <td>(非推奨)</td> </tr> <tr> <td>jpegQuality </td> <td>number </td> <td>画質。1〜12の数値。encodingプロパティがPDFEncoding.<a class="keyword" href="http://d.hatena.ne.jp/keyword/JPEG">JPEG</a>の時のみ有効。</td> </tr> <tr> <td>layers </td> <td>boolean </td> <td>レイヤーを保持するかどうか。</td> </tr> <tr> <td>optimizeForWeb </td> <td>boolean </td> <td>Web表示用に最適化するかどうか。</td> </tr> <tr> <td>outputCondition </td> <td>string </td> <td>PDF/Xの出力条件。</td> </tr> <tr> <td>outputConditionID </td> <td>string </td> <td>PDF/Xの出力条件ID。</td> </tr> <tr> <td>PDFCompatibility </td> <td>PDFCompatibility</td> <td>PDFの互換バージョン。<br /><br />PDFCompatibility.PDF13 1.3<br />PDFCompatibility.PDF14 1.4<br />PDFCompatibility.PDF15 1.5<br />PDFCompatibility.PDF16 1.6<br />PDFCompatibility.PDF17 1.7</td> </tr> <tr> <td>PDFStandard </td> <td>PDFStandard </td> <td>PDF/X規格。<br /><br />PDFStandard.NONE なし<br />PDFStandard.PDFX1A2001 PDF/X-1a:2001<br />PDFStandard.PDFX1A2003 PDF/X-1a:2003<br />PDFStandard.PDFX32002 PDF/X-3:2002<br />PDFStandard.PDFX32003 PDF/X-3:2003<br />PDFStandard.PDFX42008 PDF/X-4:2008</td> </tr> <tr> <td>preserveEditing </td> <td>boolean </td> <td>編集機能を保持するかどうか。</td> </tr> <tr> <td>presetFile </td> <td>string </td> <td>PDF書き出しプリセット(名前)。指定すると他のプロパティよりプリセットの設定が優先される。</td> </tr> <tr> <td>profileInclusionPolicy</td> <td>boolean </td> <td>プロファイルを埋め込むかどうか。</td> </tr> <tr> <td>registryName </td> <td>string </td> <td>PDF/Xの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EC%A5%B8%A5%B9%A5%C8%A5%EA">レジストリ</a>名。</td> </tr> <tr> <td>spotColors </td> <td>boolean </td> <td>特色を保持するかどうか。</td> </tr> <tr> <td>tileSize </td> <td>nunber </td> <td>画像の圧縮形式が<a class="keyword" href="http://d.hatena.ne.jp/keyword/JPEG2000">JPEG2000</a>の場合のタイル数。encodingプロパティがPDFEncoding.<a class="keyword" href="http://d.hatena.ne.jp/keyword/JPEG2000">JPEG2000</a>の時のみ有効。</td> </tr> <tr> <td>transparency </td> <td>boolean </td> <td>(非推奨)</td> </tr> <tr> <td>typename </td> <td>string </td> <td>オブジェクトのクラス名。readonly。"PDFSaveOptions"</td> </tr> <tr> <td>useOutlines </td> <td>boolean </td> <td>(非推奨)</td> </tr> <tr> <td>vectorData </td> <td>boolean </td> <td>(非推奨)</td> </tr> <tr> <td>view </td> <td>boolean </td> <td>保存後にPDFを表示するかどうか。</td> </tr> </table> </div> <div class="section"> <h5><a name="PSD">PSD</a></h5> <p>PhotoshopSaveOptions</p> <table> <tr> <th>プロパティ</th> <th>型</th> <th>説明</th> </tr> <tr> <td>alphaChannels </td> <td>boolean</td> <td>アルファチャンネルを保持するかどうか。</td> </tr> <tr> <td>annotations </td> <td>boolean</td> <td>注釈を保持するかどうか。</td> </tr> <tr> <td>embedColorProfile</td> <td>boolean</td> <td>カラープロファイルを埋め込むかどうか。</td> </tr> <tr> <td>layers </td> <td>boolean</td> <td>レイヤーを保持するかどうか。</td> </tr> <tr> <td>spotColors </td> <td>boolean</td> <td>特色を保持するかどうか。</td> </tr> <tr> <td>typename </td> <td>string </td> <td>オブジェクトのクラス名。readonly。"PhotoshopSaveOptions"</td> </tr> </table> </div> <div class="section"> <h5><a name="PICTFile">PICTファイル</a></h5> <p>PICTFileSaveOptions</p> <table> <tr> <th>プロパティ</th> <th>型</th> <th>説明</th> </tr> <tr> <td>alphaChannels </td> <td>boolean </td> <td>アルファチャンネルを保持するかどうか。</td> </tr> <tr> <td>compression </td> <td>PICTCompression </td> <td>圧縮形式。<br /><br />PICTCompression.JPEGHIGHPICT<br />PICTCompression.JPEGLOWPICT<br />PICTCompression.JPEGMAXIMUMPICT<br />PICTCompression.JPEGMEDIUMPICT<br />PICTCompression.NONE なし</td> </tr> <tr> <td>embedColorProfile</td> <td>boolean </td> <td>カラープロファイルを埋め込むかどうか。</td> </tr> <tr> <td>resolution </td> <td>PICTBitsPerPixels</td> <td>bit数。<br /><br />PICTBitsPerPixels.EIGHT<br />PICTBitsPerPixels.FOUR<br />PICTBitsPerPixels.SIXTEEN<br />PICTBitsPerPixels.THIRTYTWO<br />PICTBitsPerPixels.TWO</td> </tr> <tr> <td>typename </td> <td>string </td> <td>オブジェクトのクラス名。readonly。"PICTFileSaveOptions"</td> </tr> </table> </div> <div class="section"> <h5><a name="PICTResource">PICTリソース</a></h5> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Photoshop">Photoshop</a>では読み込み専用(書き出せない)。<br /> PICTResourceSaveOptions</p> <table> <tr> <th>プロパティ</th> <th>型</th> <th>説明</th> </tr> <tr> <td>alphaChannels </td> <td>boolean </td> <td>アルファチャンネルを保持するかどうか。</td> </tr> <tr> <td>compression </td> <td>PICTCompression </td> <td>圧縮形式。<br /><br />PICTCompression.JPEGHIGHPICT<br />PICTCompression.JPEGLOWPICT<br />PICTCompression.JPEGMAXIMUMPICT<br />PICTCompression.JPEGMEDIUMPICT<br />PICTCompression.NONE なし</td> </tr> <tr> <td>embedColorProfile</td> <td>boolean </td> <td>カラープロファイルを埋め込むかどうか。</td> </tr> <tr> <td>name </td> <td>string </td> <td>PICTリソースの名前。</td> </tr> <tr> <td>resolution </td> <td>PICTBitsPerPixels</td> <td>bit数。<br /><br />PICTBitsPerPixels.EIGHT<br />PICTBitsPerPixels.FOUR<br />PICTBitsPerPixels.SIXTEEN<br />PICTBitsPerPixels.THIRTYTWO<br />PICTBitsPerPixels.TWO</td> </tr> <tr> <td>resourceID </td> <td>number </td> <td>PICTリソースのID。</td> </tr> <tr> <td>typename </td> <td>string </td> <td>オブジェクトのクラス名。readonly。"PICTResourceSaveOptions"</td> </tr> </table> </div> <div class="section"> <h5><a name="PXR">PXR</a></h5> <p>PixarSaveOptions</p> <table> <tr> <th>プロパティ</th> <th>型</th> <th>説明</th> </tr> <tr> <td>alphaChannels</td> <td>boolean</td> <td>アルファチャンネルを保持するかどうか。</td> </tr> <tr> <td>typename </td> <td>string </td> <td>オブジェクトのクラス名。readonly。"PixarSaveOptions"</td> </tr> </table> </div> <div class="section"> <h5><a name="PNG">PNG</a></h5> <p>PNGSaveOptions</p> <table> <tr> <th>プロパティ</th> <th>型</th> <th>説明</th> </tr> <tr> <td>compression</td> <td>number </td> <td>圧縮設定。0〜9の数値? デフォルトは0</td> </tr> <tr> <td>interlaced </td> <td>boolean</td> <td><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%BF%A1%BC%A5%EC%A1%BC%A5%B9">インターレース</a>を有効にするかどうか。</td> </tr> <tr> <td>typename </td> <td>string </td> <td>オブジェクトのクラス名。readonly。"PNGSaveOptions"</td> </tr> </table> </div> <div class="section"> <h5><a name="RAW">RAW</a></h5> <p>RawSaveOptions</p> <table> <tr> <th>プロパティ</th> <th>型</th> <th>説明</th> </tr> <tr> <td>alphaChannels</td> <td>boolean</td> <td>アルファチャンネルを保持するかどうか。</td> </tr> <tr> <td>spotColors </td> <td>boolean</td> <td>特色を保持するかどうか。</td> </tr> <tr> <td>typename </td> <td>string </td> <td>オブジェクトのクラス名。readonly。"RawSaveOptions"</td> </tr> </table> </div> <div class="section"> <h5><a name="SGIRGB">SGIRGB</a></h5> <p>標準ではインストールされない形式らしい(知らない)。<br /> SGIRGBSaveOptions</p> <table> <tr> <th>プロパティ</th> <th>型</th> <th>説明</th> </tr> <tr> <td>alphaChannels</td> <td>boolean</td> <td>アルファチャンネルを保持するかどうか。</td> </tr> <tr> <td>spotColors </td> <td>boolean</td> <td>特色を保持するかどうか。</td> </tr> <tr> <td>typename </td> <td>string </td> <td>オブジェクトのクラス名。readonly。"SGIRGBSaveOptions"</td> </tr> </table> </div> <div class="section"> <h5><a name="TGA">TGA(Targa)</a></h5> <p>TargaSaveOptions</p> <table> <tr> <th>プロパティ</th> <th>型</th> <th>説明</th> </tr> <tr> <td>alphaChannels </td> <td>boolean </td> <td>アルファチャンネルを保持するかどうか。</td> </tr> <tr> <td>resolution </td> <td>TargaBitsPerPixels</td> <td>色数。<br /><br />TargaBitsPerPixels.SIXTEEN 16bit<br />TargaBitsPerPixels.TWENTYFOUR 24bit<br />TargaBitsPerPixels.THIRTYTWO 32bit</td> </tr> <tr> <td>rleCompression</td> <td>boolean </td> <td>RLE圧縮するかどうか。</td> </tr> <tr> <td>typename </td> <td>string </td> <td>オブジェクトのクラス名。readonly。"TargaSaveOptions"</td> </tr> </table> </div> <div class="section"> <h5><a name="TIFF">TIFF</a></h5> <p>TiffSaveOptions</p> <table> <tr> <th>プロパティ</th> <th>型</th> <th>説明</th> </tr> <tr> <td>alphaChannels </td> <td>boolean </td> <td>アルファチャンネルを保持するかどうか。</td> </tr> <tr> <td>annotations </td> <td>boolean </td> <td>注釈を保持するかどうか。</td> </tr> <tr> <td>byteOrder </td> <td>ByteOrder </td> <td>バイト順序。<br /><br />ByteOrder.<a class="keyword" href="http://d.hatena.ne.jp/keyword/IBM">IBM</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/IBM%20PC">IBM PC</a><br />ByteOrder.MACOS <a class="keyword" href="http://d.hatena.ne.jp/keyword/Macintosh">Macintosh</a></td> </tr> <tr> <td>embedColorProfile </td> <td>boolean </td> <td>カラープロファイルを埋め込むかどうか。</td> </tr> <tr> <td>imageCompression </td> <td>TIFFEncoding </td> <td>圧縮形式。<br /><br />TIFFEncoding.<a class="keyword" href="http://d.hatena.ne.jp/keyword/JPEG">JPEG</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/JPEG">JPEG</a><br />TIFFEncoding.NONE なし<br />TIFFEncoding.TIFFLZW LZW<br />TIFFEncoding.TIFFZIP ZIP</td> </tr> <tr> <td>interleaveChannels</td> <td>boolean </td> <td><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D4%A5%AF%A5%BB%A5%EB">ピクセル</a>の順序。trueでインターリーブになる。</td> </tr> <tr> <td>jpegQuality </td> <td>number </td> <td>画質。1〜12の数値。encodingプロパティがPDFEncoding.<a class="keyword" href="http://d.hatena.ne.jp/keyword/JPEG">JPEG</a>の時のみ有効。</td> </tr> <tr> <td>layerCompression </td> <td>LayerCompression</td> <td>レイヤーの圧縮形式。layersプロパティがtrueの時のみ有効。<br /><br />LayerCompression.RLE RLE圧縮<br />LayerCompression.ZIP ZIP圧縮</td> </tr> <tr> <td>layers </td> <td>boolean </td> <td>レイヤーを保持するかどうか。</td> </tr> <tr> <td>saveImagePyramid </td> <td>boolean </td> <td>画像ピラミッドを保存するかどうか。</td> </tr> <tr> <td>spotColors </td> <td>boolean </td> <td>特色を保持するかどうか。</td> </tr> <tr> <td>transparency </td> <td>boolean </td> <td>透明部分を保持するかどうか。</td> </tr> <tr> <td>typename </td> <td>string </td> <td>オブジェクトのクラス名。readonly。"TiffSaveOptions"</td> </tr> </table><p><hr /></p><p>以上!! つかれたー!!!!</p> </div> </div> chalcedony_htn parseIntとparseFloatの覚え書き hatenablog://entry/17680117126976451601 2014-07-22T20:49:57+09:00 2019-02-22T17:00:15+09:00 前フリが思いつかない件について。 この記事の主旨は一言で言うと「parseIntには第2引数で基数を指定しよう」です。 基本 parseIntとparseFloatは、どちらも引数として渡された文字列をパースして数値に変換するグローバル関数。 parseIntは整数、parseFloatは小数と整数の両方(浮動小数点数)を扱える。 parseInt("100") // 100 parseInt("3.14") // 3 parseFloat("100") // 100 parseFloat("3.14") // 3.14 パース方法とNaN parseIntとparseFloatは、どちらも引… <p>前フリが思いつかない件について。<br /> この記事の主旨は一言で言うと「parseIntには第2引数で基数を指定しよう」です。</p> <div class="section"> <h4>基本</h4> <p>parseIntとparseFloatは、どちらも引数として渡された文字列をパースして数値に変換するグローバル関数。<br /> parseIntは整数、parseFloatは小数と整数の両方(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C9%E2%C6%B0%BE%AE%BF%F4%C5%C0%BF%F4">浮動小数点数</a>)を扱える。</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink>parseInt(<span class="synConstant">&quot;100&quot;</span>) <span class="synComment">// 100</span> parseInt(<span class="synConstant">&quot;3.14&quot;</span>) <span class="synComment">// 3</span> parseFloat(<span class="synConstant">&quot;100&quot;</span>) <span class="synComment">// 100</span> parseFloat(<span class="synConstant">&quot;3.14&quot;</span>) <span class="synComment">// 3.14</span> </pre> </div> <div class="section"> <h4>パース方法とNaN</h4> <p>parseIntとparseFloatは、どちらも引数の文字列を先頭から1文字ずつ確認し、数値と解釈できない文字が見つかった時点で、その直前までの部分を数値として返す。<br /> 一文字も数値にできなかった場合はNaN(数値ではないことを表す数値型の値)を返す。</p><p>わかりにくいので例を。</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink>parseInt(<span class="synConstant">&quot;100pt&quot;</span>) <span class="synComment">// 100</span> parseInt(<span class="synConstant">&quot;-3.14pt&quot;</span>) <span class="synComment">// -3</span> parseInt(<span class="synConstant">&quot;314e-2&quot;</span>) <span class="synComment">// 314</span> parseInt(<span class="synConstant">&quot;hoge123&quot;</span>) <span class="synComment">// NaN</span> parseFloat(<span class="synConstant">&quot;100pt&quot;</span>) <span class="synComment">// 100</span> parseFloat(<span class="synConstant">&quot;-3.14pt&quot;</span>) <span class="synComment">// -3.14</span> parseFloat(<span class="synConstant">&quot;314e-2&quot;</span>) <span class="synComment">// 3.14</span> parseFloat(<span class="synConstant">&quot;hoge123&quot;</span>) <span class="synComment">// NaN</span> </pre><p>parseFloatが数値と解釈できるのは、正負符号(+/-)、0〜9の数字、小数点、指数(e)。<br /> parseIntはそこから小数点を除いたもの……ではなくて、実はもうちょっと複雑。</p> </div> <div class="section"> <h4>parseIntの第2引数(基数)</h4> <p>parseIntの引数として、パースしたい文字列のほかに、「<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B2%BF%BF%CA">何進</a>数として解釈するか」という基数を渡すことができる。<br /> 基数は文字列でなくて数値で渡すことに注意。</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink>parseInt(<span class="synConstant">&quot;15&quot;</span>, 10) <span class="synComment">// 15</span> parseInt(<span class="synConstant">&quot;15&quot;</span>, 8) <span class="synComment">// 13</span> parseInt(<span class="synConstant">&quot;15&quot;</span>, 16) <span class="synComment">// 21</span> </pre><p>同じ"15"という文字列を、10進数、8進数、16進数でパースした値が返ってくる。</p><p>基数の指定によって、数として解釈できる文字は変わってくる。ちょっと複雑と言ったのはこのこと。</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink>parseInt(<span class="synConstant">&quot;19e&quot;</span>, 10) <span class="synComment">// 19(&quot;e&quot;はパース不可)</span> parseInt(<span class="synConstant">&quot;19e&quot;</span>, 8) <span class="synComment">// 1 (&quot;9e&quot;はパース不可)</span> parseInt(<span class="synConstant">&quot;19e&quot;</span>, 16) <span class="synComment">// 414</span> </pre><p>基数を省略した場合、<strong>通常は</strong>10進数でパースされる。のだけど、省略するとけっこう危険だったりする。</p> </div> <div class="section"> <h4>基数を省略した場合</h4> <p>もしくは、基数に0を指定した場合、自動的に以下のように解釈されることが多い。</p> <ul> <li>"0x"または"0X"で始まる文字列が渡された場合、基数は16(16進数)と解釈される。</li> <li>"0"で始まる文字列が渡された場合、基数は8(8進数)と解釈される。</li> <li>その他の文字で始まる文字列が渡された場合、基数は10(10進数)と解釈される。</li> </ul><pre class="code lang-javascript" data-lang="javascript" data-unlink>parseInt(<span class="synConstant">&quot;0x15&quot;</span>) <span class="synComment">// 21(16進数として解釈)</span> parseInt(<span class="synConstant">&quot;015&quot;</span>) <span class="synComment">// 13(8進数として解釈)※実装による</span> parseInt(<span class="synConstant">&quot;15&quot;</span>) <span class="synComment">// 15(10進数として解釈)</span> </pre><p><br /> 16進数はともかく、この8進数がなかなか厄介で……</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink>parseInt(<span class="synConstant">&quot;015&quot;</span>) <span class="synComment">// 13(8進数)※実装による</span> parseInt(<span class="synConstant">&quot;019&quot;</span>) <span class="synComment">// 1 (8進数、&quot;9&quot;はパース不可)※実装による</span> parseInt(<span class="synConstant">&quot;08&quot;</span>) <span class="synComment">// 8 (8進数だとNaNになるので10進数で解釈)※実装による</span> </pre><p><br /> あるでしょう、ノンブルとかで先頭をゼロで埋めてるやつ。<br /> それをうっかりparseInt(textframe.contents)なんてやってしまうと、ページによって変な数値が返ってくる可能性があるということ。</p> </div> <div class="section"> <h4>余談</h4> <p>先頭の文字列が"0x"なら16進数、というのは、<a class="keyword" href="http://d.hatena.ne.jp/keyword/JavaScript">JavaScript</a>(というか、<a class="keyword" href="http://d.hatena.ne.jp/keyword/ECMAScript">ECMAScript</a>)の仕様として規定されている。しかし実は先頭が"0"の場合は、「8進数にしてもいいよ(どっちかいうと10進数でやってね)」ということになっていた。<br /> 実装では8進数を採用したものが多いけど、確実ではないらしい。つまり実行する環境によって結果がまちまちということ。さっきから※実装によるって書いてるのはそういうことです。</p><p>いちおう現在の最新の仕様では、"0x"と"0X"を16進数とするのを除けばデフォルトは10進数、と定められている。けど実装のほうは今のところほとんど追いついてないらしい。<a class="keyword" href="http://d.hatena.ne.jp/keyword/Adobe">Adobe</a>のESTKでも8進数になるしね。</p> </div> <div class="section"> <h4>というわけで、この記事の主旨</h4> <p><br /> 「<strong>parseIntには第2引数で基数を指定しよう</strong>」</p><br /> <p>大事なことなので2回いいました。ちなみにparseFloatは常に10進数で、基数指定はできません。</p> </div> chalcedony_htn JavaScriptのArray.sort覚え書き hatenablog://entry/17680117126976451681 2014-05-07T18:01:45+09:00 2019-02-22T17:00:17+09:00 お蔵出しシリーズ3。いつだか忘れたけど昔書いて、2013年5月にリライトしたらしいものをほぼそのまま。どうでもいいけどこのシリーズ、タイトルを統一しようとする気持ちがまったく見受けられませんね。 基本 array.sort(比較関数); 配列arrayの要素を、比較関数(省略可)に基づいて並べ替える。並べ替えは破壊的に行われる、つまり配列array自体が並べ替えられて、元の順番は保存されない。 比較関数を省略した場合 配列arrayの各要素を文字列として比較し、辞書順に並べ替える。たとえば以下のように処理される。 var array = [10,9,5,15,60]; array.sort()… <p>お蔵出しシリーズ3。いつだか忘れたけど昔書いて、2013年5月にリライトしたらしいものをほぼそのまま。どうでもいいけどこのシリーズ、タイトルを統一しようとする気持ちがまったく見受けられませんね。</p> <div class="section"> <h4>基本</h4> <pre class="code lang-javascript" data-lang="javascript" data-unlink> array.sort(比較関数); </pre><p>配列arrayの要素を、比較関数(省略可)に基づいて並べ替える。並べ替えは<strong>破壊的に行われる</strong>、つまり配列array自体が並べ替えられて、元の順番は保存されない。</p> </div> <div class="section"> <h4>比較関数を省略した場合</h4> <p>配列arrayの各要素を<strong>文字列として比較</strong>し、辞書順に並べ替える。</p><p>たとえば以下のように処理される。</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synIdentifier">var</span> array = <span class="synIdentifier">[</span>10,9,5,15,60<span class="synIdentifier">]</span>; array.sort(); <span class="synStatement">alert</span>(array); <span class="synComment">// [10,15,5,60,9] ←数値順ではない</span> <span class="synStatement">alert</span>(<span class="synStatement">typeof</span> array<span class="synIdentifier">[</span>0<span class="synIdentifier">]</span>); <span class="synComment">// number ←要素としてはnumberのまま</span> </pre><p>数値順に並べ替えたい場合、あるいはもっと複雑な比較を行って並べ替えたい場合は、比較関数の指定が必要。</p> </div> <div class="section"> <h4>比較関数</h4> <p>比較関数には2つの要素が引数として渡され、戻り値に応じてその要素の順序が入れ替えられる。仮に比較関数の第一引数をa、第二引数をbとしたとき、</p> <table> <tr> <td>戻り値 < 0</td> <td>aが前に来るように並べ替えられる</td> </tr> <tr> <td>戻り値 == 0</td> <td>保証なし(順序を入れ替えないことになっている)</td> </tr> <tr> <td>戻り値 > 0</td> <td>bが前に来るように並べ替えられる</td> </tr> </table><p>という処理が行われる。</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synIdentifier">function</span> compare(a, b)<span class="synIdentifier">{</span> <span class="synStatement">if</span>(aがbより小) <span class="synIdentifier">{</span> <span class="synStatement">return</span> -1; <span class="synComment">// 負の数であればなんでもいい</span> <span class="synIdentifier">}</span> <span class="synStatement">if</span>(aがbより大) <span class="synIdentifier">{</span> <span class="synStatement">return</span> 1; <span class="synComment">// 正の数であればなんでもいい</span> <span class="synIdentifier">}</span> <span class="synStatement">return</span> 0; <span class="synIdentifier">}</span> array.sort(compare); </pre><p>compareを別に定義せず、sortメソッド実行時に指定してもよい。無名関数でもOK。</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink>array.sort(<span class="synIdentifier">function</span>(a, b)<span class="synIdentifier">{</span> <span class="synStatement">if</span>(aがbより小) <span class="synIdentifier">{</span> <span class="synStatement">return</span> -1; <span class="synIdentifier">}</span> <span class="synComment">// 負</span> <span class="synStatement">if</span>(aがbより大) <span class="synIdentifier">{</span> <span class="synStatement">return</span> 1; <span class="synIdentifier">}</span> <span class="synComment">// 正</span> <span class="synStatement">return</span> 0; <span class="synIdentifier">}</span>); </pre><p>要するに、「こういう基準で要素を並べ替えてね」というのをsortメソッドに教えるためのもの。<br /> <br /> </p> <div class="section"> <h5>例:数値の配列を数値として小さい順に並べ替えたいとき</h5> <pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synIdentifier">var</span> array = <span class="synIdentifier">[</span>10,9,5,15,60<span class="synIdentifier">]</span>; array.sort(<span class="synIdentifier">function</span>(a, b)<span class="synIdentifier">{</span> <span class="synStatement">return</span> a - b; <span class="synIdentifier">}</span>); <span class="synStatement">alert</span>(array); <span class="synComment">// [5,9,10,15,60] ←数値順</span> </pre><p>aとbどちらも数値であれば減算できる。aがbより小さければ式「a - b」の結果は負の数になるので、そのまま戻り値にしている。<br /> <br /> </p> </div> <div class="section"> <h5>例:オブジェクトの配列を、各オブジェクトのプロパティ「<a class="keyword" href="http://d.hatena.ne.jp/keyword/value">value</a>」の値が大きい順に並べ替えたいとき</h5> <pre class="code lang-javascript" data-lang="javascript" data-unlink>array.sort(<span class="synIdentifier">function</span>(a, b)<span class="synIdentifier">{</span> <span class="synStatement">if</span>(a.value &gt; b.value) <span class="synIdentifier">{</span> <span class="synStatement">return</span> -1; <span class="synIdentifier">}</span> <span class="synComment">// a.valueが大きければ負</span> <span class="synStatement">if</span>(a.value &lt; b.value) <span class="synIdentifier">{</span> <span class="synStatement">return</span> 1; <span class="synIdentifier">}</span> <span class="synComment">// a.valueが小さければ正</span> <span class="synStatement">return</span> 0; <span class="synIdentifier">}</span>); </pre> </div> </div> <div class="section"> <h4>これだけ覚えろ</h4> <p><br /> 「<strong>aをbより<span class="deco" style="color:#FF0000;">前</span>に置きたいときは戻り値を<span class="deco" style="color:#FF0000;">負</span>にする</strong>」</p> </div> chalcedony_htn JavaScriptのループ文まとめ hatenablog://entry/17680117126976451767 2014-04-07T20:21:18+09:00 2019-02-22T17:00:19+09:00 お蔵出しシリーズ2。2008年2月に書いたらしいものに加筆したら原型がなくなりました。 ループ文とは 通常は上から下に処理が進んでいくプログラムを、一定条件に当てはまるあいだだけ繰り返し処理する制御文。 for文 初期値、条件、増減式を設定して、条件が真であるあいだ、一定の処理を繰り返す命令。 正確に言うと条件が偽になったら処理をしないでループを抜ける、ってことになる。 ループ用の変数に初期値(数値)を代入して、それを増減してループ回数を制御する。なので、主にループ回数が開始前に設定できる場合に使う。 for( 式1 ; 式2 ; 式3 ) { 繰り返したい処理 } 式1 初期値を設定する式。… <p>お蔵出しシリーズ2。2008年2月に書いたらしいものに加筆したら原型がなくなりました。</p> <div class="section"> <h4>ループ文とは</h4> <p>通常は上から下に処理が進んでいくプログラムを、一定条件に当てはまるあいだだけ繰り返し処理する制御文。</p> </div> <div class="section"> <h4>for文</h4> <p>初期値、条件、増減式を設定して、条件が真であるあいだ、一定の処理を繰り返す命令。<br /> 正確に言うと条件が偽になったら処理をしないでループを抜ける、ってことになる。</p><br /> <p>ループ用の変数に初期値(数値)を代入して、それを増減してループ回数を制御する。なので、主にループ回数が開始前に設定できる場合に使う。</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synStatement">for</span>( 式1 ; 式2 ; 式3 ) <span class="synIdentifier">{</span> 繰り返したい処理 <span class="synIdentifier">}</span> </pre> <dl> <dt>式1</dt> <dd>初期値を設定する式。<strong>ループ開始前に一度だけ</strong>評価される。</dd> <dt>式2</dt> <dd>条件式。<strong>毎回のループの最初</strong>に評価され、もしも偽(false)だったら{}内の処理を行わずにループを抜ける。</dd> <dt>式3</dt> <dd>ループ用の変数の値を増減する式。後処理。<strong>毎回のループの最後</strong>に評価される。式2が偽になった場合はその時点でループを抜けてしまうので、この式は実行されない。</dd> </dl><p><br /> ちなみに、式1と式3には複数の式を書くことができる。その場合は式をカンマ , で区切ること。<a href="#f-073364e8" name="fn-073364e8" title="正確に言うと、式1〜式3のそれぞれが式であればいいので、複数の式をカンマ演算子でつないで一つの式にしているというだけ。式2も同じことができるけど、評価後の値によって分岐するので順番が大事になる。ループ毎に処理したいものは素直に式3に書いたほうがいい。">*1</a><br /> 例えば「配列arrの要素を順番にすべて書き出す」みたいな処理をしたい場合、</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synIdentifier">var</span> arr = <span class="synIdentifier">[</span>10, 20, 30, 40<span class="synIdentifier">]</span>; <span class="synStatement">for</span>( <span class="synIdentifier">var</span> i = 0 ; i &lt; arr.length ; i++ ) <span class="synIdentifier">{</span> <span class="synStatement">alert</span>( arr<span class="synIdentifier">[</span>i<span class="synIdentifier">]</span> ); <span class="synIdentifier">}</span> <span class="synComment">// 結果:「10」「20」「30」「40」</span> </pre><p>って書いてもいいんだけど、これだと式2にあたる「 i < arr.length 」の評価時にいちいち配列の要<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C1%C7%BF%F4">素数</a>を調べることになる。</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synIdentifier">var</span> arr = <span class="synIdentifier">[</span>10, 20, 30, 40<span class="synIdentifier">]</span>; <span class="synStatement">for</span>( <span class="synIdentifier">var</span> i = 0 , arr_len = arr.length ; i &lt; arr_len ; i++ ) <span class="synIdentifier">{</span> <span class="synStatement">alert</span>( arr<span class="synIdentifier">[</span>i<span class="synIdentifier">]</span> ); <span class="synIdentifier">}</span> <span class="synComment">// 結果:「10」「20」「30」「40」</span> </pre><p>こうすれば、要<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C1%C7%BF%F4">素数</a>を調べる処理はループ開始前の一回だけで済む。ループ回数が最初に固定できる場合は、採用すると処理が早くなるかも。</p> </div> <div class="section"> <h4>while 文</h4> <p>条件を設定し、それが真である間、一定の処理を繰り返す命令。</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synStatement">while</span>( 条件式 ) <span class="synIdentifier">{</span> 繰り返したい処理 <span class="synIdentifier">}</span> </pre><p>初期値の設定や後処理がないので、ループ内で条件を変更するか、break(後述)とかでループを抜ける必要がある。でないと無限ループになる。</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synStatement">while</span>(<span class="synConstant">true</span>) <span class="synIdentifier">{</span> breakがなければ無限ループされる処理 <span class="synIdentifier">}</span> </pre><p><br /> forのところで書いた「配列arrの要素を順番にすべて書き出す」処理をwhile文でやる場合、</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synIdentifier">var</span> arr = <span class="synIdentifier">[</span>10, 20, 30, 40<span class="synIdentifier">]</span>; <span class="synIdentifier">var</span> i = 0, arr_len = arr.length; <span class="synStatement">while</span>( i &lt; arr_len ) <span class="synIdentifier">{</span> <span class="synStatement">alert</span>( arr<span class="synIdentifier">[</span>i<span class="synIdentifier">]</span> ); i++; <span class="synIdentifier">}</span> <span class="synComment">// 結果:「10」「20」「30」「40」</span> </pre><p>って書くと、for文とまったく同じことができる。</p><br /> <p>もうちょっと抽象化すると、</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synStatement">for</span>( 式1 ; 式2 ; 式3 ) <span class="synIdentifier">{</span> 繰り返したい処理 <span class="synIdentifier">}</span> </pre><p>と</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink>式1; <span class="synStatement">while</span>( 式2 ) <span class="synIdentifier">{</span> 繰り返したい処理 式3; <span class="synIdentifier">}</span> </pre><p>が同じということ。<br /> でもwhileでこれをやるくらいなら素直にfor使えばいいと思う。</p><br /> <p>whileの場合、たとえばarrを破壊してしまってもいいなら以下のようなことができる。</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synIdentifier">var</span> arr = <span class="synIdentifier">[</span>10, 20, 30, 40<span class="synIdentifier">]</span>; <span class="synStatement">while</span>( arr.length ) <span class="synIdentifier">{</span> <span class="synStatement">alert</span>( arr.shift() ); <span class="synIdentifier">}</span> <span class="synComment">// 結果:「10」「20」「30」「40」</span> </pre><p>Array.shift()は配列から最初の要素を取り除き、その要素を返す。<br /> ループのたびに配列arrから要素がひとつずつ減っていって、要素がなくなったら次のループ開始時には条件式「 arr.length 」が0(真偽値に変換するとfalse)になるので、ループを抜ける。<br /> 複数行にわたる文字列を取得して、一行ずつ最後まで処理したい場合なんかに使える。</p> </div> <div class="section"> <h4>do-while 文</h4> <p>while文と似てるけど、これは一度は必ず一定の処理を行い、その後、条件が真のあいだだけ同じ処理を繰り返す場合に使う命令。</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synStatement">do</span> <span class="synIdentifier">{</span> 一度は必ず行うけど、もしかしたら繰り返したいかもしれない処理 <span class="synIdentifier">}</span> <span class="synStatement">while</span>( 条件式 ) </pre><p>for文やwhile文の場合、条件式が最初からfalseだったらその時点でループを抜けてしまうので、{}内の処理は一度も行われない。<br /> do-while文では、条件式は{}内の処理が行われた後に評価される。なので条件式の結果がどうであっても、とりあえず一度は必ず処理が行われる。</p><p>つっても、今までこれ使う機会は一度もなかったんだが……</p> </div> <div class="section"> <h4>break文、continue文</h4> <p>ループの途中で処理の流れを中断したい場合に使う命令文。<br /> breakの場合は<strong>処理を中断し、直ちにループを抜け</strong>、次の処理に移る。</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synStatement">for</span>( <span class="synIdentifier">var</span> i = 0 ; i &lt; 10 ; i++ ) <span class="synIdentifier">{</span> <span class="synStatement">if</span>( i==5 ) <span class="synIdentifier">{</span> <span class="synStatement">break</span>; <span class="synComment">// forループを脱出</span> <span class="synStatement">alert</span>( <span class="synConstant">&quot;ここは処理されない&quot;</span> ); <span class="synIdentifier">}</span> <span class="synStatement">alert</span>( <span class="synConstant">&quot;i = &quot;</span> + i ); <span class="synIdentifier">}</span> <span class="synStatement">alert</span>( <span class="synConstant">&quot;ループ外 i = &quot;</span> + i ); <span class="synComment">// 結果:「i = 0」「i = 1」「i = 2」「i = 3」「i = 4」「ループ外 i = 5」</span> </pre><p>breakでループを抜けた場合、ループ終了時の処理(「i++」の部分)は行われていない。</p><p>continueの場合は、直ちに<strong>その回のループ終了処理を行う</strong>。</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synStatement">for</span>( <span class="synIdentifier">var</span> i=0 ; i&lt;10 ; i++ ) <span class="synIdentifier">{</span> <span class="synStatement">if</span>( i==5 ) <span class="synIdentifier">{</span> <span class="synStatement">continue</span>; <span class="synComment">// ループ1回分をここで終了する</span> <span class="synStatement">alert</span>( <span class="synConstant">&quot;ここは処理されない&quot;</span> ); <span class="synIdentifier">}</span> <span class="synStatement">alert</span> ( <span class="synConstant">&quot;i = &quot;</span> + i ); <span class="synIdentifier">}</span> <span class="synStatement">alert</span>( <span class="synConstant">&quot;ループ外 i = &quot;</span> + i ); <span class="synComment">// 結果:「i = 0」「i = 1」「i = 2」「i = 3」「i = 4」「i = 6」「i = 7」「i = 8」「i = 9」「ループ外 i = 10」</span> </pre><p>while文の場合は、条件の変更前にcontinueを置いてしまうと無限ループになるので注意。</p> </div> <div class="section"> <h4>for-in文</h4> <p>for-in文はfor文から派生した構文。<br /> 配列の各要素……というか、オブジェクトの各プロパティにアクセスして、同じ処理を繰り返す場合に使う。</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synIdentifier">var</span> arr = <span class="synIdentifier">[</span>10, 20, 30, 40<span class="synIdentifier">]</span>; <span class="synStatement">for</span>( <span class="synIdentifier">var</span> i <span class="synStatement">in</span> arr ) <span class="synIdentifier">{</span> <span class="synStatement">alert</span>( arr<span class="synIdentifier">[</span>i<span class="synIdentifier">]</span> ); <span class="synIdentifier">}</span> <span class="synComment">// 結果:「10」「20」「30」「40」すべての要素を列挙</span> </pre><p>ちなみに i にはオブジェクトの<strong>プロパティ名(文字列)</strong>が入る。</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synIdentifier">var</span> arr = <span class="synIdentifier">[</span>10, 20, 30, 40<span class="synIdentifier">]</span>; <span class="synStatement">for</span>( <span class="synIdentifier">var</span> i <span class="synStatement">in</span> arr ) <span class="synIdentifier">{</span> <span class="synStatement">alert</span>( i + <span class="synConstant">&quot; : &quot;</span> + <span class="synStatement">typeof</span> i ); <span class="synIdentifier">}</span> <span class="synComment">// 結果:「0 : string」「1 : string」「2 : string」「3 : string」</span> </pre><p>数値に見えるけど文字列。</p><br /> <p>例は配列で書いたけど、実はfor-inは配列に使わないほうがいい。<br /> 以下は理由。わからなければ「使っちゃいけないのねフーン」でいいと思う(よくないけど)。</p><br /> <p>for-in構文は「オブジェクトのプロパティ」にアクセスするので、例えば他のところでArrayオブジェクトが拡張された場合、そのプロパティまで列挙してしまう。</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synType">Array</span>.prototype.hoge = <span class="synIdentifier">function</span>()<span class="synIdentifier">{</span> <span class="synStatement">alert</span>(<span class="synConstant">&quot;ほげー&quot;</span>); <span class="synIdentifier">}</span>; <span class="synComment">// Arrayオブジェクトを拡張</span> <span class="synIdentifier">var</span> arr = <span class="synIdentifier">[</span>10, 20, 30, 40<span class="synIdentifier">]</span>; <span class="synStatement">for</span>( <span class="synIdentifier">var</span> i <span class="synStatement">in</span> arr ) <span class="synIdentifier">{</span> <span class="synStatement">alert</span>( arr<span class="synIdentifier">[</span>i<span class="synIdentifier">]</span> ); <span class="synIdentifier">}</span> <span class="synComment">// 結果:「10」「20」「30」「40」「function(){ alert(&quot;ほげー&quot;); }」最後のはhogeの中身が見えてる</span> </pre><p>オブジェクト(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>)自身が持っているプロパティだけを列挙したいときは、都度hasOwnProperty()で判定すればOK。</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synType">Array</span>.prototype.hoge = <span class="synIdentifier">function</span>()<span class="synIdentifier">{</span> <span class="synStatement">alert</span>(<span class="synConstant">&quot;ほげー&quot;</span>); <span class="synIdentifier">}</span>; <span class="synComment">// Arrayオブジェクトを拡張</span> <span class="synIdentifier">var</span> arr = <span class="synIdentifier">[</span>10, 20, 30, 40<span class="synIdentifier">]</span>; <span class="synStatement">for</span>( <span class="synIdentifier">var</span> i <span class="synStatement">in</span> arr ) <span class="synIdentifier">{</span> <span class="synStatement">if</span>(arr.hasOwnProperty(i))<span class="synIdentifier">{</span> <span class="synStatement">alert</span>( arr<span class="synIdentifier">[</span>i<span class="synIdentifier">]</span> ); <span class="synIdentifier">}</span> <span class="synIdentifier">}</span> <span class="synComment">// 結果:「10」「20」「30」「40」hogeはarrが持っているプロパティじゃないのではじかれる</span> </pre><pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synIdentifier">var</span> arr = <span class="synIdentifier">[</span>10, 20, 30, 40<span class="synIdentifier">]</span>; arr.hoge = <span class="synIdentifier">function</span>()<span class="synIdentifier">{</span> <span class="synStatement">alert</span>(<span class="synConstant">&quot;ほげー&quot;</span>); <span class="synIdentifier">}</span>; <span class="synComment">// arrに対してhogeメソッドを追加</span> <span class="synStatement">for</span>( <span class="synIdentifier">var</span> i <span class="synStatement">in</span> arr ) <span class="synIdentifier">{</span> <span class="synStatement">if</span>(arr.hasOwnProperty(i))<span class="synIdentifier">{</span> <span class="synStatement">alert</span>( arr<span class="synIdentifier">[</span>i<span class="synIdentifier">]</span> ); <span class="synIdentifier">}</span> <span class="synIdentifier">}</span> <span class="synComment">// 結果:「10」「20」「30」「40」「function(){ alert(&quot;ほげー&quot;); }」hogeも列挙される</span> </pre><p></p><p>for-inのループはプロパティを定義した順番で行われる(正確には、プロパティに値を代入した順番)。<br /> また、プロパティの値が定義されていないものは無視される。</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synIdentifier">var</span> obj = <span class="synStatement">new</span> <span class="synType">Object</span>; obj.age; <span class="synComment">// 宣言だけはしたけど未定義(undefined)</span> obj.name = <span class="synConstant">&quot;権兵衛&quot;</span>; obj.age = <span class="synConstant">&quot;20&quot;</span>; <span class="synComment">// ここで値を代入</span> obj.addr = <span class="synConstant">&quot;ちば&quot;</span>; obj.hobby; <span class="synComment">// 宣言だけはしたけど未定義(undefined)</span> <span class="synStatement">for</span>( <span class="synIdentifier">var</span> i <span class="synStatement">in</span> obj ) <span class="synIdentifier">{</span> <span class="synStatement">alert</span>( i + <span class="synConstant">&quot; : &quot;</span> + obj<span class="synIdentifier">[</span>i<span class="synIdentifier">]</span>); <span class="synIdentifier">}</span> <span class="synComment">// 結果:「name : 権兵衛」「age : 20」「addr : ちば」hobbyは出てこない</span> </pre><p><br /> 疲れたのでこの辺で切り上げ。</p> </div><div class="footnote"> <p class="footnote"><a href="#fn-073364e8" name="f-073364e8" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">正確に言うと、式1〜式3のそれぞれが式であればいいので、複数の式をカンマ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B1%E9%BB%BB%BB%D2">演算子</a>でつないで一つの式にしているというだけ。式2も同じことができるけど、評価後の値によって分岐するので順番が大事になる。ループ毎に処理したいものは素直に式3に書いたほうがいい。</span></p> </div> chalcedony_htn JavaScriptの条件演算子(三項演算子) hatenablog://entry/17680117126976451957 2014-03-31T18:38:04+09:00 2019-02-22T17:00:24+09:00 PCの中身を整理したので、お蔵出しシリーズと称して、昔自分のために書いた文章を供養していこうと思います。たぶんあんまり続かない。 今回は2008年2月に書いたらしいものに加筆修正しました。 基本(条件演算子の記法) if(条件式) { 条件式が真(true)の場合の処理 } else { 条件式が偽(false)の場合の処理 } っていう文と同じ処理をする式を、 (条件式) ? 条件式が真の場合に評価する式 : 条件式が偽の場合に評価する式 と書くことができる。 ?:を条件演算子という。JavaScriptでは唯一、項(被演算子)が三つの演算子なので、三項演算子とも呼ばれる。 条件式のカッコ(… <p>PCの中身を整理したので、お蔵出しシリーズと称して、昔自分のために書いた文章を供養していこうと思います。たぶんあんまり続かない。<br /> 今回は2008年2月に書いたらしいものに加筆修正しました。</p> <div class="section"> <h4>基本(条件<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B1%E9%BB%BB%BB%D2">演算子</a>の記法)</h4> <pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synStatement">if</span>(条件式) <span class="synIdentifier">{</span> 条件式が真(<span class="synConstant">true</span>)の場合の処理 <span class="synIdentifier">}</span> <span class="synStatement">else</span> <span class="synIdentifier">{</span> 条件式が偽(<span class="synConstant">false</span>)の場合の処理 <span class="synIdentifier">}</span> </pre><p>っていう文と同じ処理をする式を、</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink>(条件式) ? 条件式が真の場合に評価する式 : 条件式が偽の場合に評価する式 </pre><p>と書くことができる。</p><br /> <p>?:を条件<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B1%E9%BB%BB%BB%D2">演算子</a>という。<a class="keyword" href="http://d.hatena.ne.jp/keyword/JavaScript">JavaScript</a>では唯一、項(被<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B1%E9%BB%BB%BB%D2">演算子</a>)が三つの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B1%E9%BB%BB%BB%D2">演算子</a>なので、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BB%B0%B9%E0%B1%E9%BB%BB%BB%D2">三項演算子</a>とも呼ばれる。</p><br /> <p>条件式のカッコ()は可読性のために入れただけで、必須ではない。同じくスペースも必須ではない。</p> <ul> <li>それぞれの項はすべて式である</li> <li>全体が一つの式になっている</li> <li>式なので全体をカッコ()でくくってもよい</li> </ul><p>という点に注目。といってもこれは<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B1%E9%BB%BB%BB%D2">演算子</a>が作る式ならすべてに当てはまるのだけど。</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink>条件式 ? 条件式が真の場合に評価する式 : 条件式が偽の場合に評価する式 </pre><p>とかなんとか、途中で改行してもOK。</p> </div> <div class="section"> <h4>式の評価結果</h4> <p>全体で一つの式になっているので、全体で一つの値を返す。<br /> 返す値は最後に評価された式の値になる。</p><br /> <p>たとえば、変数aに(xの値に応じて)bまたはcを代入したい場合、if文を使うとこんな風になる。</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink>x = 10; <span class="synStatement">if</span>(x == 10) <span class="synIdentifier">{</span> a = b; <span class="synIdentifier">}</span> <span class="synStatement">else</span> <span class="synIdentifier">{</span> a = c; <span class="synIdentifier">}</span> <span class="synComment">// 結果:aにbが代入される</span> </pre><p>これを省略して</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink>x = 10; (x == 10) ? a = b : a = c; <span class="synComment">// 結果:aにbが代入される</span> </pre><p>と書けて、さらに省略して</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink>x = 10; a = (x == 10) ? b : c; <span class="synComment">// 結果:aにbが代入される</span> </pre><p>と書ける。<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%B1%E9%BB%BB%BB%D2">演算子</a>の優先順位にもとづき、代入<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B1%E9%BB%BB%BB%D2">演算子</a>=より条件<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B1%E9%BB%BB%BB%D2">演算子</a>?:のほうが先に評価されるので、「(x == 10) ? b : c」という式の値がaに代入される。</p><br /> <p>最後の書き方は個人的によく使ってる。変数に代入するという目的が目に見えやすい気がするので。</p><br /> <p>あとは、たとえば「引数が条件に合うかどうかを真偽値で返す関数」が</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synIdentifier">function</span> hoge(huga) <span class="synIdentifier">{</span> <span class="synStatement">return</span> (huga == piyo) ? <span class="synConstant">true</span> : <span class="synConstant">false</span>; <span class="synIdentifier">}</span> </pre><p>とか書けたりする。<br /> if文が増えないからすっきり。でもこっちはやり過ぎるとたぶんあとで読めない。</p> </div> <div class="section"> <h4>応用1:<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C6%FE%A4%EC%BB%D2">入れ子</a>にもできる</h4> <p>全体が式なので、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C6%FE%A4%EC%BB%D2">入れ子</a>にもできる。たとえば</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synStatement">if</span>(x &lt; 10) <span class="synIdentifier">{</span> y = a; <span class="synIdentifier">}</span> <span class="synStatement">else</span> <span class="synStatement">if</span>(x &lt; 20) <span class="synIdentifier">{</span> y = b; <span class="synIdentifier">}</span> <span class="synStatement">else</span> <span class="synStatement">if</span>(x &lt; 30) <span class="synIdentifier">{</span> y = c; <span class="synIdentifier">}</span> <span class="synStatement">else</span> <span class="synIdentifier">{</span> y = d; <span class="synIdentifier">}</span> </pre><p>は、</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink>y = (x &lt; 10) ? a : (x &lt; 20) ? b : (x &lt; 30) ? c : d; </pre><p>と書ける。改行もできるので</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink>y = (x &lt; 10) ? a : (x &lt; 20) ? b : (x &lt; 30) ? c : d; </pre><p>とか書いてもいい。<br /> 素直にifかswitchで書いたほうが、条件分岐ってことがわかりやすくていいと思う。人の書いたコードで見つけたときに面食らわない程度におぼえておく。</p> </div> <div class="section"> <h4>応用2:配列/ハッシュの添え字にもできる</h4> <p>くどいようだが式なので、配列やハッシュの添え字にもできる。</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synIdentifier">var</span> arr = <span class="synStatement">new</span> <span class="synType">Array</span>(<span class="synConstant">&quot;あ&quot;</span>,<span class="synConstant">&quot;い&quot;</span>,<span class="synConstant">&quot;う&quot;</span>,<span class="synConstant">&quot;え&quot;</span>); <span class="synIdentifier">var</span> x = 10; <span class="synStatement">alert</span>(arr<span class="synIdentifier">[</span>(x==10)?1:3<span class="synIdentifier">]</span>); <span class="synComment">// 結果:「い」</span> </pre><p>使う必要ないと思う。役に立つのは<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D6%A5%C3%A5%AF%A5%DE%A1%BC%A5%AF%A5%EC%A5%C3%A5%C8">ブックマークレット</a>を作るときくらいかな。</p> </div> chalcedony_htn 選択した文字列を索引項目に登録するJavaScript(読み仮名自動入力、CS3〜) hatenablog://entry/17680117126976452043 2013-07-03T21:58:33+09:00 2019-02-22T17:00:27+09:00 はいこんばんは。InDesignで索引項目を追加するときはソートのために読み仮名を入力しなくてはならないのですが、手打ちするのがあまりにもめんどくさいので自動的に取得するスクリプトを作りました。 読み仮名の取得にはみんな大好きYahoo!のテキスト解析WebAPIを利用しています。これを ↓ こうします あくまで自分用に作ったものなので、 参照形式はデフォルトの「現在のページ」のみ 項目のレベルは設定できない(すべてレベル1になる) という仕様になっています。 あと、APIのアプリケーションIDは消してありますので、もし使用する場合は自分のアプリケーションID(ランダムな英数字になってます)を… <p>はいこんばんは。</p><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/InDesign">InDesign</a>で索引項目を追加するときはソートのために読み仮名を入力しなくてはならないのですが、手打ちするのがあまりにもめんどくさいので自動的に取得する<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>を作りました。<br /> 読み仮名の取得にはみんな大好き<a href="http://developer.yahoo.co.jp/webapi/jlp/">Yahoo!&#x306E;&#x30C6;&#x30AD;&#x30B9;&#x30C8;&#x89E3;&#x6790;WebAPI</a>を利用しています。</p><p>これを<br /> <span itemscope itemtype="http://schema.org/Photograph"><a href="http://f.hatena.ne.jp/chalcedony_htn/20130703213940" class="hatena-fotolife" itemprop="url"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/chalcedony_htn/20130703/20130703213940.png" alt="f:id:chalcedony_htn:20130703213940p:image" title="f:id:chalcedony_htn:20130703213940p:image" class="hatena-fotolife" itemprop="image"></a></span><br /> ↓<br /> こうします<br /> <span itemscope itemtype="http://schema.org/Photograph"><a href="http://f.hatena.ne.jp/chalcedony_htn/20130703213941" class="hatena-fotolife" itemprop="url"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/chalcedony_htn/20130703/20130703213941.png" alt="f:id:chalcedony_htn:20130703213941p:image" title="f:id:chalcedony_htn:20130703213941p:image" class="hatena-fotolife" itemprop="image"></a></span></p><br /> <p>あくまで自分用に作ったものなので、</p> <ul> <li>参照形式はデフォルトの「現在のページ」のみ</li> <li>項目のレベルは設定できない(すべてレベル1になる)</li> </ul><p>という仕様になっています。<br /> あと、<a class="keyword" href="http://d.hatena.ne.jp/keyword/API">API</a>のアプリケーションIDは消してありますので、もし使用する場合は自分のアプリケーションID(ランダムな英数字になってます)を取得して、「◆◆◆ココにアプリケーションIDを書く◆◆◆」のところに入れてください(1箇所だけです)。YahooのIDを作れば誰でも取得できます。<br /> ちょっと試してみたいという人にはだいぶ不親切ですがご了承ください><</p><br /> <p>この<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>を書くにあたって、2つの記事を大いに参考にさせていただいています。</p> <ul> <li>表があるとマーカー挿入位置がずれるという<span class="deco" style="font-weight:bold;">意味わかんないバグ</span>の回避:<a href="http://d.kmuto.jp/20120912.html">&#x7D22;&#x5F15;&#x3092;&#x30B9;&#x30AF;&#x30EA;&#x30D7;&#x30C8;&#x304B;&#x3089;&#x306A;&#x3093;&#x3068;&#x304B;&#x3057;&#x3066;&#x57CB;&#x3081;&#x8FBC;&#x3080;</a></li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/InDesign">InDesign</a>からのHTTPアクセス:<a href="http://d.hatena.ne.jp/C_L/20081012/indesign_socket_http">InDesign&#x3067;Socket&#x30AF;&#x30E9;&#x30B9;&#x306E;&#x4E0A;&#x4F4D;&#x30AF;&#x30E9;&#x30B9;&#x3092;&#x4F5C;&#x308A;HTTP&#x3067;&#x30A2;&#x30AF;&#x30BB;&#x30B9;</a></li> </ul><p><br /> 動作確認は、<a class="keyword" href="http://d.hatena.ne.jp/keyword/WinXP">WinXP</a> + CS4、<a class="keyword" href="http://d.hatena.ne.jp/keyword/WinXP">WinXP</a> + CS5.5、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Win7">Win7</a> + CS5.5、<a class="keyword" href="http://d.hatena.ne.jp/keyword/MacOSX">MacOSX</a> 10.7.5 + CS3、<a class="keyword" href="http://d.hatena.ne.jp/keyword/MacOSX">MacOSX</a> 10.5.8 + CS3、<a class="keyword" href="http://d.hatena.ne.jp/keyword/MacOSX">MacOSX</a> 10.5.8 + CS4で行いました。<a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac">Mac</a>での動作確認にご協力いただいたお二方、ありがとうございました! 遅れてすいません!</p><br /> <p>■使用前の確認事項</p> <ul> <li><span class="deco" style="color:#FF0000;">なにが起きても泣かないようにデータのバックアップを取りながら使用してください(最重要)。</span></li> <li>インターネットへアクセスできる環境が必要です。</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Yahoo%21">Yahoo!</a>の「日本語<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B7%C1%C2%D6%C1%C7%B2%F2%C0%CF">形態素解析</a><a class="keyword" href="http://d.hatena.ne.jp/keyword/API">API</a>」を使用しています。サービスが終了した場合、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>も使用できなくなります。</li> <li>選択中の文字列をインターネット経由で<a class="keyword" href="http://d.hatena.ne.jp/keyword/Yahoo%21">Yahoo!</a>のサービスへ送信します。機密情報などが漏洩した場合でも責任は持ちません。</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%AF%A5%BB%A5%B9%A5%ED%A5%B0">アクセスログ</a>などを見れば、どんな文字列を送信したか誰でもわかります。</li> <li>記号類は読み仮名から削除されます。</li> </ul><p><br /> ■使用中の注意事項</p> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/API">API</a>が期待通りの読み仮名を返してくるとは限らないので、必ず1件ずつ確認しながら登録してください。</li> <li><span class="deco" style="color:#FF0000;">登録直後は索引項目のページ数が表示されません。索引パネルのメニューから[プレビューを更新]を実行すると直ります。</span></li> <li>索引登録時、ドキュメントの最初のページ付近にダミーのテキストフレームが作られます。通常は自動的に削除されますが、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>が途中で止まった場合などに残る可能性があります。ひととおり登録したら、フレームが残っていないか確認してください。あったら消してね。</li> <li><span class="deco" style="color:#FF0000;"><span class="deco" style="font-weight:bold;">なにが起きても泣かないようにデータのバックアップを取りながら使用してください(念押し)。</span></span></li> </ul><pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synComment">// 索引登録支援ツール(InDesign CS3〜)</span> <span class="synComment">// Yahoo!のテキスト解析APIを利用して索引の読み仮名入力を自動化します。</span> <span class="synComment">// http://developer.yahoo.co.jp/webapi/jlp/</span> <span class="synComment">//</span> <span class="synComment">// 以下の記事をパク^H^H大いに参考にさせていただいています。</span> <span class="synComment">// kmutoさん</span> <span class="synComment">// via http://d.kmuto.jp/20120912.html</span> <span class="synComment">// CLさん</span> <span class="synComment">// via http://d.hatena.ne.jp/C_L/20081012/indesign_socket_http</span> <span class="synComment">//</span> <span class="synComment">// v0.9 2013/04/03</span> <span class="synComment">// v1.0 2013/06/03 デフォルトスタイルの初期化処理追加、自分で使用開始</span> <span class="synComment">// v1.1 2013/06/17 初期化処理をやめてダミー文字のサイズだけ指定する形に変更</span> <span class="synComment">// </span> <span class="synComment">// NYSL http://www.kmonos.net/nysl/</span> <span class="synComment">// ==============================================================================</span> main(); <span class="synComment">// メインの処理</span> <span class="synIdentifier">function</span> main()<span class="synIdentifier">{</span> <span class="synComment">//Yahoo!APIのアプリケーションID</span> <span class="synIdentifier">var</span> myAppID = <span class="synConstant">&quot;◆◆◆ココにアプリケーションIDを書く◆◆◆&quot;</span>; <span class="synComment">// 選択状態チェック(テキストオブジェクトを選択してる状態のみ動作)</span> <span class="synStatement">if</span>(app.selection.length == 0 || !app.selection<span class="synIdentifier">[</span>0<span class="synIdentifier">]</span>.constructor.name.match(<span class="synConstant">/^(Text|Word|Character|Paragraph|Line|TextColumn|TextStyleRange)$/</span>))<span class="synIdentifier">{</span> <span class="synStatement">alert</span>(<span class="synConstant">&quot;索引登録可能なテキストを選択してください。&quot;</span>); <span class="synStatement">return</span> <span class="synConstant">false</span>; <span class="synIdentifier">}</span> <span class="synIdentifier">var</span> actDoc = app.activeDocument; <span class="synIdentifier">var</span> idx = (actDoc.indexes.length &gt; 0) ? actDoc.indexes<span class="synIdentifier">[</span>0<span class="synIdentifier">]</span> : actDoc.indexes.add(); <span class="synIdentifier">var</span> targ = app.selection<span class="synIdentifier">[</span>0<span class="synIdentifier">]</span>; <span class="synComment">// 選択中のテキスト</span> <span class="synIdentifier">var</span> title = targ.contents; <span class="synComment">// 索引項目になる文言</span> <span class="synComment">// APIリクエスト</span> <span class="synIdentifier">var</span> yapiObj = <span class="synStatement">new</span> YAPIReading(); yapiObj.appid = myAppID; <span class="synIdentifier">var</span> reading = yapiObj.getReading(title); <span class="synComment">// 読みがなになる文言</span> <span class="synComment">// 表示ダイアログ準備</span> <span class="synComment">// ダイアログで読みがなを修正可能</span> <span class="synIdentifier">var</span> dlg = createDialog(); dlg.tf.text = title; <span class="synComment">// 索引項目欄に入力</span> dlg.rf.text = reading; <span class="synComment">// 読みがな欄に入力</span> <span class="synComment">// 読みがなが空文字(APIがエラー返してきてる)だったらメッセージを上書きする</span> <span class="synStatement">if</span>(reading == <span class="synConstant">&quot;&quot;</span>)<span class="synIdentifier">{</span> dlg.info.text = <span class="synConstant">&quot;読みがなの自動取得に失敗しました。直接入力してください。&quot;</span>; <span class="synIdentifier">}</span> <span class="synComment">// ダイアログ表示から登録実行</span> <span class="synComment">// 登録ボタンを押すと、その時点の読みがな欄のテキストを読みがなとして登録</span> <span class="synStatement">if</span>(dlg.show() == 1)<span class="synIdentifier">{</span> title = dlg.tf.text; reading = dlg.rf.text; <span class="synStatement">try</span><span class="synIdentifier">{</span> embedIndex(idx, targ, title, reading); <span class="synComment">// 登録実行</span> <span class="synIdentifier">}</span> <span class="synStatement">catch</span>(e) <span class="synIdentifier">{</span> <span class="synStatement">alert</span>(<span class="synConstant">&quot;登録に失敗しました。</span><span class="synSpecial">\n</span><span class="synConstant">索引項目または読みがなに使えない文字がないか確認してください。&quot;</span>); <span class="synIdentifier">arguments</span>.callee(); <span class="synIdentifier">}</span> <span class="synStatement">return</span> <span class="synConstant">true</span>; <span class="synIdentifier">}</span> <span class="synStatement">return</span> <span class="synConstant">false</span>; <span class="synComment">// 登録しなかったらfalse返すことにしておく(なんとなく)</span> <span class="synIdentifier">}</span> <span class="synComment">// ***************************************************************************</span> <span class="synComment">//</span> <span class="synComment">// 以下、関数・オブジェクト定義など</span> <span class="synComment">//</span> <span class="synComment">// ***************************************************************************</span> <span class="synComment">// 索引を追加する関数 ********************************************************</span> <span class="synComment">// kmutoさんのアイディア(マーカーのコピペ)を拝借</span> <span class="synComment">// via http://d.kmuto.jp/20120912.html</span> <span class="synComment">// ***************************************************************************</span> <span class="synIdentifier">function</span> embedIndex(index, target, title, reading) <span class="synIdentifier">{</span> <span class="synComment">// ダミーのテキストフレームを作って★マークとか入れておく</span> <span class="synIdentifier">var</span> dummyFrame = index.<span class="synStatement">parent</span>.pages<span class="synIdentifier">[</span>0<span class="synIdentifier">]</span>.textFrames.add(); dummyFrame.geometricBounds = <span class="synIdentifier">[</span>0, 0, 50, 50<span class="synIdentifier">]</span>; <span class="synComment">// サイズは適当</span> dummyFrame.insertionPoints<span class="synIdentifier">[</span>0<span class="synIdentifier">]</span>.pointSize = 1; <span class="synComment">// 文字あふれ対策にサイズを小さくしておく</span> dummyFrame.contents = <span class="synConstant">&quot;★&quot;</span>; <span class="synComment">// 項目追加</span> <span class="synComment">// ダミーの★マークのところに索引マーカーを入れる</span> index.topics.add(title, reading).pageReferences.add(dummyFrame.characters<span class="synIdentifier">[</span>0<span class="synIdentifier">]</span>); <span class="synComment">// マーカー文字をカット&ペーストして正しい位置に移動</span> dummyFrame.characters<span class="synIdentifier">[</span>0<span class="synIdentifier">]</span>.select(); app.cut(); target.insertionPoints<span class="synIdentifier">[</span>0<span class="synIdentifier">]</span>.select(); app.pasteWithoutFormatting(); <span class="synComment">// フォーマットなしでペースト</span> <span class="synComment">// ダミーのフレームを始末</span> dummyFrame.remove(); <span class="synIdentifier">}</span> <span class="synComment">// ダイアログオブジェクトを作って返す関数 ************************************</span> <span class="synComment">// あとで部品にアクセスしやすいようにショートカット作ってある</span> <span class="synComment">// dlg.tf : 項目入力欄</span> <span class="synComment">// dlg.rf : 読みがな入力欄</span> <span class="synComment">// dlg.info : 情報欄</span> <span class="synComment">// ***************************************************************************</span> <span class="synIdentifier">function</span> createDialog()<span class="synIdentifier">{</span> <span class="synIdentifier">var</span> dlg = <span class="synStatement">new</span> Window(<span class="synConstant">&quot;dialog&quot;</span>, <span class="synConstant">&quot;索引登録&quot;</span>); dlg.orientation = <span class="synConstant">&quot;row&quot;</span>; dlg.alignChildren = <span class="synConstant">&quot;top&quot;</span>; <span class="synIdentifier">var</span> inputG = dlg.add(<span class="synConstant">&quot;group&quot;</span>); inputG.orientation = <span class="synConstant">&quot;column&quot;</span>; inputG.alignChildren = <span class="synConstant">&quot;left&quot;</span>; <span class="synIdentifier">var</span> infoLabel = inputG.add(<span class="synConstant">&quot;statictext&quot;</span>, <span class="synStatement">undefined</span>, <span class="synConstant">&quot;読みがなを修正してください。キャンセルすると登録を中止します。&quot;</span>); <span class="synIdentifier">var</span> inputTitle = inputG.add(<span class="synConstant">&quot;group&quot;</span>); inputTitle.orientation = <span class="synConstant">&quot;row&quot;</span>; <span class="synIdentifier">var</span> titleLabel = inputTitle.add(<span class="synConstant">&quot;statictext&quot;</span>, <span class="synStatement">undefined</span>, <span class="synConstant">&quot;索引項目:&quot;</span>); <span class="synIdentifier">var</span> titleField = inputTitle.add (<span class="synConstant">&quot;statictext&quot;</span>, <span class="synStatement">undefined</span>, <span class="synStatement">undefined</span>); titleLabel.characters = 9; titleField.characters = 35; <span class="synIdentifier">var</span> inputReading = inputG.add(<span class="synConstant">&quot;group&quot;</span>); inputReading.orientation = <span class="synConstant">&quot;row&quot;</span>; <span class="synIdentifier">var</span> readingLabel = inputReading.add(<span class="synConstant">&quot;statictext&quot;</span>, <span class="synStatement">undefined</span>, <span class="synConstant">&quot;読みがな:&quot;</span>); <span class="synIdentifier">var</span> readingField = inputReading.add (<span class="synConstant">&quot;edittext&quot;</span>, <span class="synStatement">undefined</span>, <span class="synStatement">undefined</span>); readingLabel.characters = 9; readingField.characters = 35; <span class="synIdentifier">var</span> buttonG = dlg.add(<span class="synConstant">&quot;group&quot;</span>); buttonG.orientation = <span class="synConstant">&quot;column&quot;</span>; buttonG.add(<span class="synConstant">&quot;button&quot;</span>, <span class="synStatement">undefined</span>, <span class="synConstant">&quot;登録&quot;</span>, <span class="synIdentifier">{</span>name: <span class="synConstant">&quot;ok&quot;</span><span class="synIdentifier">}</span>); buttonG.add(<span class="synConstant">&quot;button&quot;</span>, <span class="synStatement">undefined</span>, <span class="synConstant">&quot;キャンセル&quot;</span>, <span class="synIdentifier">{</span>name: <span class="synConstant">&quot;cancel&quot;</span><span class="synIdentifier">}</span>); <span class="synComment">// ショートカット定義</span> dlg.tf = titleField; dlg.rf = readingField; dlg.info = infoLabel; <span class="synStatement">return</span> dlg; <span class="synIdentifier">}</span> <span class="synComment">// 読みがな取得用クラス定義 **************************************************</span> <span class="synComment">// アプリケーションIDはインスタンス側で設定する</span> <span class="synComment">//</span> <span class="synComment">// var hoge = new YAPIReading(); // インスタンス作成</span> <span class="synComment">// hoge.appid = &quot;★★アプリケーションID★★&quot;; // 自分のアプリケーションIDを指定する</span> <span class="synComment">// var title = &quot;僕の妹は漢字が読める&quot;; // 読みたい文言</span> <span class="synComment">// var reading = hoge.getReading(title); // 解析結果を取得</span> <span class="synComment">//</span> <span class="synComment">// ってする</span> <span class="synComment">// 記号類はfilterで除去。これも変更可能</span> <span class="synComment">// 読みがな部分の抽出はテキストそのまま正規表現でぶっこぬき。XML解析なにそれおいしいの</span> <span class="synComment">// ***************************************************************************</span> <span class="synIdentifier">function</span> YAPIReading()<span class="synIdentifier">{</span> <span class="synIdentifier">this</span>.appid = <span class="synConstant">&quot;&quot;</span>; <span class="synIdentifier">this</span>.filter = <span class="synConstant">&quot;1|2|3|4|5|6|7|8|9|10|11|12&quot;</span>; <span class="synIdentifier">this</span>.response = <span class="synConstant">&quot;reading&quot;</span>; <span class="synIdentifier">this</span>.results = <span class="synConstant">&quot;ma&quot;</span>; <span class="synIdentifier">this</span>.rex = <span class="synConstant">/&lt;reading&gt;(.*?)&lt;\/reading&gt;/g</span>; <span class="synComment">// &lt;reading&gt;要素を見つける正規表現(gオプション付き)</span> <span class="synIdentifier">this</span>.getReading = <span class="synIdentifier">function</span>(sentence)<span class="synIdentifier">{</span> <span class="synIdentifier">var</span> reading = <span class="synConstant">&quot;&quot;</span>; <span class="synIdentifier">var</span> requestURI = <span class="synConstant">'http://jlp.yahooapis.jp/MAService/V1/parse?'</span> + <span class="synConstant">'appid='</span> + <span class="synIdentifier">this</span>.appid + <span class="synConstant">'&amp;ma_filter='</span> + <span class="synIdentifier">this</span>.filter + <span class="synConstant">'&amp;response='</span> + <span class="synIdentifier">this</span>.response + <span class="synConstant">'&amp;results='</span> + <span class="synIdentifier">this</span>.results + <span class="synConstant">'&amp;sentence='</span> + encodeURI(sentence); <span class="synIdentifier">var</span> lwp = <span class="synStatement">new</span> Lwp(); <span class="synIdentifier">var</span> result = lwp.get(requestURI); <span class="synComment">// gオプション付きRegExpオブジェクトのexecループ</span> <span class="synComment">// &lt;reading&gt;要素を見つけるたびに中身のテキストを足していく</span> <span class="synIdentifier">var</span> m; <span class="synStatement">while</span> (m = <span class="synIdentifier">this</span>.rex.exec(result)) <span class="synIdentifier">{</span> reading += m<span class="synIdentifier">[</span>1<span class="synIdentifier">]</span>; <span class="synIdentifier">}</span> <span class="synStatement">return</span> reading; <span class="synComment">// リクエストに失敗した場合はreadingタグがないので空文字になってるはず</span> <span class="synIdentifier">}</span> <span class="synStatement">return</span> <span class="synIdentifier">this</span>; <span class="synIdentifier">}</span> <span class="synComment">// HTTPアクセス(GET)用クラス定義 *******************************************</span> <span class="synComment">// CLさんのモジュールを微改造</span> <span class="synComment">// via http://d.hatena.ne.jp/C_L/20081012/indesign_socket_http</span> <span class="synComment">// prototypeをやめてUser-Agentをそれっぽくしただけ</span> <span class="synComment">// ***************************************************************************</span> <span class="synIdentifier">function</span> Lwp() <span class="synIdentifier">{</span> <span class="synIdentifier">this</span>.userAgent = <span class="synConstant">&quot;InDesign/&quot;</span> + app.version + <span class="synConstant">&quot; (InDesign &quot;</span> + app.version + <span class="synConstant">&quot;; &quot;</span> + $.os + <span class="synConstant">&quot;; ja)&quot;</span>; <span class="synIdentifier">this</span>.uri = <span class="synIdentifier">function</span>(uri) <span class="synIdentifier">{</span> <span class="synIdentifier">var</span> rex = <span class="synStatement">new</span> <span class="synType">RegExp</span>(<span class="synConstant">'http://([^:/]+)(?::(</span><span class="synSpecial">\d</span><span class="synConstant">+))?(.+)'</span>); <span class="synComment">// via http://pc11.2ch.net/test/read.cgi/php/1015692614/57</span> <span class="synIdentifier">var</span> urlObj =<span class="synIdentifier">[]</span>; <span class="synStatement">if</span> ( uri.match(rex) ) <span class="synIdentifier">{</span> urlObj.host = <span class="synType">RegExp</span>.$1; urlObj.port = <span class="synType">RegExp</span>.$2 ?<span class="synType">RegExp</span>.$2 :80; urlObj.path = <span class="synType">RegExp</span>.$3; <span class="synIdentifier">}</span> <span class="synStatement">return</span> urlObj; <span class="synIdentifier">}</span> <span class="synIdentifier">this</span>.get = <span class="synIdentifier">function</span> (uri) <span class="synIdentifier">{</span> <span class="synIdentifier">var</span> conn = <span class="synStatement">new</span> Socket; <span class="synIdentifier">var</span> urlObj = <span class="synIdentifier">this</span>.uri(uri); <span class="synStatement">if</span> ( conn.open(urlObj.host + <span class="synConstant">':'</span> + urlObj.port, <span class="synConstant">'UTF-8'</span>) ) <span class="synIdentifier">{</span> conn.write (<span class="synConstant">&quot;GET &quot;</span> + urlObj.path + <span class="synConstant">&quot; HTTP/1.0</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span> + <span class="synConstant">&quot;Host: &quot;</span> + urlObj.host + <span class="synConstant">&quot;</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span> + <span class="synConstant">&quot;User-Agent: &quot;</span> + <span class="synIdentifier">this</span>.userAgent + <span class="synConstant">&quot;</span><span class="synSpecial">\n\n</span><span class="synConstant">&quot;</span>); <span class="synIdentifier">var</span> reply = conn.read(999999); conn.close(); <span class="synStatement">return</span> reply.substring(reply.indexOf(<span class="synConstant">&quot;</span><span class="synSpecial">\n\n</span><span class="synConstant">&quot;</span>) + 2); <span class="synIdentifier">}</span> <span class="synIdentifier">}</span> <span class="synStatement">return</span> <span class="synIdentifier">this</span>; <span class="synIdentifier">}</span>; </pre> chalcedony_htn なんとなく、使っているツール(フリーウェア)を晒してみる hatenablog://entry/17680117126976452118 2013-04-19T01:48:57+09:00 2019-02-22T17:00:29+09:00 はいこんばんは。4GBパッチというものの存在を知ってちょっと調べていたのですが、その過程でこの記事を見かけまして。 4GBパッチは効果がある! & 個人的使用ツール せっかくなので自分の愛用しているソフトウェアをいくつか晒してみたいと思います。 当然すべてWindows用です。 テキストエディタ サクラエディタUnicode版 メモ書きから置換処理、Grep検索、ちょっとしたスクリプト書きまでこれ一つで済んでしまいます。マクロもあるよ。 設定項目が膨大にあるけど、その分かゆいところをゴリゴリカスタマイズできて好きです。デフォルトでも十分使えますけどね。 昔は内部がShift-JISだったのです… <p>はいこんばんは。</p><p>4GBパッチというものの存在を知ってちょっと調べていたのですが、その過程でこの記事を見かけまして。<br /> <a href="http://indesigner.blog101.fc2.com/blog-entry-140.html">4GB&#x30D1;&#x30C3;&#x30C1;&#x306F;&#x52B9;&#x679C;&#x304C;&#x3042;&#x308B;&#xFF01; &#x3000;&#xFF06; &#x500B;&#x4EBA;&#x7684;&#x4F7F;&#x7528;&#x30C4;&#x30FC;&#x30EB;</a><br /> せっかくなので自分の愛用しているソフトウェアをいくつか晒してみたいと思います。<br /> 当然すべて<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a>用です。</p> <div class="section"> <h4><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C6%A5%AD%A5%B9%A5%C8%A5%A8%A5%C7%A5%A3%A5%BF">テキストエディタ</a></h4> <div class="section"> <h5><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B5%A5%AF%A5%E9%A5%A8%A5%C7%A5%A3%A5%BF">サクラエディタ</a><a class="keyword" href="http://d.hatena.ne.jp/keyword/Unicode">Unicode</a>版</h5> <p>メモ書きから置換処理、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Grep">Grep</a>検索、ちょっとした<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>書きまでこれ一つで済んでしまいます。マクロもあるよ。<br /> 設定項目が膨大にあるけど、その分かゆいところをゴリゴリカスタマイズできて好きです。デフォルトでも十分使えますけどね。<br /> 昔は内部がShift-JISだったのですが、いまは<a class="keyword" href="http://d.hatena.ne.jp/keyword/Unicode">Unicode</a>版もあります。</p> </div> </div> <div class="section"> <h4>ファイルリネームツール</h4> <div class="section"> <h5>お〜瑠璃ね〜む</h5> <p><a href="http://beefway.sakura.ne.jp/dl-allrename.html">http://beefway.sakura.ne.jp/dl-allrename.html</a><br /> 仕事しはじめて最初に使ったのがこれで、そのまま使い続けてます。正直ほかのやつ使ったことないので、どこがいいとかアピール難しい……<br /> 一通りの機能が揃っていながら、あんまり悩まずに直感的に使える素直さが魅力ですかね。リネーム前のプレビューが見やすいので、致命的なミスも回避できます。<br /> 開発はちゃんと継続されていて、たまにバージョンアップされてます。<br /> <br /> </p> </div> <div class="section"> <h5>CopyExt(拡張コピー)</h5> <p><a href="http://www.htosh.com/software/freesoft/copyext.html">http://www.htosh.com/software/freesoft/copyext.html</a><br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%AF%A5%B9%A5%D7%A5%ED%A1%BC%A5%E9">エクスプローラ</a>拡張。ファイルやフォルダの右クリックメニュー(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%C6%A5%AD%A5%B9%A5%C8%A5%E1%A5%CB%A5%E5%A1%BC">コンテキストメニュー</a>)から、</p> <ul> <li>リネームしつつコピー</li> <li>特定のフォルダにコピー</li> <li>タイムスタンプを比較してコピー</li> <li>まとめて選択して、フィルタを通ったものだけをコピー</li> </ul><p>などなど、いろんな方法でファイルコピーを行えます。設定をプロファイルで保存しておけば、複雑なコピーも一発で実行できたり。<br /> たとえば私は、「1つ以上のファイルを選択した状態で、マウス右ボタンを押しながらドラッグ→表示される<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%C6%A5%AD%A5%B9%A5%C8%A5%E1%A5%CB%A5%E5%A1%BC">コンテキストメニュー</a>で[ここに拡張コピー]をクリックすると“backupXX_(元ファイル名)”という名前でそれぞれ複製される」という設定で使っています。XXは連番で、すでに同じ名前のファイルがある場合だけ番号が増えていきます。所要時間1.5秒。<br /> これでぽいぽいバックアップ取っていけば万が一の時も安心。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%AF%A5%B9%A5%D7%A5%ED%A1%BC%A5%E9">エクスプローラ</a>拡張なので、ファイルの保存ダイアログ上でも有効。別名保存時に新しい日付のファイル名をつけるのでなく、古いファイルのバックアップを取ってから上書き、という感じで使ってます。<br /> ファイルが壊れる恐怖と日々戦うDTPerにとっては強い味方であります。<del>けど<a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac">Mac</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/Automator">Automator</a>のほうが便利じゃね?</del><br /> </p> </div> </div> <div class="section"> <h4>圧縮・解凍ツール</h4> <div class="section"> <h5>Cube ICE</h5> <p>いろんなの使ってきましたが、今はこれを使用中。<a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac">Mac</a>のFinderデフォルトで圧縮されたzipファイルも文字化けせず解凍できます。<br /> 使用感はごく普通。標準的な<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A1%BC%A5%AB%A5%A4%A5%D6">アーカイブ</a>形式にはだいたい対応してると思います。<br /> 圧縮時・解凍時に不要ファイルを任意でフィルタリングできるのが精神衛生上よいです。Thumbs.db爆発しろ。<br /> インストール時に謎<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C4%A1%BC%A5%EB%A5%D0%A1%BC">ツールバー</a>をインストールするかどうか聞かれますので注意。<br /> <br /> </p> </div> <div class="section"> <h5><a class="keyword" href="http://d.hatena.ne.jp/keyword/7-zip">7-zip</a></h5> <p>普段使うことはありませんが、後述する比較ツール<a class="keyword" href="http://d.hatena.ne.jp/keyword/WinMerge">WinMerge</a>で<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A1%BC%A5%AB%A5%A4%A5%D6">アーカイブ</a>比較機能を使うために入れています。<br /> <br /> </p> </div> <div class="section"> <h5>Explzh for <a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a></h5> <p>ライセンスの関係で仕事用PCには入れてないですが、こちらも<a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac">Mac</a>のデフォルトで圧縮したzipファイルを解凍できます。個人用PCではこちらを主に使っていますね。</p> </div> </div> <div class="section"> <h4>ランチャー</h4> <div class="section"> <h5>CLaunch</h5> <p>パネル型のランチャー。有名どころだと思います。<br /> タブ分けできるのである程度整理ができます。しかしだんだん登録アイテム数が増えてきてパネル自体が巨大に……<br /> デスクトップのダブルクリックで呼び出すようにしているので、普段<a class="keyword" href="http://d.hatena.ne.jp/keyword/Adobe">Adobe</a>のアプリケーションとか使う時はあえて最大化せず、端っこ数<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D4%A5%AF%A5%BB%A5%EB">ピクセル</a>のスキマを作って(ダブルクリックできるようにして)います。</p> </div> </div> <div class="section"> <h4>ファイラー(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%AF%A5%B9%A5%D7%A5%ED%A1%BC%A5%E9">エクスプローラ</a>拡張)</h4> <div class="section"> <h5>QTTabBar</h5> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%AF%A5%B9%A5%D7%A5%ED%A1%BC%A5%E9">エクスプローラ</a>をタブ型にするツール。たぶん似たようなのは山ほどありますが、最近は新しいのを開拓してないです。<br /> いわゆるタブ型アプリケーションに求める機能はだいたい入っていると思います。動作のカスタマイズも細かくできます。<br /> タブの横幅が可変で長いフォルダ名でも省略せず表示してくれること、タブをたくさん開いても多段表示できるので一覧性が損なわれないこと、あたりが個人的に好みですね。</p> </div> </div> <div class="section"> <h4>データ比較ツール</h4> <div class="section"> <h5><a class="keyword" href="http://d.hatena.ne.jp/keyword/WinMerge">WinMerge</a></h5> <p>定番中の定番。ファイルやフォルダを比較、テキストデータならその場でマージや編集もできます。<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3">プラグイン</a>を入れればWordや<a class="keyword" href="http://d.hatena.ne.jp/keyword/Excel">Excel</a>、PDFも比較可能。圧縮ファイルも解凍なしでそのまま中身を比較できます(要<a class="keyword" href="http://d.hatena.ne.jp/keyword/7-zip">7-zip</a><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3">プラグイン</a>)。<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/TortoiseSVN">TortoiseSVN</a>と連携させてリビジョン間の差分確認にも使っています。<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/InDesign">InDesign</a>のデータは直接比較できないけど、<a class="keyword" href="http://d.hatena.ne.jp/keyword/IDML">IDML</a>書き出して拡張子をzipに変えたら<a class="keyword" href="http://d.hatena.ne.jp/keyword/WinMerge">WinMerge</a>で修正箇所の割り出しができると最近気づきました。たまに便利。</p> </div> </div> <div class="section"> <h4>ファイルバックアップ</h4> <div class="section"> <h5>BunBackup</h5> <p>定番。自動バックアップ、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DF%A5%E9%A1%BC%A5%EA%A5%F3%A5%B0">ミラーリング</a>、フィルタ指定、上書き条件指定、世代管理などとりあえず欲しい機能が揃っています。これもカスタマイズ次第でかなり自分好みの設定を作れる。<br /> 作業データのバックアップ方法は今後変わりそうだけど、ちょっとしたデータのバックアップには使い続けるつもり。</p> </div> </div> <div class="section"> <h4><a class="keyword" href="http://d.hatena.ne.jp/keyword/Subversion">Subversion</a>クライアント</h4> <div class="section"> <h5><a class="keyword" href="http://d.hatena.ne.jp/keyword/TortoiseSVN">TortoiseSVN</a></h5> <p>最近使い始めたばかりの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%CB%A5%E5%A1%BC%A5%D5%A5%A7%A5%A4%A5%B9">ニューフェイス</a>。作業データのバージョン管理を画策していまして、絶賛修行中なのです。<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a>用の<a class="keyword" href="http://d.hatena.ne.jp/keyword/GUI">GUI</a>クライアントとしては定番どころか鉄板っぽい。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%AF%A5%B9%A5%D7%A5%ED%A1%BC%A5%E9">エクスプローラ</a>を拡張するのはわかりやすいし便利なんだけど、ちょっと動作が重くなる気がしないでもない……<br /> 「とーたすえすぶいえぬ」、かるせど覚えた。</p> </div> </div> <div class="section"> <h4>その他</h4> <div class="section"> <h5>WinCDEmu</h5> <p>CD/DVDのイメージファイル(isoとか)を開くと、空いているドライブレターが割り当てられ、通常のCD/DVDドライブと同じ感覚で扱うことができるようになる仮想ドライブツール。ドライブレターに空きがある限りいくつでも開けます。<br /> なにも考えずイメージファイルをダブルクリックするだけで使えて、ドライブの解放も同じくダブルクリックでできます。仮想ドライブを右クリックして[取り出し]でもOK。このシンプルさが普段使いに便利。<br /> 例によって最初に出会ったのがこれだっただけで、他にもたくさんあるはず。<br /> <br /> </p> </div> <div class="section"> <h5>M電卓</h5> <p><a href="http://www.vector.co.jp/magazine/softnews/080311/n0803113.html">http://www.vector.co.jp/magazine/softnews/080311/n0803113.html</a><br /> 電卓です。個人的には起動の速さと邪魔にならない小さいウィンドウが魅力かなあ。高機能らしいんだけど、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B4%D8%BF%F4%C5%C5%C2%EE">関数電卓</a>とか使わないし……<br /> あと便利なのが16進数での演算。10進数で計算した結果がリアルタイムで16進数表示できたり、その逆もできたり。途中で切り替えもできます。16進数と10進数を混ぜて計算したいとき、たとえば<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CA%B8%BB%FA%A5%B3%A1%BC%A5%C9">文字コード</a>連番でここから20文字分、とかによく使います。<br /> ちなみに単位換算機能もあるのですが、ポイントが<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%E1%A5%EA">アメリ</a>カンポイントなので使ってないというオチ付き。<br /> <br /> </p> </div> <div class="section"> <h5>pinz</h5> <p><a href="http://www.vector.co.jp/soft/win95/util/se343088.html">http://www.vector.co.jp/soft/win95/util/se343088.html</a><br /> 任意のウィンドウを最前面固定にしてくれるシンプルなツール。常駐型ですが邪魔にはならないです。<br /> タスクバーから固定用アイコンをドラッグ→目的のウィンドウにドロップするだけで使えます。解除も同じく解除用アイコンをドロップだけでOK。<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C6%A5%AD%A5%B9%A5%C8%A5%A8%A5%C7%A5%A3%A5%BF">テキストエディタ</a>なりファイラーなり、それぞれに最前面固定機能は備えていると思いますが、私くらいになるといちいち個別に設定するのも(設定方法を覚えるのも)めんどくさいですからね。愛用してます。<br /> <br /> </p> </div> </div> <div class="section"> <h4>などなど</h4> <p>思いつくままにいろいろ書いてみました。ほぼ毎日使うものだけに絞った<a href="#f-15730d37" name="fn-15730d37" title="諸事情で書かなかったやつもある">*1</a>のであんまり数なかったですね。<br /> 似た機能を持つ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%EA%A1%BC%A5%BD%A5%D5%A5%C8">フリーソフト</a>がたくさんあって選択肢が多いのが<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a>界のいいとこなので、「そういう使い方ならこっちのが便利だよ」というのがあったらぜひ教えてくださいー。</p> </div><div class="footnote"> <p class="footnote"><a href="#fn-15730d37" name="f-15730d37" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">諸事情で書かなかったやつもある</span></p> </div> chalcedony_htn INDD 2013 Tokyo(spring)に行ってきた(第3セッション感想) hatenablog://entry/17680117126976452146 2013-03-04T23:35:15+09:00 2019-02-22T17:00:30+09:00 はいこんばんは。先週の土曜日はInDesignの祭典、INDD 2013 Tokyo (spring)に行ってきました。セミナーのレポートとか最近サボり気味なんですが、今回は自分の業務にダイレクトにつながる内容だったので、せっかくだから俺は赤い扉を選感想など書いてみようと思います。他の2セッションについても書こうと思ったのですが力尽きましたごめんなさい…… 感想なので、内容のまとめではありません。内容については当日のTwitterの様子がまとめられたTogetterがあるのでそちらを。 http://togetter.com/li/464817 うわっ……私のpost、多すぎ……?(例の顔で … <p>はいこんばんは。</p><p>先週の土曜日は<a class="keyword" href="http://d.hatena.ne.jp/keyword/InDesign">InDesign</a>の祭典、<a href="http://indd.jp/2013/tokyo-spring.html">INDD 2013 Tokyo (spring)</a>に行ってきました。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BB%A5%DF">セミ</a>ナーのレポートとか最近サボり気味なんですが、今回は自分の業務にダイレクトにつながる内容だったので、せっかくだから<del>俺は赤い扉を選</del>感想など書いてみようと思います。他の2セッションについても書こうと思ったのですが力尽きましたごめんなさい……<br /> 感想なので、内容のまとめではありません。内容については当日の<a class="keyword" href="http://d.hatena.ne.jp/keyword/Twitter">Twitter</a>の様子がまとめられたTogetterがあるのでそちらを。<br /> <a href="http://togetter.com/li/464817">http://togetter.com/li/464817</a><br /> うわっ……私のpost、多すぎ……?(例の顔で</p> <div class="section"> <h4>第3セッション:多ページ作成での<a class="keyword" href="http://d.hatena.ne.jp/keyword/InDesign">InDesign</a>テクニック</h4> <p>テクニカルドキュメント、いわゆる「トリセツ」を日々制作されている西村さんが、あかねさんを相棒に多ページのドキュメントを大量に処理する場合のテクニックを解説してくれるセッション。<br /> 立場や仕事量などもろもろ違いますが、私も主な業務は同じくテクニカルドキュメントの制作です。この種の作業の特徴としては、スライドで挙げられていた</p> <ul> <li>ページ数が多い</li> <li>ファイル数も多い</li> <li>レイアウトはシンプル</li> <li>テキストがメイン</li> </ul><p>に加え、</p> <ul> <li>ほかのページへ誘導する記述が大量にある(X章のXを参照、XXページを参照、など)</li> <li>ページ増減が頻繁にある(途中のページに記述がどっさり追加され、以降の改ページ位置などがすべて変わる)</li> <li>改訂が多く、データが長年引き継がれ続ける</li> <li>改訂サイクルが早い(ことがある)</li> </ul><p>などが挙げられると思います。<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%B2%BC%C8%C7">下版</a>した次の日から改訂作業開始とかざらにあったり。逆に5年も前のデータを掘り起こしたり。最近は時代の流れか紙のトリセツも減りまして、最終的な出力がPDFでWeb掲載だったりすると、数百ページあるのに作業期間は1〜2日とかね。ありますね。<br /> 数百ページのドキュメントにちりばめられた「詳しくはXXページを参照してください」って記述を手作業で検索して<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BB%B2%BE%C8%B8%B5">参照元</a>と引き合わせて違ってたら手で数値打ち直して……とか、ページ増減で内容とずれてしまった柱テキストを目視確認してちまちま修正して……とか、<span class="deco" style="font-size:small;color:#999999;">「テキスト修正だからそんなに時間かからないでしょ? PDFだし、できたらすぐちょうだい」</span>、と、か……考えただけで<a class="keyword" href="http://d.hatena.ne.jp/keyword/SAN%C3%CD">SAN値</a><a href="#f-f3ca41ba" name="fn-f3ca41ba" title="正気度">*1</a>ががりがり削れていきます。</p><p>そんな作業を<a class="keyword" href="http://d.hatena.ne.jp/keyword/InDesign">InDesign</a>で(正気を保ちつつ)効率的に行うためには、どんな機能をどう使ったらいいのか? というのが今回のセッション。<br /> その内容ですが……いやー、濃かったですね! ものっすごいボリューム。</p> <ul> <li>テキスト変数</li> <li>箇条書き</li> <li>相互参照</li> <li>アンカー付きオブジェクト</li> <li>ブック</li> <li>目次</li> <li>索引</li> <li>(条件テキスト)</li> </ul><p>まさに普段業務で使っている機能ばかりで嬉しくなってしまいました。<br /> 逆に、初めて「この機能ってこういう時に使うのか」と知った人もいるんじゃないでしょうか? <a class="keyword" href="http://d.hatena.ne.jp/keyword/Adobe">Adobe</a>のヘルプではそれぞれ別の箇所に記述されていて、こんなふうに逆引き的に関連付けてまとまってはいないんですよね。機能の存在と概要を知らないと調べようがない。そもそも自動番号が箇条書きってどういうことなの……とかね。<br /> セッションでは、取り上げたそれぞれの機能について、何がどう効率化できるのか、どう設定したら使えるのか、使うときの注意点は何か、を丁寧に説明していました。<br /> この「注意点」のところが実はセッションの目玉だったんじゃないかと。ものすごく実践的で、「あるある!!」と何度も何度もうなずきながら聞いてたり、もちろん初めて知るものもたくさんあったり。単なる機能紹介や公式のヘルプでは絶対出てこないですよね、箇条書きの自動番号で51番目以降は丸数字が使えないとかw<br /> 設定方法についても、普段使ってる部分以外はあいまいにしか理解していなかったのできっちり復習できました。索引の参照形式とか、アンカー付きオブジェクトの位置オプションとか。後者はスライドで視覚的にまとめられていてわかりやすかったです。今まで回りくどいやり方をしていなかったか、チェックしてみるいい機会になりました。</p><br /> <p>実を言えば、これらの機能は日々使っているものの、他の環境ではどんなふうに使われているんだろう……といつも思っていたんですよね。よそで制作したデータを見ることが一切ないので。Webで検索してみても、実践的な内容はなかなか出てこないですし。<br /> もっと効率的なやり方があるのではないか? むしろ根本的に機能を勘違いしていたりしないか? と不安を抱いていたのですが、今回ピンポイントでテクニカルドキュメントの例を見ることができ、おおむね方向性は間違っていないとわかって心底ほっとしました。そのテンションの結果があのpost数だよ<a href="#f-4c623c5b" name="fn-4c623c5b" title="参照元と参照先を間違えてるところがあって赤面">*2</a>!</p><br /> <p>改めて今回紹介されていた機能を俯瞰してみると、何をおいてもまずは「ドキュメントを(データ上で)構造化すること」がはじめの一歩になるんだなあと思います。変数、相互参照、箇条書き、目次などなど、「テキストに適切なスタイルが設定されている」からこそ使えるんですよね。<br /> 逆にこれらの機能をフルに使いたいなら、それを前提にしたスタイルの設計をする、というのも必要になってくると思います。「見出しだから文字を大きくする段落スタイルを付けよう」ではなくて、「見出しとして使いたい段落だから見出しという段落スタイルを付けて、見た目でも見出しとわかるように文字を大きくしよう」という感じ。<br /> データを構造化しておくと、さらに進んだ自動処理(たとえば<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>を使うとか)をしやすくなったり、Eなんとか形式にするときにもたぶん比較的スムーズだったりと、メリットは多いと思います。</p><br /> <p>あとひとつ、大事だと思ったのは、最後のまとめにあった「自動だからと安心しないでチェックは必ずしよう」です。<br /> 各機能の注意点を見返してみるとわかりますが、自動更新されたりされなかったり、テキスト量によってオブジェクトが重なってしまったり、自動挿入されるテキストが手動で修正できてしまったりと、落とし穴も結構あります。相互参照まわりとかちょいちょい怪しいし<a href="#f-631d8d99" name="fn-631d8d99" title="相互参照、便利でかわいいやつだけどダメなところもたくさん知ってます。こちらのBlogに詳しいです→ [http://indesigner.blog101.fc2.com/:title=InDesignerの悪あがき] ブログ内検索で「相互参照」を検索するといろいろ出てきます。">*3</a>!<br /> 自分の仕事では、修正作業に時間がかからない分、チェックは念入りに……というつもりでやっています。<br /> 終了まぎわに西村さんがぽそっと言ってた、「あくまで入力支援ですからね」という言葉を肝に銘じておきたいですね。</p> </div> <div class="section"> <h4>というわけで</h4> <p><del><a class="keyword" href="http://d.hatena.ne.jp/keyword/InDesign">InDesign</a>かわいいよ<a class="keyword" href="http://d.hatena.ne.jp/keyword/InDesign">InDesign</a></del><br /> <del>横見出し機能搭載はよ</del><br /> 貴重な話を聞かせていただいてありがとうございました! 姐さん、よければ次は条件テキストも教えてください!</p> </div><div class="footnote"> <p class="footnote"><a href="#fn-f3ca41ba" name="f-f3ca41ba" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">正気度</span></p> <p class="footnote"><a href="#fn-4c623c5b" name="f-4c623c5b" class="footnote-number">*2</a><span class="footnote-delimiter">:</span><span class="footnote-text"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%BB%B2%BE%C8%B8%B5">参照元</a>と参照先を間違えてるところがあって赤面</span></p> <p class="footnote"><a href="#fn-631d8d99" name="f-631d8d99" class="footnote-number">*3</a><span class="footnote-delimiter">:</span><span class="footnote-text">相互参照、便利でかわいいやつだけどダメなところもたくさん知ってます。こちらのBlogに詳しいです→ <a href="http://indesigner.blog101.fc2.com/">InDesigner&#x306E;&#x60AA;&#x3042;&#x304C;&#x304D;</a> ブログ内検索で「相互参照」を検索するといろいろ出てきます。</span></p> </div> chalcedony_htn livedoor ClipがなくなったのでPinboardはじめました hatenablog://entry/17680117126976452184 2012-11-12T17:52:19+09:00 2019-02-22T17:00:31+09:00 はいこんばんは。 ちょっと前からですが、メインのソーシャルブックマークサービスをPinboardに乗り換えました。はてなのほうは継続利用中です。 これだけで完了するような話ですが、せっかくだからいろいろ書いておきます。 さようならlivedoor Clip 愛用していたソーシャルブックマークサービス「livedoor Clip」がお亡くなりになってしまったので、泣く泣く新しいサービスへ移行しなければならなくなりました。かなしい…… どうやらクリップでなじみの面々の多くははてなブックマークに移行したようなのですが……今までのブックマークを移行して長ったらしいコメントが途中でちょん切れるのは絶対に… <p>はいこんばんは。<br /> ちょっと前からですが、メインの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BD%A1%BC%A5%B7%A5%E3%A5%EB%A5%D6%A5%C3%A5%AF%A5%DE%A1%BC%A5%AF%A5%B5%A1%BC%A5%D3%A5%B9">ソーシャルブックマークサービス</a>を<a href="https://pinboard.in/u:chalcedony/">Pinboard&#x306B;&#x4E57;&#x308A;&#x63DB;&#x3048;&#x307E;&#x3057;&#x305F;</a>。<a href="http://b.hatena.ne.jp/chalcedony_htn/bookmark">&#x306F;&#x3066;&#x306A;&#x306E;&#x307B;&#x3046;</a>は継続利用中です。<br /> これだけで完了するような話ですが、せっかくだからいろいろ書いておきます。</p> <div class="section"> <h4>さようなら<a class="keyword" href="http://d.hatena.ne.jp/keyword/livedoor">livedoor</a> Clip</h4> <p>愛用していた<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BD%A1%BC%A5%B7%A5%E3%A5%EB%A5%D6%A5%C3%A5%AF%A5%DE%A1%BC%A5%AF%A5%B5%A1%BC%A5%D3%A5%B9">ソーシャルブックマークサービス</a>「<a class="keyword" href="http://d.hatena.ne.jp/keyword/livedoor">livedoor</a> Clip」がお亡くなりになってしまったので、泣く泣く新しいサービスへ移行しなければならなくなりました。かなしい……<br /> どうやらクリップでなじみの面々の多くは<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%CF%A4%C6%A4%CA%A5%D6%A5%C3%A5%AF%A5%DE%A1%BC%A5%AF">はてなブックマーク</a>に移行したようなのですが……今までのブックマークを移行して長ったらしいコメントが途中でちょん切れるのは絶対に避けたかったため、他のサービスを探すことに。</p><p>ソーシャルな部分はいまとなっては<a class="keyword" href="http://d.hatena.ne.jp/keyword/Twitter">Twitter</a>で十分なところがあるので、機能面を重視して選びました。<br /> 具体的に言うとコメント文字数と速度、それからある程度メジャーで今後のサービス継続が期待できるもの。<br /> ブックマーク支援ツール(<a class="keyword" href="http://d.hatena.ne.jp/keyword/Firefox">Firefox</a>アドオンの「<a class="keyword" href="http://d.hatena.ne.jp/keyword/Tombloo">Tombloo</a>」を使用)が対応しているかどうかも大事なところです。あ、あと日本語対応か。</p> </div> <div class="section"> <h4>こんにちはPinboard</h4> <p>いろいろ比較した結果、何人かがおすすめしてくれた<a href="https://pinboard.in/">Pinboard</a>に決定。なんとコメント文字数無制限<a href="#f-a93f7c4f" name="fn-a93f7c4f" title="システム上の上限はあるでしょうけどね">*1</a>なのです。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%ED%B8%BB%B6%BF">桃源郷</a>はここにあったんやー!<br /> 他の機能については<a href="https://pinboard.in/tour/">&#x30C4;&#x30A2;&#x30FC;</a>を参照。<br /> 面白いと思ったのは「to read」設定ですね。いわゆる「あとで読む」。このフラグが付けられたブックマークは「未読一覧」みたいな形で一覧表示できて、読み終えたしるしに「mark as read」リンクをクリックするまで非公開になるというものです。<br /> たしかに、読んでみるまではブクマしたことを知られたくないってのはありますし。通常の非公開設定と分けてあるところが、使うシーンをきっちり考えてるなーって思います。まあ個人的には非公開とかまず使わないんですけど。</p><p>Pinboardは有料のサービスなのですが、月額とかではなくて1回支払えばOKということでさくっと登録。金額が登録の時期によって(つまりユーザー数が増えて維持費が上がるに従って)だんだん高くなっていくらしくて、それもちょっと面白いと思いました<a href="#f-da6a7e51" name="fn-da6a7e51" title="金額据え置きで無理した結果破綻するよりよっぽどいいと思う">*2</a>。</p> </div> <div class="section"> <h4>ちなみに</h4> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/LDC">LDC</a>時代のブックマークはエクスポートしてPinboardのほうにぶちこんであります。エクスポートした<a class="keyword" href="http://d.hatena.ne.jp/keyword/XML">XML</a>をPinboard用に変換するのにえらい苦労したのですが、そのときのメモはうっかり意図的に消したので省略。<br /> なお、ミスって日付情報がすべて吹っ飛んだため、移行した分のエントリはいつのものかさっぱりわからない状態です。細けぇ事はいいんだよ!</p> </div><div class="footnote"> <p class="footnote"><a href="#fn-a93f7c4f" name="f-a93f7c4f" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">システム上の上限はあるでしょうけどね</span></p> <p class="footnote"><a href="#fn-da6a7e51" name="f-da6a7e51" class="footnote-number">*2</a><span class="footnote-delimiter">:</span><span class="footnote-text">金額据え置きで無理した結果破綻するよりよっぽどいいと思う</span></p> </div> chalcedony_htn InDesignでスクリプトから挿入した索引マーカーの位置がずれる問題 hatenablog://entry/17680117126976452210 2012-06-27T17:58:29+09:00 2019-02-22T17:00:32+09:00 ご無沙汰しております。 長々と前置きはしないことにして 淡々とInDesignの(たぶん)バグ報告します。 InDesignの索引作成時は見出し語の位置にマーカーを入れていくのですが、これをスクリプトからやろうとすると、ある条件下で挿入位置がずれるというバグがあります。JavaScriptとVBScriptで確認。 見出し語と同じストーリー上に表が入っている その表が見出し語より前にある その表が複数行ある(列の数は関係ない模様) CSまでは起きなかった問題です。CS4では起きるのを確認しました。CS2あたりからおかしくなってきたらしいと聞いたことがありますが、情報元のページが消えててわかんな… <p>ご無沙汰しております。</p> <div class="section"> <h4>長々と前置きはしないことにして</h4> <p>淡々と<a class="keyword" href="http://d.hatena.ne.jp/keyword/InDesign">InDesign</a>の(たぶん)バグ報告します。<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/InDesign">InDesign</a>の索引作成時は見出し語の位置にマーカーを入れていくのですが、これを<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>からやろうとすると、ある条件下で挿入位置がずれるというバグがあります。<a class="keyword" href="http://d.hatena.ne.jp/keyword/JavaScript">JavaScript</a>と<a class="keyword" href="http://d.hatena.ne.jp/keyword/VBScript">VBScript</a>で確認。</p> <ul> <li>見出し語と同じストーリー上に表が入っている</li> <li>その表が見出し語より前にある</li> <li>その表が複数行ある(列の数は関係ない模様)</li> </ul><p>CSまでは起きなかった問題です。CS4では起きるのを確認しました。CS2あたりからおかしくなってきたらしいと聞いたことがありますが、情報元のページが消えててわかんなくなったorz</p><p>というわけで実験してみました。<a class="keyword" href="http://d.hatena.ne.jp/keyword/InDesign">InDesign</a> CS5.5、言語は<a class="keyword" href="http://d.hatena.ne.jp/keyword/JavaScript">JavaScript</a>、もちろん<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a>版です。</p><p><span itemscope itemtype="http://schema.org/Photograph"><a href="http://f.hatena.ne.jp/chalcedony_htn/20120627175403" class="hatena-fotolife" itemprop="url"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/chalcedony_htn/20120627/20120627175403.png" alt="f:id:chalcedony_htn:20120627175403p:image" title="f:id:chalcedony_htn:20120627175403p:image" class="hatena-fotolife" itemprop="image"></a></span></p><p>見事にずれてます。実験に使った<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>は以下のもの。</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synIdentifier">var</span> doc = app.activeDocument; <span class="synIdentifier">var</span> idx = (doc.indexes.length&gt;0) ? doc.indexes<span class="synIdentifier">[</span>0<span class="synIdentifier">]</span> : doc.indexes.add(); idx.topics.add(<span class="synConstant">&quot;見出し語&quot;</span>,<span class="synConstant">&quot;よみがな&quot;</span>).pageReferences.add(app.selection<span class="synIdentifier">[</span>0<span class="synIdentifier">]</span>); </pre><p>文書内の「→←」の間にカーソルを立てては実行、を繰り返すこと7回でさっきの画像の状態になりました。順不同にやっても変わらず。<br /> 索引を実際に追加してるのは3行目です。topics.add()で項目を追加し、pageReferences.add()で現在選択してる箇所(挿入点、またはテキスト)を参照先として指定しています。<br /> ちなみに、リファレンス見るかぎりCS2〜CS5.5で動くはずです。CS6はまだ触ったことないです。</p> </div> <div class="section"> <h4>これのせいで</h4> <p>外部テキストに用意したリストを読み込んで一発で索引登録できる<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>!<a href="#f-2c700254" name="fn-2c700254" title="これは[http://www15.ocn.ne.jp/~preopen/:title=ディザInDesign]のお〜まちさんが[http://www15.ocn.ne.jp/~preopen/idjs/idjsreadindex.html:title=作ってらっしゃいます]ね。表さえ入ってなければCS5.5でもばっちり便利に使えてます。">*1</a>とか、テキスト選択して実行すると読みがなを自動解析して索引に登録する<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>!とか、そういうのが作りづらくなってるんで何とかして欲しいです。<br /> しかし、索引って使ってる人少ないのかなあ……。</p> </div><div class="footnote"> <p class="footnote"><a href="#fn-2c700254" name="f-2c700254" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">これは<a href="http://www15.ocn.ne.jp/~preopen/">&#x30C7;&#x30A3;&#x30B6;InDesign</a>のお〜まちさんが<a href="http://www15.ocn.ne.jp/~preopen/idjs/idjsreadindex.html">&#x4F5C;&#x3063;&#x3066;&#x3089;&#x3063;&#x3057;&#x3083;&#x3044;&#x307E;&#x3059;</a>ね。表さえ入ってなければCS5.5でもばっちり便利に使えてます。</span></p> </div> chalcedony_htn まいくてすと hatenablog://entry/13208692334729906273 2011-12-02T12:12:50+09:00 2011-12-02T03:12:50+09:00 あーあー本日は雨天なり <p>あーあー本日は雨天なり</p> chalcedony_htn DTPの勉強会に出ます hatenablog://entry/17680117126976452249 2011-08-02T20:53:03+09:00 2019-02-22T17:00:33+09:00 ぼやぼやしていたら、今年も半分過ぎたどころかもう8月ですって。今年まだ何もしてない気がします…… というわけで9月ごろがんばります。東京のDTPの勉強会 特別編でしゃべることになりました。すでに参加受付開始してます。 DTPの勉強会 特別編・第2回 日時:平成23年9月17日(土)13時30分(13時より受付開始)〜18時(予定) 場所:大橋会館 201教室 [テーマ] InDesignをJavaScriptでコントロールする なんとあのたけうちとおるさんと一緒ですよ。つまり私はオマケなのですが*1、いまだに実感がわきません。どうすればいいんだー。 詳しい内容は告知ページでご覧ください。 入門… <p>ぼやぼやしていたら、今年も半分過ぎたどころかもう8月ですって。今年まだ何もしてない気がします……<br /> というわけで9月ごろがんばります。東京の<a href="http://dtpstudy.blog51.fc2.com/blog-entry-6.html">DTP&#x306E;&#x52C9;&#x5F37;&#x4F1A; &#x7279;&#x5225;&#x7DE8;</a>でしゃべることになりました。すでに参加受付開始してます。</p> <blockquote> <p><a href="http://dtpstudy.blog51.fc2.com/blog-entry-6.html">DTP&#x306E;&#x52C9;&#x5F37;&#x4F1A; &#x7279;&#x5225;&#x7DE8;&#x30FB;&#x7B2C;2&#x56DE;</a><br /> 日時:<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CA%BF%C0%AE23%C7%AF">平成23年</a>9月17日(土)13時30分(13時より受付開始)〜18時(予定)<br /> 場所:大橋会館 201教室 <br /> [テーマ]<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/InDesign">InDesign</a>を<a class="keyword" href="http://d.hatena.ne.jp/keyword/JavaScript">JavaScript</a>でコン<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C8%A5%ED%A1%BC%A5%EB">トロール</a>する</p> </blockquote> <p>なんとあの<a href="http://www.ne.jp/asahi/tan/puku/">&#x305F;&#x3051;&#x3046;&#x3061;&#x3068;&#x304A;&#x308B;</a>さんと一緒ですよ。つまり私はオマケなのですが<a href="#f-e84ae3f4" name="fn-e84ae3f4" title="前にWindowsネタでしゃべったときもオマケでしたね">*1</a>、いまだに実感がわきません。どうすればいいんだー。<br /> 詳しい内容は告知ページでご覧ください。<br /> 入門ということでシンプルな課題がいくつか出ていますが、これを解けるのが参加の前提条件というわけではありません。当日は解説をしながら作成、そしてその場でさらに改造し、もう少し複雑な処理ができるようになるまでをお話ししていきます。<br /> あとお題がちょっと曖昧なのでそのうちフォロー入れます。</p> <div class="section"> <h4>「<a class="keyword" href="http://d.hatena.ne.jp/keyword/InDesign">InDesign</a>を<a class="keyword" href="http://d.hatena.ne.jp/keyword/JavaScript">JavaScript</a>でコン<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C8%A5%ED%A1%BC%A5%EB">トロール</a>する」</h4> <p>ってタイトルの通り、そしてお題を見てわかる通り、今回のテーマは「<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>使うとこんなすげーことできるぜヒャッハー!」というものではありません。むしろ地味です。時間かけて<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>をひねり出すよりは手作業でやったほうが早いかもしれない、くらいのことをあえてやろうとしてます。<br /> なぜかというと、「書けるようになる」が目標だからです。<br /> 大規模で複雑なワークフローがきっちり出来上がってるのでもない限り、実際の作業で自動化したい処理って意外とシンプルなものじゃないでしょうか。手作業でも多少時間をかければ終わる。でも<del datetime="2011-08-02T20:53:03+09:00">めんどくさい</del>その時間が惜しい。手作業ではミスが出るかも。そんなときにサクッと<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>が書けたら便利、という。一からは難しくても、サンプルやネットで公開されてる<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>を読んで少し改造すれば作れるとか。<br /> 私は実際そこからはじめて、今は一応業務で使える程度になっています。手作業よりは早く書けるようになってる……かな?<br /> というわけで、いきなり書けるようになるのは難しくても、そのきっかけになれたらいいなと思います。</p><p>今回のコンセプトについては、勉強会主催者のあかつきさんが<a href="http://pocketdtp.blog16.fc2.com/blog-entry-379.html">&#x8A73;&#x3057;&#x3044;&#x8A18;&#x4E8B;</a>を書かれていますので、そちらもどうぞ。</p> </div> <div class="section"> <h4>実を言えば</h4> <p>私がふだん書いてる<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>ってわりと偏ってまして、ほとんどがテキスト周りの処理です。これは業務がそっち側に偏っているからなんですが、問題は今回の課題がオブジェクトの位置とかから始まっていることで……自分で課題を解くために、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%B7%A4%E7%A4%C3%A4%D1%A4%CA%A4%AB%A4%E9">しょっぱなから</a>ぐぐったりサンプルコード見たりしております。<br /> こんなのがしゃべっていいのかと若干不安になりつつ、がんばりますのでお手柔らかに。</p> </div><div class="footnote"> <p class="footnote"><a href="#fn-e84ae3f4" name="f-e84ae3f4" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">前に<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a>ネタでしゃべったときもオマケでしたね</span></p> </div> chalcedony_htn ライブラリのアイテムを自動で配置する(InDesign CS3〜) hatenablog://entry/17680117126976452269 2011-07-05T12:40:54+09:00 2019-02-22T17:00:34+09:00 とってもお久しぶりです。最近アウトプット減ってて*1インプットも滞っています。 スクリプトもまとまったものはあまり書いてないんですが、久しぶりに汎用っぽいのができたのでおすそわけ。すでに書いてる人がいたらすいません…… ライブラリの各アイテムを自動でまとめて配置する たとえばコンピュータ関連の解説書とかで「Ctrl+Pを押します」なんて書いたりして、それぞれのキーを絵で表現したりするようなとき。 フォントを作っちゃうのも手なんですが、そこまでする数じゃないような場合はライブラリを使うと便利。 ただ、ひとつずつD&Dして配置するのはめんどくさいです。私なら3つくらいやったとこでイラッと来ます。 … <p>とってもお久しぶりです。最近アウトプット減ってて<a href="#f-092659df" name="fn-092659df" title="ついったー? あれはアウトプットとは言えん、少なくとも私の場合は……">*1</a>インプットも滞っています。<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>もまとまったものはあまり書いてないんですが、久しぶりに汎用っぽいのができたのでおすそわけ。すでに書いてる人がいたらすいません……</p> <div class="section"> <h4>ライブラリの各アイテムを自動でまとめて配置する</h4> <p>たとえばコンピュータ関連の解説書とかで「Ctrl+Pを押します」なんて書いたりして、それぞれのキーを絵で表現したりするようなとき。<br /> <span itemscope itemtype="http://schema.org/Photograph"><a href="http://f.hatena.ne.jp/chalcedony_htn/20110704183249" class="hatena-fotolife" itemprop="url"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/chalcedony_htn/20110704/20110704183249.png" alt="f:id:chalcedony_htn:20110704183249p:image" title="f:id:chalcedony_htn:20110704183249p:image" class="hatena-fotolife" itemprop="image"></a></span><br /> フォントを作っちゃうのも手なんですが、そこまでする数じゃないような場合はライブラリを使うと便利。<br /> <span itemscope itemtype="http://schema.org/Photograph"><a href="http://f.hatena.ne.jp/chalcedony_htn/20110704183250" class="hatena-fotolife" itemprop="url"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/chalcedony_htn/20110704/20110704183250.png" alt="f:id:chalcedony_htn:20110704183250p:image" title="f:id:chalcedony_htn:20110704183250p:image" class="hatena-fotolife" itemprop="image"></a></span><br /> ただ、ひとつずつ<a class="keyword" href="http://d.hatena.ne.jp/keyword/D%26D">D&D</a>して配置するのはめんどくさいです。私なら3つくらいやったとこでイラッと来ます。<br /> というわけでこんなのを書きました。テストは<a class="keyword" href="http://d.hatena.ne.jp/keyword/WinXP">WinXP</a> SP3、<a class="keyword" href="http://d.hatena.ne.jp/keyword/InDesign">InDesign</a> CS4でのみ行っています。<br /> <span itemscope itemtype="http://schema.org/Photograph"><a href="http://f.hatena.ne.jp/chalcedony_htn/20110704183251" class="hatena-fotolife" itemprop="url"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/chalcedony_htn/20110704/20110704183251.png" alt="f:id:chalcedony_htn:20110704183251p:image" title="f:id:chalcedony_htn:20110704183251p:image" class="hatena-fotolife" itemprop="image"></a></span><br /> ↓↓↓<br /> <span itemscope itemtype="http://schema.org/Photograph"><a href="http://f.hatena.ne.jp/chalcedony_htn/20110704183248" class="hatena-fotolife" itemprop="url"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/chalcedony_htn/20110704/20110704183248.png" alt="f:id:chalcedony_htn:20110704183248p:image" title="f:id:chalcedony_htn:20110704183248p:image" class="hatena-fotolife" itemprop="image"></a></span><br /> 「#(半角英数のアイテム名)」という文字列が選択範囲内に見つかったら、指定したライブラリ内の同名アイテムで置換します。何も選択していない場合はドキュメント全体を処理します。<br /> 配置したオブジェクトはインラインオブジェクトになります。インラインオブジェクトの各種テキストスタイル属性は置換元の最後の文字(「#name」なら「e」)と同じになります。</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synComment">// 選択部分が対象</span> <span class="synIdentifier">var</span> target = app.selection; <span class="synComment">// 何か選択されていたらその中だけ。選択してなければドキュメント全体が対象</span> target = (target.length &gt; 0) ? target<span class="synIdentifier">[</span>0<span class="synIdentifier">]</span> : app.activeDocument; <span class="synComment">// ライブラリから読み込み。ファイル名を指定。InDesign上で開いてないとだめです</span> <span class="synIdentifier">var</span> lib = app.libraries.itemByName(<span class="synConstant">&quot;keylib.indl&quot;</span>); <span class="synComment">// ★</span> <span class="synComment">// 検索条件(「#半角英数」の最長一致)</span> app.findGrepPreferences = NothingEnum.nothing; app.findGrepPreferences.findWhat = <span class="synConstant">&quot;#[0-9A-z]+&quot;</span>; <span class="synComment">// 検索実行</span> <span class="synIdentifier">var</span> f = target.findGrep(); <span class="synComment">// 検索で引っかかった部分を後ろから順番に処理</span> <span class="synComment">// 置換によって文字数が変わる処理なので前からやると泣きを見ます</span> <span class="synStatement">for</span>(<span class="synIdentifier">var</span> i = f.length-1; i &gt; -1; i--)<span class="synIdentifier">{</span> <span class="synIdentifier">var</span> name = f<span class="synIdentifier">[</span>i<span class="synIdentifier">]</span>.contents.substr(1); <span class="synComment">// 検索された文字列をアイテム名として扱う。substrは「#」を取り除く処理</span> <span class="synIdentifier">var</span> asset = lib.assets.itemByName(name); <span class="synComment">// 名前からライブラリのアイテムを特定</span> <span class="synStatement">try</span> <span class="synIdentifier">{</span> asset.placeAsset(f<span class="synIdentifier">[</span>i<span class="synIdentifier">]</span>.insertionPoints<span class="synIdentifier">[</span>-1<span class="synIdentifier">]</span>); <span class="synComment">// 配置(検索された文字列の最後にくっつける)</span> f<span class="synIdentifier">[</span>i<span class="synIdentifier">]</span>.characters.itemByRange(0, -1).remove(); <span class="synComment">// 検索された文字列を削除(最後にくっつけたアイテムは残す)</span> <span class="synIdentifier">}</span> <span class="synStatement">catch</span>(e)<span class="synIdentifier">{</span> <span class="synComment">// エラーが起きたらスルー</span> <span class="synIdentifier">}</span> <span class="synIdentifier">}</span> </pre><p>注意点は画像に書いたとおり。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%B5%B5%AC%C9%BD%B8%BD">正規表現</a>検索の使えるCS3以上が対象、アイテム名に半角英数以外は(記号も)使えません。<br /> 使うときは★をつけた行でライブラリ名(ファイル名)を指定してください。</p> </div> <div class="section"> <h4>場合によるとは思うけど</h4> <p>実際使うときは、元の「#アイテム名」のテキストに文字スタイルをつけておいて、その文字スタイル限定で検索するようにしたほうが安全じゃないかと思います。<br /> 検索条件のとこに</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink>app.findGrepPreferences.appliedCharacterStyle = <span class="synConstant">&quot;ほげほげ文字スタイル名&quot;</span>; </pre><p>とか追加したり。処理後のインラインオブジェクトに文字スタイルが残るので、あとでまとめて検索もしやすいです。</p> </div> <div class="section"> <h4>以下、蛇足</h4> <p>せっかくなので勉強がてらちょっぴり修正してみます。</p><p>名前を発見するたびにいちいちライブラリを見に行くのは効率悪い気がしたので、最初にアイテムをリストアップしてアイテム名をキーとするオブジェクトに格納してしまうことにしました。<br /> ついでに、いちいち選択解除するのがめんどくさいので、テキストカーソルを立ててるだけの状態のときはドキュメント全体を処理するようにします。あとコメント消したり無名関数でくるんでしまったりその他もろもろまとめ書きして……</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink>(<span class="synIdentifier">function</span>()<span class="synIdentifier">{</span> <span class="synIdentifier">var</span> libname = <span class="synConstant">&quot;keylib.indl&quot;</span>; <span class="synIdentifier">var</span> target = (app.selection.length &gt; 0) ? app.selection<span class="synIdentifier">[</span>0<span class="synIdentifier">]</span> : app.activeDocument; target = (target.constructor.name == <span class="synConstant">&quot;InsertionPoint&quot;</span>) ? app.activeDocument : target; <span class="synIdentifier">var</span> assets = <span class="synIdentifier">{}</span>; <span class="synIdentifier">var</span> lib = app.libraries.itemByName(libname); <span class="synStatement">for</span>(<span class="synIdentifier">var</span> i = 0, alen = lib.assets.length; i&lt; alen; i++)<span class="synIdentifier">{</span> <span class="synIdentifier">var</span> tmp_a = lib.assets<span class="synIdentifier">[</span>i<span class="synIdentifier">]</span>; assets<span class="synIdentifier">[</span>tmp_a.name<span class="synIdentifier">]</span> = tmp_a; <span class="synIdentifier">}</span> app.findGrepPreferences = NothingEnum.nothing; app.findGrepPreferences.findWhat = <span class="synConstant">&quot;#[0-9A-z]+&quot;</span>; <span class="synIdentifier">var</span> f = target.findGrep(); <span class="synStatement">for</span>(<span class="synIdentifier">var</span> i = f.length-1; i &gt; -1; i--)<span class="synIdentifier">{</span> <span class="synIdentifier">var</span> tmp_f = f<span class="synIdentifier">[</span>i<span class="synIdentifier">]</span>; <span class="synStatement">try</span> <span class="synIdentifier">{</span> assets<span class="synIdentifier">[</span>tmp_f.contents.substr(1)<span class="synIdentifier">]</span>.placeAsset(tmp_f.insertionPoints<span class="synIdentifier">[</span>-1<span class="synIdentifier">]</span>); tmp_f.characters.itemByRange(0, -1).remove(); <span class="synIdentifier">}</span> <span class="synStatement">catch</span>(e)<span class="synIdentifier">{}</span> <span class="synIdentifier">}</span> <span class="synIdentifier">}</span>)(); </pre><p>こんな感じ。</p><p>で、よーしと思って大量に配置するサンプルを用意して処理速度を計ってみたら……ほとんど変わんなかったorz<br /> ネックはどこにあるのかな<a href="#f-4b0e8619" name="fn-4b0e8619" title="無名関数とかやめたり、思いつく限りいろいろ削ってみたけど大差なしだった">*2</a>。ドキュメントを描画なしで開いて処理したら速そうな予感はあるけど、心折れたので試してません。</p> </div> <div class="section"> <h4>さらに蛇足(未解決)</h4> <p>最初に書いたとき、置換処理は次のように書いてました。</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synComment">// ~~~~~~~~~~</span> <span class="synIdentifier">var</span> asset = lib.assets.itemByName(f<span class="synIdentifier">[</span>i<span class="synIdentifier">]</span>.contents.substr(1)); <span class="synComment">// fはfindGrep()の戻り値</span> <span class="synStatement">try</span> <span class="synIdentifier">{</span> asset.placeAsset(f<span class="synIdentifier">[</span>i<span class="synIdentifier">]</span>.texts<span class="synIdentifier">[</span>0<span class="synIdentifier">]</span>); <span class="synIdentifier">}</span> <span class="synStatement">catch</span>(e)<span class="synIdentifier">{}</span> <span class="synComment">// ~~~~~~~~~~</span> </pre><p>検索で引っかかったテキスト部分をplaceAssetで上書きしてしまえばいいと思ったのです。<br /> 実際それでもうまくいっていたんですが、「#name#name」など検索対象が連続しているときに不具合が出ました(前のほうの#name、つまりあとに処理されるほうが置換されない)。<br /> いろいろ調べた結果、二回目の(つまり前のほうの)f[i].contentsに直後のインラインオブジェクトまで含まれてしまうからということがわかりました。それで「『name(オブジェクト)』なんて名前のアイテムはない」と処理がスキップされたようです。<br /> f[i].toSpecifier()すると範囲は5文字ぶんのはずなのに、f[i].lengthをとると6が出て、f[i].contentsを表示してみると最後にオブジェクトが入っているという謎現象。私の理解がへんなのかなあ?<br /> ……とりあえず回避するため、textを扱うのは危険ということで文字単位で追加、文字単位で削除という形にしたのでした。<br /> うーん?</p> </div><div class="footnote"> <p class="footnote"><a href="#fn-092659df" name="f-092659df" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">ついったー? あれはアウトプットとは言えん、少なくとも私の場合は……</span></p> <p class="footnote"><a href="#fn-4b0e8619" name="f-4b0e8619" class="footnote-number">*2</a><span class="footnote-delimiter">:</span><span class="footnote-text">無名関数とかやめたり、思いつく限りいろいろ削ってみたけど大差なしだった</span></p> </div> chalcedony_htn InDesignで配置実行前にデフォルトの文字スタイルを[なし]にする(CS3〜) hatenablog://entry/17680117126976452349 2010-09-08T01:38:17+09:00 2019-02-22T17:00:36+09:00 お久しぶりですこんばんは。主にやる気の問題でご無沙汰しておりました。 InDesignのタグ付きテキスト配置にありがちなこと タグ付きテキストを[配置]で流し込むとき、タグで指定していないはずのスタイルが適用されてしまうことがあります。デフォルト状態(アプリケーション上で何も選択していない状態)のときにパネルで選んでおいたスタイルが、タグでスタイルを明示していない部分のテキストに適用されるためです。 うまく使えば便利なときもあるかもしれませんが、うっかりやらかしたときはがっくり来ますorz ……ありがちとか言ったけど、私だけだったらどうしよう。まあいい。 うっかり防止隊をつくろう というわけで… <p>お久しぶりですこんばんは。主にやる気の問題でご無沙汰しておりました。</p> <div class="section"> <h4><a class="keyword" href="http://d.hatena.ne.jp/keyword/InDesign">InDesign</a>のタグ付きテキスト配置にありがちなこと</h4> <p>タグ付きテキストを[配置]で流し込むとき、タグで指定していないはずのスタイルが適用されてしまうことがあります。デフォルト状態(アプリケーション上で何も選択していない状態)のときにパネルで選んでおいたスタイルが、タグでスタイルを明示していない部分のテキストに適用されるためです。<br /> うまく使えば便利なときもあるかもしれませんが、うっかりやらかしたときはがっくり来ますorz<br /> ……ありがちとか言ったけど、私だけだったらどうしよう。まあいい。</p> </div> <div class="section"> <h4>うっかり防止隊をつくろう</h4> <p>というわけで、やらかしそうになったときに<a class="keyword" href="http://d.hatena.ne.jp/keyword/InDesign">InDesign</a>が防止してくれる<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>を作りました。<br /> 具体的には、[配置]を(メニューからでも、ショートカットからでも)実行するときに、デフォルトの文字スタイルを[なし]に設定してくれるというものです<a href="#f-9c312425" name="fn-9c312425" title="配置するのがテキストかどうかは判定しない(できない)ので、画像を配置したいときにも処理が行われます">*1</a> <a href="#f-0d9508c1" name="fn-0d9508c1" title="段落スタイルをタグで明示しないことはあんまりないと思うので、今回は無視しています">*2</a>。<br /> メニューやイベントを使っているため、<a class="keyword" href="http://d.hatena.ne.jp/keyword/InDesign">InDesign</a> CS3以降でしか動きません。いつものことですが、動作確認は<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows%20XP">Windows XP</a>(SP3)、<a class="keyword" href="http://d.hatena.ne.jp/keyword/InDesign">InDesign</a> CS4でのみ行っています。</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synComment">// 配置前にデフォルト文字スタイルを[なし]にする</span> #targetengine <span class="synConstant">&quot;noDefaultCharaStyle&quot;</span> (<span class="synIdentifier">function</span>()<span class="synIdentifier">{</span> <span class="synComment">// [配置...]メニューのbeforeInvokeイベントが起きたときに実行する処理を設定</span> app.menuActions.item(<span class="synConstant">&quot;$ID/Place...&quot;</span>).addEventListener(<span class="synConstant">&quot;beforeInvoke&quot;</span>, <span class="synIdentifier">function</span>(<span class="synStatement">event</span>)<span class="synIdentifier">{</span> <span class="synComment">// ドキュメントはイベント発生時に都度確認する</span> <span class="synIdentifier">var</span> actDoc = app.activeDocument; <span class="synComment">// すでにデフォルト文字スタイルが[なし]のときは何もせず終了</span> <span class="synStatement">if</span>( actDoc.textDefaults.appliedCharacterStyle.index == 0 )<span class="synIdentifier">{</span> <span class="synStatement">return</span>; <span class="synIdentifier">}</span> <span class="synComment">// デフォルト文字スタイルを[なし]に変更</span> actDoc.textDefaults.appliedCharacterStyle = actDoc.characterStyles<span class="synIdentifier">[</span>0<span class="synIdentifier">]</span>; <span class="synIdentifier">}</span>); <span class="synComment">// イベントハンドラ設定ここまで</span> <span class="synIdentifier">}</span>)(); </pre><p>だいたいコメントの通りですが、[配置]が選択されて実行される直前(beforeInvoke)に毎回デフォルトの文字スタイルを確認し、[なし]になっていなかったら変更する処理を行うよう設定します。<br /> この<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>を実行しただけでは何も起きません(起きたように見えません)が、<a class="keyword" href="http://d.hatena.ne.jp/keyword/InDesign">InDesign</a>側ではうっかり防止隊が結成されています。Scriptsフォルダの下のStartup Scriptsフォルダ(なかったら自分で作る必要あり)に入れておいて、<a class="keyword" href="http://d.hatena.ne.jp/keyword/InDesign">InDesign</a>の起動時に毎回実行されるようにしておくと便利かもしれません。<br /> そうそう、この<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>は<a class="keyword" href="http://d.hatena.ne.jp/keyword/ExtendScript">ExtendScript</a> Toolkitから実行すると動きませんので、使うときはファイルに保存して<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>パネル上から実行する必要があります<a href="#f-96804c49" name="fn-96804c49" title="tergetengineの指定が必要なだけなので、正確に言えば初回だけファイルから起動すればInDesignの再起動まではESTK上からでも動きますが……ていうか名前がてきとうすぎる">*3</a>。</p><p>うっかり防止隊は<a class="keyword" href="http://d.hatena.ne.jp/keyword/InDesign">InDesign</a>が終了した時に解散になります。<a class="keyword" href="http://d.hatena.ne.jp/keyword/InDesign">InDesign</a>を終了させずにこの設定を解除したいときは、</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synComment">// 配置実行前の処理を消去する</span> #targetengine <span class="synConstant">&quot;noDefaultCharaStyle&quot;</span> (<span class="synIdentifier">function</span>()<span class="synIdentifier">{</span> <span class="synIdentifier">var</span> listeners = app.menuActions.item(<span class="synConstant">&quot;$ID/Place...&quot;</span>).eventListeners; <span class="synStatement">for</span>( <span class="synIdentifier">var</span> i = listeners.length -1; i &gt; -1; i-- )<span class="synIdentifier">{</span> <span class="synStatement">if</span>( listeners<span class="synIdentifier">[</span>i<span class="synIdentifier">]</span>.eventType == <span class="synConstant">&quot;beforeInvoke&quot;</span> )<span class="synIdentifier">{</span> listeners<span class="synIdentifier">[</span>i<span class="synIdentifier">]</span>.remove(); <span class="synIdentifier">}</span> <span class="synIdentifier">}</span> <span class="synIdentifier">}</span>)(); </pre><p>これを実行すればOKです<a href="#f-bbfdfcc2" name="fn-bbfdfcc2" title="ただしこれだと[配置]のbeforeInvokeイベントハンドラが全部消えます、手抜きです">*4</a>。</p> </div> <div class="section"> <h4>うっかり防止隊をちょっと親切にしてみる</h4> <p>最初の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>だと、文字スタイルで[なし]以外を選んだまま配置したいときには一度設定を解除しなければなりません。それはそれで、逆うっかりをやらかす可能性があります。<br /> なので少し改良して、配置するときに文字スタイルを[なし]にするかどうか訪ねるダイアログが出せるようにしてみました。</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synComment">// 配置前にデフォルト文字スタイルを[なし]にする</span> #targetengine <span class="synConstant">&quot;noDefaultCharaStyle&quot;</span> (<span class="synIdentifier">function</span>()<span class="synIdentifier">{</span> <span class="synComment">// ★変更前に毎回確認のダイアログを出すかどうか設定する</span> <span class="synComment">// (true:確認する false:確認しない)</span> <span class="synComment">// ----------------------------------</span> <span class="synIdentifier">var</span> askBefore = <span class="synConstant">true</span>; <span class="synComment">// ----------------------------------</span> <span class="synComment">// [配置...]メニューのbeforeInvokeイベントが起きたときに実行する処理を設定</span> app.menuActions.item(<span class="synConstant">&quot;$ID/Place...&quot;</span>).addEventListener(<span class="synConstant">&quot;beforeInvoke&quot;</span>, <span class="synIdentifier">function</span>(<span class="synStatement">event</span>)<span class="synIdentifier">{</span> <span class="synComment">// ドキュメントはイベント発生時に都度確認する</span> <span class="synIdentifier">var</span> actDoc = app.activeDocument; <span class="synComment">// すでにデフォルト文字スタイルが[なし]のときは何もせず終了</span> <span class="synStatement">if</span>( actDoc.textDefaults.appliedCharacterStyle.index == 0 )<span class="synIdentifier">{</span> <span class="synStatement">return</span>; <span class="synIdentifier">}</span> <span class="synComment">// 毎回確認する設定(askBeforeがtrue)ならダイアログを出す</span> <span class="synStatement">if</span>( askBefore )<span class="synIdentifier">{</span> <span class="synIdentifier">var</span> dlg = <span class="synStatement">new</span> Window(<span class="synConstant">&quot;dialog&quot;</span>, <span class="synConstant">&quot;うっかりしてませんか!&quot;</span>); dlg.add(<span class="synConstant">&quot;statictext&quot;</span>, <span class="synStatement">undefined</span>, <span class="synConstant">&quot;デフォルト文字スタイルを[なし]にしますか?&quot;</span>); dlg.bGroup = dlg.add(<span class="synConstant">&quot;group&quot;</span>); dlg.bGroup.orientation = <span class="synConstant">&quot;row&quot;</span>; dlg.bGroup.add(<span class="synConstant">&quot;button&quot;</span>, <span class="synStatement">undefined</span>, <span class="synConstant">&quot;はい&quot;</span>, <span class="synIdentifier">{</span>name:<span class="synConstant">&quot;OK&quot;</span><span class="synIdentifier">}</span>); dlg.bGroup.add(<span class="synConstant">&quot;button&quot;</span>, <span class="synStatement">undefined</span>, <span class="synConstant">&quot;いいえ&quot;</span>, <span class="synIdentifier">{</span>name:<span class="synConstant">&quot;Cancel&quot;</span><span class="synIdentifier">}</span>); <span class="synStatement">if</span>( dlg.show() != 1 )<span class="synIdentifier">{</span> <span class="synStatement">return</span>; <span class="synIdentifier">}</span> <span class="synComment">// 「はい」ボタン以外なら何もせず終了</span> <span class="synIdentifier">}</span> <span class="synComment">// デフォルト文字スタイルを[なし]に変更</span> actDoc.textDefaults.appliedCharacterStyle = actDoc.characterStyles<span class="synIdentifier">[</span>0<span class="synIdentifier">]</span>; <span class="synIdentifier">}</span>); <span class="synComment">// イベントハンドラ設定ここまで</span> <span class="synIdentifier">}</span>)(); </pre><p>★のところの変数askBeforeをtrueにしておくと、配置ダイアログが出る前に文字スタイルを変更するかどうかのダイアログが出るようになります。こんなの↓<br /> <span itemscope itemtype="http://schema.org/Photograph"><a href="http://f.hatena.ne.jp/chalcedony_htn/20100909013325" class="hatena-fotolife" itemprop="url"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/chalcedony_htn/20100909/20100909013325.png" alt="f:id:chalcedony_htn:20100909013325p:image" title="f:id:chalcedony_htn:20100909013325p:image" class="hatena-fotolife" itemprop="image"></a></span><br /> falseにすれば確認なしで変更します。<br /> もちろん、確認ダイアログが出るのは[なし]以外の文字スタイルが選択されているときだけです。うっかり防止を名乗るならこうでなくてはね!<br /> なお、これを解除したいときにもさっきの削除用<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>が使えます。</p> </div> <div class="section"> <h4>これさえあれば</h4> <p>タグ付きテキストの配置で延々待たされたあげくに「見つからない字形の保護」とか言われて orz ってなることもなくなるはずだっ!</p> </div><div class="footnote"> <p class="footnote"><a href="#fn-9c312425" name="f-9c312425" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">配置するのがテキストかどうかは判定しない(できない)ので、画像を配置したいときにも処理が行われます</span></p> <p class="footnote"><a href="#fn-0d9508c1" name="f-0d9508c1" class="footnote-number">*2</a><span class="footnote-delimiter">:</span><span class="footnote-text">段落スタイルをタグで明示しないことはあんまりないと思うので、今回は無視しています</span></p> <p class="footnote"><a href="#fn-96804c49" name="f-96804c49" class="footnote-number">*3</a><span class="footnote-delimiter">:</span><span class="footnote-text">tergetengineの指定が必要なだけなので、正確に言えば初回だけファイルから起動すれば<a class="keyword" href="http://d.hatena.ne.jp/keyword/InDesign">InDesign</a>の再起動まではESTK上からでも動きますが……ていうか名前がてきとうすぎる</span></p> <p class="footnote"><a href="#fn-bbfdfcc2" name="f-bbfdfcc2" class="footnote-number">*4</a><span class="footnote-delimiter">:</span><span class="footnote-text">ただしこれだと[配置]のbeforeInvoke<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%D9%A5%F3%A5%C8%A5%CF%A5%F3%A5%C9%A5%E9">イベントハンドラ</a>が全部消えます、手抜きです</span></p> </div> chalcedony_htn DTP Booster 013の予習:スクリプト作成過程を実況してみた hatenablog://entry/17680117126976452428 2010-06-03T18:53:43+09:00 2019-02-22T17:00:38+09:00 注:この記事の内容は、アップの数日前(DTP Booster 013受講前)に書かれたものです。アップするかどうか受講後に悩みましたが、結局貧乏性(モッタイナイ)に負けて載せてしまうことにしました。参加予定のDTP Booster 013(Omotesando/100602)はスクリプトがテーマ。 事前に講師のうちのお一人であるたけうちとおる氏がブログでお題を出されていたので、せっかくだから先に挑戦してみることにしました。 いい機会なので、以前からやってみたいと思っていた「スクリプト作成過程の公開」をしてみます。なんのために? もちろん自分のために。アウトプットは人のためならず。 セミナー前に… <p><span style="color:#0000FF;">注:この記事の内容は、アップの数日前(<a class="keyword" href="http://d.hatena.ne.jp/keyword/DTP">DTP</a> Booster 013受講前)に書かれたものです。アップするかどうか受講後に悩みましたが、結局貧乏性(モッタイナイ)に負けて載せてしまうことにしました。</span></p><p><hr /></p><p>参加予定の<a href="http://www.dtp-booster.com/vol13/">DTP Booster 013&#xFF08;Omotesando/100602&#xFF09;</a>は<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>がテーマ。<br /> 事前に講師のうちのお一人であるたけうちとおる氏が<a href="http://www.adg7.com/takenote_b/2010/05/dtp-booster-13-1.html">&#x30D6;&#x30ED;&#x30B0;&#x3067;&#x304A;&#x984C;&#x3092;&#x51FA;&#x3055;&#x308C;&#x3066;&#x3044;&#x305F;</a>ので、せっかくだから先に挑戦してみることにしました。<br /> いい機会なので、以前からやってみたいと思っていた「<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>作成過程の公開」をしてみます。なんのために? もちろん自分のために。アウトプットは人のためならず。<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BB%A5%DF">セミ</a>ナー前に書いておいて、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BB%A5%DF">セミ</a>ナー後に無編集でアップする予定です。調べたり考えたり失敗したり、とにかく全部書きとめていくので凄まじく長いです。結果だけ見たいという場合は<a href="#exportPDFScript_100603_latest">ここ</a>から飛べます。</p><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/JavaScript">JavaScript</a>で、<a class="keyword" href="http://d.hatena.ne.jp/keyword/InDesign">InDesign</a> CS4で動くことを目指して作成します。動作確認は<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows%20XP">Windows XP</a>&<a class="keyword" href="http://d.hatena.ne.jp/keyword/InDesign">InDesign</a> 6.0.5のみで行います。</p> <div class="section"> <h4>まずは、お題を読む</h4> <blockquote cite="http://www.adg7.com/takenote_b/2010/05/dtp-booster-13-1.html"> <p>「開いているドキュメントをすべてPDF書き出しする」<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>を作って下さい。</p> <cite><a href="http://www.adg7.com/takenote_b/2010/05/dtp-booster-13-1.html">DTP Booster 13&#x306E;&#x304A;&#x984C; - &#x305F;&#x3051;&#x3046;&#x3061;&#x3068;&#x304A;&#x308B;&#x306E;&#x30B9;&#x30AF;&#x30EA;&#x30D7;&#x30C8;&#x30CE;&#x30FC;&#x30C8;</a></cite> </blockquote> <p>シンプルだ。そして実用的。<br /> たぶん<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>書く人ならとっくに自分で作っていそうな気がするし、作らない人でもWebで公開されている数々のありがたい<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>を利用しているのではないかと思う。私は一つずつドキュメントを確かめながら書き出していくから使ってなかったけど。<br /> っていうかそもそもたけうち氏のブログに置いてなかったっけ、と思って調べたら<a href="http://www.adg7.com/takenote_b/2010/04/30pdf-3.html">&#x6848;&#x306E;&#x5B9A;&#x3042;&#x308A;&#x307E;&#x3057;&#x305F;</a>。ダイアログの出る親切設計。でもお題なので、今だけ見なかったことにしよう。</p><p>この時点で、この処理を実現するには「PDFを書き出す処理を」「開いているドキュメントすべてに対して繰り返し行う」という形の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>になるなあとぼんやり考える。<br /> 繰り返し処理は基本なので簡単。開いているドキュメントをすべて取得する方法もわかる。あとはPDF書き出し処理か……どうやって書くんだっけかな。一度調べようとしたことがあるはずだけど、もう完全に忘れ去りましたね。</p> </div> <div class="section"> <h4>お題をさらに読む</h4> <p>書き出すPDFの設定その他について追記がありました。</p> <blockquote> <p>書き出されるPDFはドキュメントと同じファイル名で(拡張子が.pdfになる)同一階層に保存されるとします。</p> </blockquote> <p>とりあえず、処理するドキュメントのファイル名(と、たぶんパス)を取得する必要があるっぽい。</p> <blockquote> <p>PDF書き出しプリセットは「PDFx/1-a」です。</p> </blockquote> <p>たぶん書き出しするメソッドにプリセットを指定する引数があるんだな……などと、普通はリファレンス見てから知ることだけど今回はヒントのおかげで知る。でも具体的な指定方法はやっぱり調べないとね。</p> <blockquote> <p>PDFを書き出したドキュメントは保存せずに閉じます。</p> </blockquote> <p>ふむ。これはとりあえず書き出しが終わった後のことだから後で考えよう。</p> <blockquote> <p>20行以内で出来ると思います。<br /> 多少のエラー処理はしなくて結構です。</p> </blockquote> <p>行数指定きたー。でもあんまり気にしないでおこう。ただの目安と思っておく。<br /> 多少のエラー処理っていうのは、たぶんドキュメントがひとつも開かれていない場合とかそんな感じのことだろう。お言葉に甘えてそのへんはざっくり省略することに。</p> </div> <div class="section"> <h4>わかるところから書き始めてみる</h4> <p>なんとなく方向性がみえたところでおもむろに書き始めます。<br /> まずは骨組みとしてドキュメント取得と繰り返し処理の部分を用意。後で必要になる処理をコメントで書き込んでおこう。</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synIdentifier">var</span> docs = app.documents; <span class="synComment">// 現在開いているすべてのドキュメントを得る</span> <span class="synComment">// ドキュメントの数だけループ</span> <span class="synStatement">for</span>( <span class="synIdentifier">var</span> i = 0, docLen = docs.length; i &lt; docLen; i++ ) <span class="synIdentifier">{</span> <span class="synIdentifier">var</span> tmpDoc = docs<span class="synIdentifier">[</span>i<span class="synIdentifier">]</span>; <span class="synComment">// 今処理してるドキュメント</span> <span class="synComment">// ★ドキュメントのPDF書き出しを実行</span> <span class="synComment">// ★ドキュメントを閉じる(保存しない)</span> <span class="synIdentifier">}</span> <span class="synComment">// ここまでループ</span> </pre><p>forループのときに繰り返す回数を変数に入れておくのは癖のようなもの。処理中のオブジェクトを変数に入れておくのも同じ。プロパティへのアクセスは結構時間がかかるものなんだとWebな人たちから聞いたので。この程度だと大して変わらない気がするけど。</p><p>あとは、★のついたところを埋めていくだけだな!</p> </div> <div class="section"> <h4>PDF書き出し処理はどう書くの</h4> <p>というところがわからないので、ここでリファレンスの出番です。ESTK付属の「オブジェクトモデルビューア」を起動。表示するオブジェクトモデルで「<a class="keyword" href="http://d.hatena.ne.jp/keyword/InDesign">InDesign</a> CS4(6.0)」を選ぶのを忘れずに。<br /> 「書き出し」ってくらいだからたぶんexportとか検索したら出てくるんじゃないの、と試しに検索してみたところ、</p> <blockquote> <p><span style="color:#FF0000;">検索結果が多すぎます。検索内容を絞ってください。</span></p> </blockquote> <p>(ノ`Д´)ノ彡┻━┻</p><p>……気を取り直して続ける。<br /> 「ドキュメントを」PDFファイルに書き出すって動作をすることになるので、たぶんDocumentクラス(クラスでいいのかな<a href="#f-a1fba5e5" name="fn-a1fba5e5" title="JavaScriptから入ったクチだからか、クラスとかインスタンスとかいうのがよくわかっていません">*1</a>)のあたりにそういうメソッドが用意されてるんじゃないかと予想を立てる。このへんはただの勘のようなもので、なぜそう思ったか説明できない……ちなみに、この予想が外れたりそもそも見当がつかなかったりした場合は潔くぐぐります。</p><p>ともかく、まずはDocumentクラスを調べてみる。オブジェクトモデルのブラウザでDocumentを選び、下に出てくるメソッド群からexportっぽいものを探す。ありました。「exportFile」メソッド。</p> <blockquote> <p>Document.exportFile (format, to, showingOptions, using, withGrids, versionComments, forceSave)</p><br /> <p>Exports the object(s) to a file.</p> </blockquote> <p>オブジェクト(この場合はドキュメント)をファイルに書き出す。そのままだ。<br /> あとは引数の正体を調べる。</p> <table> <tr> <th>引数</th> <th>引数の型</th> <th>意味</th> </tr> <tr> <td>format</td> <td>-</td> <td>書き出すファイルの形式。</td> </tr> <tr> <td>to</td> <td>File</td> <td>書き出すファイル。</td> </tr> <tr> <td>showingOptions</td> <td>Boolean</td> <td>オプション。書き出しのときダイアログを出すかどうか。デフォルトはfalse。</td> </tr> <tr> <td>using</td> <td>PDFExportPreset</td> <td>オプション。書き出し方式。ここがPDFの書き出しプリセットっぽい。</td> </tr> <tr> <td>withGrids</td> <td>Boolean</td> <td>オプション。グリッドを書き出すかどうか。デフォルトはfalse。</td> </tr> <tr> <td>versionComments</td> <td>String</td> <td>オプション。このバージョンのためのコメント?</td> </tr> <tr> <td>forceSave</td> <td>Boolean</td> <td>オプション。強制的に上書き保存するかどうか? デフォルトはfalse。</td> </tr> </table><p>最後のほう適当ですがあんまり関係なさそうなので……というか、普段こんなきっちり考えない。使いそうな引数だけ拾い読みですよ。英語だし。</p><p>ということで、このメソッドを実行するときにPDF形式を選べるようだ。「ファイル名」と「プリセット」も設定できそう。</p> </div> <div class="section"> <h4>PDF形式で書き出す指定</h4> <p>引数formatのところでPDF形式で書き出すよう指定するらしい。リファレンスには「Can accept: ExportFormat enumerator or String.」と書いてある……文字列で指定できるようだけど、きっと適当に「PDF」とか書いてもダメなんだろうな。<br /> とりあえず「ExportFormat」をオブジェクトビューアで検索して、同名のクラスに「PDF_TYPE」ってプロパティがあるのを発見。たぶん、これを書けばいいんだと思う。やってみてダメだったらぐぐろう。</p> </div> <div class="section"> <h4>Fileオブジェクト?</h4> <p>出たな妖怪! いや妖怪じゃないけど、個人的にいまだに理解しきれない領域、それがFileとFolder。<br /> 書き出しメソッドの引数toには、書き出すファイルのFileオブジェクト(Fileクラスの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>? っていうの?)を用意しなきゃならないらしい。<br /> Fileオブジェクトを生成する方法は、</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synIdentifier">var</span> fileObj = <span class="synStatement">new</span> File(<span class="synConstant">&quot;ファイル名まで含んだパスの文字列&quot;</span>); </pre><p>でいいはず。この場合に必要な文字列は、「ドキュメントのファイルパスから拡張子を取り除いた文字列」+「.pdf」。<br /> というわけで、まずは処理中のドキュメントのフルパスを取得しなければ。</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synIdentifier">var</span> tmpDocFileObj = tmpDoc.fullName; <span class="synComment">// tmpDocは処理中のドキュメント</span> </pre><p>fullNameプロパティの値はFileオブジェクトらしいのでそのままでは使えない。さらにこのファイルのフルパスを取得。</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synIdentifier">var</span> fileStr = tmpDocFileObj.fullName; <span class="synComment">// tmpDocFileObjはさっき取得したFileオブジェクト</span> </pre><p>さっきと同じfullNameって名前のプロパティだからややこしいけど、これで処理中のドキュメントのファイルパスが文字列で取得できたことになる。<br /> でもって、これだと変数fileStrには拡張子「.indd」までついているはず。なのでそれを取っ払って、拡張子「.pdf」をくっつけてやらないといけない。<br /> 後ろ5文字削ってから足してもいいけど、ここは<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%B5%B5%AC%C9%BD%B8%BD">正規表現</a>置換といこうじゃないか。<a href="#f-966f4c05" name="fn-966f4c05" title="たぶん指定文字数削って足すほうが速いんだろうけど">*2</a></p> <pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synComment">// 行末にある「.(なんでもおk)」を「.pdf」に置換</span> fileStr = fileStr.replace(<span class="synConstant">/\.[^.]*$/</span>,<span class="synConstant">&quot;.pdf&quot;</span>); </pre><p>これでやっと、書き出すPDFファイルのFileオブジェクトを作ることができる。</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synIdentifier">var</span> fileObj = <span class="synStatement">new</span> File(fileStr); <span class="synComment">// fileStrは(以下略</span> </pre><p>せっかくだからここまでの過程を一行にまとめてみよう。</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synComment">// tmpDocは処理中のドキュメント</span> <span class="synIdentifier">var</span> fileObj = <span class="synStatement">new</span> File(tmpDoc.fullName.fullName.replace(<span class="synConstant">/\.[^.]*$/</span>,<span class="synConstant">&quot;.pdf&quot;</span>)); </pre><p>このfileObjを、書き出しメソッドの引数として使えばいいはずだ!</p><p>さっきかららしいとかはずとかばっかり。手探りでやってるから仕方ない。<br /> でも正直、今書いている過程でちょっと理解が進みました。とりあえず今回の妖怪は退治できた……かな?</p> </div> <div class="section"> <h4>PDF書き出しプリセット</h4> <p>最後の大物、書き出しプリセットの指定。例によって「PDFExportPreset」をオブジェクトモデルビューアで検索してみる。どうでもいいけどこの検索窓、テキストのペーストがうまくいかないですね。いちいち手打ち……<br /> Applicationオブジェクトのプロパティに「pdfExportPresets」を発見。複数形ってことはたくさんあるプリセットが全部ここにまとまって入ってるんだろう。その中から目的のプリセット「PDFx/1-a」を取り出して使う。<br /> オブジェクトのコレクション(っていうの?)から目的のオブジェクトだけを取得する方法はいくつかあるけど、今回は名前をキーにして取得することになる。</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synIdentifier">var</span> preset = app.pdfExportPresets.item(<span class="synConstant">&quot;PDFx/1-a&quot;</span>); </pre><p>このへんの書き方はどのクラスでもたいてい同じ。itemメソッドの引数はインデックスの数字でも名前の文字列でもOK。他にitemByNameってメソッドもあって、そちらは名前の文字列だけが使えるんだけど……itemメソッドで充分な気がするのに、なんで用意されてるんだろう? まあいいか。</p> </div> <div class="section"> <h4>材料が揃ったので</h4> <p>PDF書き出し処理のところを書いてはめ込んでみよう。<br /> あ、忘れてたけどshowingOptions(書き出すときダイアログを出すかどうか)の値はfalseにしておくことにします。それ以外の必須でない引数は省略。</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synIdentifier">var</span> docs = app.documents; <span class="synComment">// 現在開いているすべてのドキュメントを得る</span> <span class="synComment">// ドキュメントの数だけループ</span> <span class="synStatement">for</span>( <span class="synIdentifier">var</span> i = 0, docLen = docs.length; i &lt; docLen; i++ ) <span class="synIdentifier">{</span> <span class="synIdentifier">var</span> tmpDoc = docs<span class="synIdentifier">[</span>i<span class="synIdentifier">]</span>; <span class="synComment">// 今処理してるドキュメント</span> <span class="synComment">// 今回追加した部分ここから ------------------------------</span> <span class="synComment">// 書き出すファイルのFileオブジェクトを作成</span> <span class="synIdentifier">var</span> fileObj = <span class="synStatement">new</span> File(tmpDoc.fullName.fullName.replace(<span class="synConstant">/\.[^.]*$/</span>,<span class="synConstant">&quot;.pdf&quot;</span>)); <span class="synComment">// プリセットのオブジェクトを取得</span> <span class="synIdentifier">var</span> preset = app.pdfExportPresets.item(<span class="synConstant">&quot;PDFx/1-a&quot;</span>); <span class="synComment">// ドキュメントのPDF書き出しを実行!</span> tmpDoc.exportFile(ExportFormat.PDF_TYPE, fileObj, <span class="synConstant">false</span>, preset); <span class="synComment">// 今回追加した部分ここまで ------------------------------</span> <span class="synComment">// ★ドキュメントを閉じる(保存しない)</span> <span class="synIdentifier">}</span> <span class="synComment">// ここまでループ</span> </pre><p>ドキュメントを閉じるのは後回しで、とりあえずこれが動くかどうかやってみよう(`・ω・´)<br /> ESTKに貼り付けて、適当なinddドキュメントを4つくらい作って開いて実行!</p> <blockquote> <p><span style="color:#FF0000;">イベント 'exportFile' のパラメータ 'using' の値が無効です。予想される値は PDFExportPreset ですが、値 nothing を受け取りました。</span></p> </blockquote> <p>( ゚д゚)...</p><p>なにか間違えたようです。</p> </div> <div class="section"> <h4>修正しよう</h4> <p>エラーメッセージを見るに、プリセットのあたりで間違えているらしい。スペルミスはないと思うんだけど。<br /> 実際に処理が止まってしまった(エラーで赤く染まった)行は、書き出し実行のところ。ということは、プリセットがきちんと取得できてなかった(ので、変数presetの値がnothingだった)ということだろう。その原因は……あっさり判明。</p><p>( ´д`)...プリセットの名前、違うじゃん。</p><p>お題で指定されたのは確かに「PDF/X-1a」だけど、私の環境では<a class="keyword" href="http://d.hatena.ne.jp/keyword/InDesign">InDesign</a>にこの名前のPDF書き出しプリセットはなかった。そりゃあ動かないわ。お題に従うならこのコードであってるけど、とりあえず動かすには修正しなくちゃ<a href="#f-f46ebdf2" name="fn-f46ebdf2" title="修正の方向としては「PDF/X-1a」という名前のプリセットを自分で作るっていうのもありなんだけど">*3</a>。<br /> ということで、<a class="keyword" href="http://d.hatena.ne.jp/keyword/InDesign">InDesign</a>のPDF書き出しプリセットメニューを見て、(デフォルトで用意されてる)PDF/X-1aで書き出すプリセットの名前を調べる。「[PDF/X-1a:2001 (日本)]」、これだな(Win版<a class="keyword" href="http://d.hatena.ne.jp/keyword/InDesign">InDesign</a> CS4の場合)。</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synIdentifier">var</span> docs = app.documents; <span class="synComment">// 現在開いているすべてのドキュメントを得る</span> <span class="synComment">// ドキュメントの数だけループ</span> <span class="synStatement">for</span>( <span class="synIdentifier">var</span> i = 0, docLen = docs.length; i &lt; docLen; i++ ) <span class="synIdentifier">{</span> <span class="synIdentifier">var</span> tmpDoc = docs<span class="synIdentifier">[</span>i<span class="synIdentifier">]</span>; <span class="synComment">// 今処理してるドキュメント</span> <span class="synComment">// 書き出すファイルのFileオブジェクトを作成</span> <span class="synIdentifier">var</span> fileObj = <span class="synStatement">new</span> File(tmpDoc.fullName.fullName.replace(<span class="synConstant">/\.[^.]*$/</span>,<span class="synConstant">&quot;.pdf&quot;</span>)); <span class="synComment">// プリセットのオブジェクトを取得</span> <span class="synIdentifier">var</span> preset = app.pdfExportPresets.item(<span class="synConstant">&quot;[PDF/X-1a:2001 (日本)]&quot;</span>); <span class="synComment">// ← ココ</span> <span class="synComment">// ドキュメントのPDF書き出しを実行!</span> tmpDoc.exportFile(ExportFormat.PDF_TYPE, fileObj, <span class="synConstant">false</span>, preset); <span class="synComment">// ★ドキュメントを閉じる(保存しない)</span> <span class="synIdentifier">}</span> <span class="synComment">// ここまでループ</span> </pre><p>今度こそ、と実行ボタンぽちっ。</p><p>キタ.*・゜゚・*:.。..。.:*・゚ヽ(゚∀゚)ノ ゚・*:.。. .。.:*・゜゚・*ー!!!!!</p><p>ドキュメントと同じフォルダに、PDFがきっちり書き出されました。<br /> これでほぼ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>は出来上がったようなものではないだろうか。一気に完成させてしまおう。</p> </div> <div class="section"> <h4>あとはドキュメントを閉じるだけ……のはず</h4> <p>これはもう何度も書いたことある処理なので悩むところはないと思う。でも一応、リファレンスを確認しておこうかな。Documentクラスのcloseメソッドだよね。</p> <blockquote> <p>Document.close (saving, savingIn, versionComments, forceSave)</p><br /> <p>Close the Document</p> </blockquote> <table> <tr> <th>引数</th> <th>引数の型</th> <th>意味</th> </tr> <tr> <td>saving</td> <td>SaveOptions</td> <td>オプション。閉じる前に保存するかどうか。デフォルトはSaveOptions.ASK。</td> </tr> <tr> <td>savingIn</td> <td>File</td> <td>オプション。保存するファイル。</td> </tr> <tr> <td>versionComments</td> <td>String</td> <td>オプション。バージョンコメント?</td> </tr> <tr> <td>forceSave</td> <td>Boolean</td> <td>オプション。強制的に上書き保存するかどうか?</td> </tr> </table><p>ん、SaveOptionsってなんだ。trueかfalseで指定するわけじゃないのか。とりあえずオブジェクトモデ(ryで検索する。</p> <table> <tr> <td>SaveOptions.ASK</td> <td>変更を保存するかどうかのプロンプトを表示する。</td> </tr> <tr> <td>SaveOptions.NO</td> <td>変更を保存しない。</td> </tr> <tr> <td>SaveOptions.YES</td> <td>変更を保存する。</td> </tr> </table><p>今まで作ってきた<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>では、保存するかどうかはデフォルトのままにしていました。それがSaveOptions.ASKで、今回は保存しないのでNOを指定すればいいようです。</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synIdentifier">var</span> docs = app.documents; <span class="synComment">// 現在開いているすべてのドキュメントを得る</span> <span class="synComment">// ドキュメントの数だけループ</span> <span class="synStatement">for</span>( <span class="synIdentifier">var</span> i = 0, docLen = docs.length; i &lt; docLen; i++ ) <span class="synIdentifier">{</span> <span class="synIdentifier">var</span> tmpDoc = docs<span class="synIdentifier">[</span>i<span class="synIdentifier">]</span>; <span class="synComment">// 今処理してるドキュメント</span> <span class="synComment">// 書き出すファイルのFileオブジェクトを作成</span> <span class="synIdentifier">var</span> fileObj = <span class="synStatement">new</span> File(tmpDoc.fullName.fullName.replace(<span class="synConstant">/\.[^.]*$/</span>,<span class="synConstant">&quot;.pdf&quot;</span>)); <span class="synComment">// プリセットのオブジェクトを取得</span> <span class="synIdentifier">var</span> preset = app.pdfExportPresets.item(<span class="synConstant">&quot;[PDF/X-1a:2001 (日本)]&quot;</span>); <span class="synComment">// ドキュメントのPDF書き出しを実行!</span> tmpDoc.exportFile(ExportFormat.PDF_TYPE, fileObj, <span class="synConstant">false</span>, preset); <span class="synComment">// 今回追加した部分ここから ------------------------------</span> <span class="synComment">// 保存せずにドキュメントを閉じる</span> tmpDoc.close(SaveOptions.NO); <span class="synComment">// 今回追加した部分ここまで ------------------------------</span> <span class="synIdentifier">}</span> <span class="synComment">// ここまでループ</span> </pre><p>残っていた★の行も埋まって、これで完成だ! ということでもう一度ESTKに貼り付けて、ドキュメントを4つ開いて実行してみる。</p><p>順調に書き出し→ドキュメント閉じる、という処理が進んでいく……と思ったら、3つ目のドキュメントの処理中になぜかストップ?</p> <blockquote> <p><span style="color:#FF0000;">オブジェクトが無効です</span></p> </blockquote> <p>(;゚Д゚)...アレ?</p> </div> <div class="section"> <h4>なんで?</h4> <p>エラーが出たのは書き出すファイルのFileオブジェクトを作成している行。でも、2つ目のドキュメントまでは一切引っかからずきちんと進んでる。なんでだ。なんでだ! エラーならエラーでいいけどもう少し教えてくれよー!</p><p>まず疑うべきは、追加したばかりの「ドキュメントを閉じる処理」のところだろう。ここを追加する前は4つのドキュメントをすべて書き出せたんだから。ただ、2つ目までは閉じることに成功して次のループに入ってる。この行の書き方を間違えたわけじゃなさそうな気がする。試しにドキュメントを閉じる処理を<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%E1%A5%F3%A5%C8%A5%A2%A5%A6%A5%C8">コメントアウト</a>してみたら、ちゃんと4つのPDFが書き出せました。<br /> 閉じる処理をすることで何かが起きてるらしいけど……と、ふと思い立ってエラーで処理が止まったままのESTKで「データブラウザ」を開いてみたところ、<br /> <span itemscope itemtype="http://schema.org/Photograph"><a href="http://f.hatena.ne.jp/chalcedony_htn/20100603184309" class="hatena-fotolife" itemprop="url"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/chalcedony_htn/20100603/20100603184309.png" alt="f:id:chalcedony_htn:20100603184309p:image" title="f:id:chalcedony_htn:20100603184309p:image" class="hatena-fotolife" itemprop="image"></a></span><br /> なんでdocs.lengthが2になってるの……</p><p>つまり、こういうこと。自分の理解のためにクドい説明をしますよ。<br /> 最初にドキュメントを4つ開いたとき、app.documents(この<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>ではdocsで参照してる)のlengthは4で、0〜3のインデックスがつけられています。</p> <table> <tr> <th>index</th> <th>ドキュメント</th> </tr> <tr> <td>0</td> <td>ひとつめ.indd</td> </tr> <tr> <td>1</td> <td>ふたつめ.indd</td> </tr> <tr> <td>2</td> <td>みっつめ.indd</td> </tr> <tr> <td>3</td> <td>よっつめ.indd</td> </tr> </table><p>でもって、1つ目のドキュメントまで処理し終わった段階で、「ひとつめ.indd」は閉じられる。そうすると、app.documentsのindexは新たに振りなおされるのだ。</p> <table> <tr> <th>index</th> <th>ドキュメント</th> </tr> <tr> <td>0</td> <td>ふたつめ.indd</td> </tr> <tr> <td>1</td> <td>みっつめ.indd</td> </tr> <tr> <td>2</td> <td>よっつめ.indd</td> </tr> </table><p>ここでiが1増えて、i == 1の状態で処理が行われる。つまりここで処理されるのは「みっつめ.indd」。閉じる処理まで終わったときには次の状態になります。</p> <table> <tr> <th>index</th> <th>ドキュメント</th> </tr> <tr> <td>0</td> <td>ふたつめ.indd</td> </tr> <tr> <td>1</td> <td>よっつめ.indd</td> </tr> </table><p>ここでiが1増えるとどうなるか? i == 2だけど、docs[2](つまりapp.documents[2])は存在しない。だから「オブジェクトが無効です」というエラーが発生する!</p><p>こ、これは恥ずかしい。わかってみれば簡単なんだけどこんなことに気づかなかったとは。最初に得意げにループを書いた時点でこういう問題が起きることが決まっていただなんて!<br /> ていうかこれ読んでる人はきっとわかってて、いつ気づくかなー(・∀・)ニヤニヤとか思ってたんだろうなー! あああ……orz</p> </div> <div class="section"> <h4>修正しよう・2</h4> <p>まあ、原因がわかってしまえばあとは簡単。0番目から処理するせいでドキュメントを閉じたときにインデックスが前にずれてしまうわけだから、最後から逆に処理していけばいいのだ。</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synIdentifier">var</span> docs = app.documents; <span class="synComment">// 現在開いているすべてのドキュメントを得る</span> <span class="synComment">// ドキュメントの数だけループ</span> <span class="synStatement">for</span>( <span class="synIdentifier">var</span> i = docs.length - 1; i &gt; -1; i-- ) <span class="synIdentifier">{</span> <span class="synComment">// ★</span> <span class="synIdentifier">var</span> tmpDoc = docs<span class="synIdentifier">[</span>i<span class="synIdentifier">]</span>; <span class="synComment">// 今処理してるドキュメント</span> <span class="synComment">// 書き出すファイルのFileオブジェクトを作成</span> <span class="synIdentifier">var</span> fileObj = <span class="synStatement">new</span> File(tmpDoc.fullName.fullName.replace(<span class="synConstant">/\.[^.]*$/</span>,<span class="synConstant">&quot;.pdf&quot;</span>)); <span class="synComment">// プリセットのオブジェクトを取得</span> <span class="synIdentifier">var</span> preset = app.pdfExportPresets.item(<span class="synConstant">&quot;[PDF/X-1a:2001 (日本)]&quot;</span>); <span class="synComment">// ドキュメントのPDF書き出しを実行!</span> tmpDoc.exportFile(ExportFormat.PDF_TYPE, fileObj, <span class="synConstant">false</span>, preset); <span class="synComment">// 保存せずにドキュメントを閉じる</span> tmpDoc.close(SaveOptions.NO); <span class="synIdentifier">}</span> <span class="synComment">// ここまでループ</span> </pre><p>修正したのは★の行。iの初期値を「ドキュメントの数-1」にする。これが最後のドキュメントのインデックスで、そこから1ずつ減らしていくことで0番目のドキュメントまで処理できる。<br /> 今度こそ何も問題はないはずだ! 例によって4つドキュメントを開いて実行!</p> <blockquote> <p><span style="color:#FF0000;">Execution finished.</span></p> </blockquote> <p>ヤッタ.*・゜゚・*:.。..。.:*・゚ヽ(;∀;)ノ ゚・*:.。. .。.:*・゜゚・*ー!!!!!<br /> 最後まできちんとPDFを書き出して、ドキュメントもすべて閉じました。ドキュメントを一部修正してから実行した場合でも、PDFにはその修正が反映され、元のドキュメントは保存せず閉じられています。ドキュメントの数を増やしても減らしても問題なし。やっと完成! です! やったー!</p><p><h4 id="exportPDFScript_100603_latest">完成!</h4>試しにコメントを取っ払ってみたところ、8行になりました。</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synIdentifier">var</span> docs = app.documents; <span class="synStatement">for</span>( <span class="synIdentifier">var</span> i = docs.length - 1; i &gt; -1; i-- ) <span class="synIdentifier">{</span> <span class="synIdentifier">var</span> tmpDoc = docs<span class="synIdentifier">[</span>i<span class="synIdentifier">]</span>; <span class="synIdentifier">var</span> fileObj = <span class="synStatement">new</span> File(tmpDoc.fullName.fullName.replace(<span class="synConstant">/\.[^.]*$/</span>,<span class="synConstant">&quot;.pdf&quot;</span>)); <span class="synIdentifier">var</span> preset = app.pdfExportPresets.item(<span class="synConstant">&quot;[PDF/X-1a:2001 (日本)]&quot;</span>); tmpDoc.exportFile(ExportFormat.PDF_TYPE, fileObj, <span class="synConstant">false</span>, preset); tmpDoc.close(SaveOptions.NO); <span class="synIdentifier">}</span> </pre><p>20行よりはだいぶ少なくて済みましたね。ただ、やっぱりドキュメントを1つも開いてないときのチェックくらいは入れてもいい気がしてきます。ついでに、無名関数でくるんでしまおう。</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink>(<span class="synIdentifier">function</span>()<span class="synIdentifier">{</span> <span class="synIdentifier">var</span> docs = app.documents; <span class="synStatement">if</span>( docs.length == 0 ) <span class="synIdentifier">{</span> <span class="synStatement">alert</span>(<span class="synConstant">&quot;ドキュメントが開かれていません。&quot;</span>); <span class="synStatement">return</span>; <span class="synIdentifier">}</span> <span class="synStatement">for</span>( <span class="synIdentifier">var</span> i = docs.length - 1; i &gt; -1; i-- ) <span class="synIdentifier">{</span> <span class="synIdentifier">var</span> tmpDoc = docs<span class="synIdentifier">[</span>i<span class="synIdentifier">]</span>; <span class="synIdentifier">var</span> fileObj = <span class="synStatement">new</span> File(tmpDoc.fullName.fullName.replace(<span class="synConstant">/\.[^.]*$/</span>,<span class="synConstant">&quot;.pdf&quot;</span>)); <span class="synIdentifier">var</span> preset = app.pdfExportPresets.item(<span class="synConstant">&quot;[PDF/X-1a:2001 (日本)]&quot;</span>); tmpDoc.exportFile(ExportFormat.PDF_TYPE, fileObj, <span class="synConstant">false</span>, preset); tmpDoc.close(SaveOptions.NO); <span class="synIdentifier">}</span> <span class="synIdentifier">}</span>)(); </pre><p>ドキュメントの数が0だったときはエラーメッセージを出して、returnで処理を終了してしまうようにしています。returnが使えるのは全体を関数にしてしまったおかげ。<br /> 行数は増えましたが、その分ちょっとだけ親切になりました。普通に使うにはこれで充分かな。</p> </div> <div class="section"> <h4>蛇足:ループの書き方を変えてみる</h4> <p>ドキュメント数が減るのに対応するためにforループを逆転してみたけど、減っていくとわかっているならwhileでも書けると思ったので、せっかくだから書いてみる。</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink>(<span class="synIdentifier">function</span>()<span class="synIdentifier">{</span> <span class="synIdentifier">var</span> docs = app.documents; <span class="synStatement">if</span>( docs.length == 0 ) <span class="synIdentifier">{</span> <span class="synStatement">alert</span>(<span class="synConstant">&quot;ドキュメントが開かれていません。&quot;</span>); <span class="synStatement">return</span>; <span class="synIdentifier">}</span> <span class="synStatement">while</span>( docs.length != 0 ) <span class="synIdentifier">{</span> <span class="synComment">// ★1</span> <span class="synIdentifier">var</span> tmpDoc = docs<span class="synIdentifier">[</span>0<span class="synIdentifier">]</span>; <span class="synComment">// ★2</span> <span class="synIdentifier">var</span> fileObj = <span class="synStatement">new</span> File(tmpDoc.fullName.fullName.replace(<span class="synConstant">/\.[^.]*$/</span>,<span class="synConstant">&quot;.pdf&quot;</span>)); <span class="synIdentifier">var</span> preset = app.pdfExportPresets.item(<span class="synConstant">&quot;[PDF/X-1a:2001 (日本)]&quot;</span>); tmpDoc.exportFile(ExportFormat.PDF_TYPE, fileObj, <span class="synConstant">false</span>, preset); tmpDoc.close(SaveOptions.NO); <span class="synIdentifier">}</span> <span class="synIdentifier">}</span>)(); </pre><p>変更したのは★のついた2行。ドキュメントの中で最初のものを処理の対象にして(★2)、処理が終わったら閉じる。それをドキュメントの数が0になるまで繰り返す(★1)、という感じ。毎回0番目に来てるドキュメントを対象にするので、ドキュメントが閉じてインデックスがずれても問題ありません。<br /> でもよく考えてみると、この形のループは「うっかりドキュメントが閉じられなかった場合」に無限ループに陥る危険がある気がします(docs.lengthがいつまでたっても0にならないから)。最初に処理したいドキュメントの数は決まるのだから、forで回すほうが安全かもしれないです。</p> </div> <div class="section"> <h4>さいごにひとこと</h4> <p>こんなに苦労するはずではなかったんですけどね! 考えが甘かったです。最後まで読んでくださった方、いるかどうかわかりませんがありがとうございました。ツッコミ大歓迎です。<br /> いろんなエラーが出て、原因を突き止める過程まで書き留めつつ修正していったおかげで完成まで諦めずに済みましたし、なんとなく修正してなんとなくできあがるよりも理解が深まった気がします。時間はかかったけど。あと、だいぶ恥ずかしいけど。<br /> 今後また機会があったら実況風に書き留めてみたいなと思います。</p><p>……でもこれ、たぶんPlanetDTP@jpに全文載っちゃうんじゃないかしら。載せてくれるのはありがたいことだけど、長くてクドくてすいません!(今更……</p> </div><div class="footnote"> <p class="footnote"><a href="#fn-a1fba5e5" name="f-a1fba5e5" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text"><a class="keyword" href="http://d.hatena.ne.jp/keyword/JavaScript">JavaScript</a>から入ったクチだからか、クラスとか<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>とかいうのがよくわかっていません</span></p> <p class="footnote"><a href="#fn-966f4c05" name="f-966f4c05" class="footnote-number">*2</a><span class="footnote-delimiter">:</span><span class="footnote-text">たぶん指定文字数削って足すほうが速いんだろうけど</span></p> <p class="footnote"><a href="#fn-f46ebdf2" name="f-f46ebdf2" class="footnote-number">*3</a><span class="footnote-delimiter">:</span><span class="footnote-text">修正の方向としては「PDF/X-1a」という名前のプリセットを自分で作るっていうのもありなんだけど</span></p> </div> chalcedony_htn DTP Booster 013に行ってきた hatenablog://entry/17680117126976452624 2010-06-02T02:59:32+09:00 2019-02-22T17:00:44+09:00 Adobe CS5の発売にあわせて表参道で行われているイベント群、その中で3日連続で開催されたDTP Boosterの最終日のセミナーを受講してきました。 テーマは「スクリプト(入門)」。 私もなんとかスクリプトを自作するところまでは来ているので、自分のためというよりは「スクリプトの有用性をどう伝えるか」っていうところを知りたくて参加しました。……こう書くと偉そうだな! 自分のためでもありましたよもちろん! セミナーの詳しい内容については、リアルタイムで配信されていたUstreamの録画映像がありますのでこちらで。いい時代ですなあ*1。 IllustratorとJavaScriptでつくるおし… <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Adobe">Adobe</a> CS5の発売にあわせて表参道で行われているイベント群、その中で3日連続で開催された<a class="keyword" href="http://d.hatena.ne.jp/keyword/DTP">DTP</a> Boosterの<a href="http://www.dtp-booster.com/vol13/">&#x6700;&#x7D42;&#x65E5;&#x306E;&#x30BB;&#x30DF;&#x30CA;&#x30FC;</a>を受講してきました。<br /> テーマは「<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>(入門)」。<br /> 私もなんとか<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>を自作するところまでは来ているので、自分のためというよりは「<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>の有用性をどう伝えるか」っていうところを知りたくて参加しました。……こう書くと偉そうだな! 自分のためでもありましたよもちろん!<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BB%A5%DF">セミ</a>ナーの詳しい内容については、リアルタイムで配信されていた<a class="keyword" href="http://d.hatena.ne.jp/keyword/Ustream">Ustream</a>の録画映像がありますので<a href="http://www.ustream.tv/recorded/7390200">&#x3053;&#x3061;&#x3089;</a>で。いい時代ですなあ<a href="#f-81f9c8ba" name="fn-81f9c8ba" title="Ustでの公開と参加費負担についてはなかなか難しい問題なのでしょうが……">*1</a>。</p> <div class="section"> <h4><a class="keyword" href="http://d.hatena.ne.jp/keyword/Illustrator">Illustrator</a>と<a class="keyword" href="http://d.hatena.ne.jp/keyword/JavaScript">JavaScript</a>でつくるおしゃれアートワーク(秋葉 秀樹氏)</h4> <p>タイトルは<a class="keyword" href="http://d.hatena.ne.jp/keyword/Illustrator">Illustrator</a>ですが、まずはCS5から<a class="keyword" href="http://d.hatena.ne.jp/keyword/InDesign">InDesign</a>にも対応するようになった<a class="keyword" href="http://d.hatena.ne.jp/keyword/Adobe">Adobe</a> Configuratorの紹介から入っていました。以前東京<a class="keyword" href="http://d.hatena.ne.jp/keyword/DTP">DTP</a>の勉強会第0回で樋口 泰行氏が紹介されていたものです。2.0にバージョンアップして、メニュー名などが日本語になったそうです。<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Adobe">Adobe</a> Configuratorの何がいいって、とにかく「作りやすい」ことだと思います。いつも使っている機能をポイポイとドラッグ&ドロップしてボタンの形で配置すれば、それだけで便利なパネルが作成できてしまう。「アプリケーションをデフォルトのまま使うのではなく、自分用にカスタマイズする」という行為のとっかかりとしては最適じゃないでしょうか。更に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>や<a class="keyword" href="http://d.hatena.ne.jp/keyword/Flash">Flash</a>の知識があればもっと便利な物が作れるわけだし。<br /> 問題は今のところ最新のCS5でも<a class="keyword" href="http://d.hatena.ne.jp/keyword/Photoshop">Photoshop</a>と<a class="keyword" href="http://d.hatena.ne.jp/keyword/InDesign">InDesign</a>のみ対応ということですね。むしろこれ<a class="keyword" href="http://d.hatena.ne.jp/keyword/Illustrator">Illustrator</a>向きの機能じゃないかと思ったりするのですが、予定は未定だそうです。</p><p>そして予告されていた<a class="keyword" href="http://d.hatena.ne.jp/keyword/Illustrator">Illustrator</a>でのランダムちりばめ系<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>の作成について。実際にコードを書きながら、実行しながらの解説でした。<br /> ランダムな数を返す関数を自分で作ってそれを利用したりとか、イチから覚えようとしたらそこそこ難しいところじゃないかと思うんですが、そこをさらりと流して難しさを感じさせず、「何が出来るか、何が起こるか」を見せてくれていたと思います。<br /> セッションの最後で実演された、たくさんの種類のシンボルをちりばめて「おもちゃ箱をひっくりかえしたような」オブジェクト群を作るところでは、(私も含めて)会場のあちこちから歓声が上がりました。あの技はそのままデザインにも使えそうです、というか明日さっそく使う気満々です。ちょうど使えそうな仕事があるんだこれが。ラッキー(・∀・)</p><p>とにかく進行のスムーズさが印象的でした。あれだけよどみなく説明しながらコード書けるとか凄い。詳しく説明しないことでわかりやすくなるってこともあるんだなあと非常に勉強になりました。真似は出来そうにないけど!</p> </div> <div class="section"> <h4><a class="keyword" href="http://d.hatena.ne.jp/keyword/DTP">DTP</a>作業を楽にする<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>入門(たけうちとおる氏)</h4> <p>まず怒濤の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>紹介から始まりました。<a class="keyword" href="http://d.hatena.ne.jp/keyword/InDesign">InDesign</a>と<a class="keyword" href="http://d.hatena.ne.jp/keyword/Illustrator">Illustrator</a>を対象に、テキスト処理系、画像配置系、パス描画系、面付け系と多岐にわたる<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>群を次々に実演。<br /> いろんなことできるよなあ……と感心しつつ、私が気になったのは<a class="keyword" href="http://d.hatena.ne.jp/keyword/InDesign">InDesign</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>パネルにフォルダに分けて収められた大量のミニ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>でした。たとえば(実演にも含まれていましたが)表組の線幅を決められた値に変更するためだけのものとか。確かに実際自分で使うときは、<a class="keyword" href="http://d.hatena.ne.jp/keyword/GUI">GUI</a>でいちいち数値を設定して実行ボタンを押すよりも、数値などの設定を決め打ちにした小さな<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>を必要に応じて選んで実行するほうが手間が少なかったりします<a href="#f-b195760e" name="fn-b195760e" title="ただ、Illustratorの場合はスクリプトパネルが用意されてないので……">*2</a>。単機能のものなら作るのも楽だし。</p><p>その後は、楽しみにしていた<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>作成の実演。事前に出ていたお題<a href="#f-03ab6048" name="fn-03ab6048" title="私は勝手にInDesignだと思いこんでいて実際その通りだったのですが、実は対象アプリケーションについては明記されていなかったらしいです">*3</a>「PDF書き出し<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>」を試行錯誤しながら作るという内容です。<br /> 要件を整理し、わかるところから書き始め、わからないところはオブジェクトモデルビューアを使用したりネットで検索したりしながら書いていく。ある程度まとまったところまで書いたら実行してみて、エラーが出たらその内容を見て修正、さらに書き進める、という、まさに試行錯誤の過程をそのまま見せてくださいました。<br /> 実は、講義を聴く前に私もこのお題に挑戦していました。エラーばかり出て思った以上に苦労したのですが……今日の講義を聴いてみてびっくり。私がわからなくて調べた箇所、書く順番、やらかしたエラー、それらがほとんど同じだったのです。ちょっと嬉しかったですね。<br /> 自動処理系の本に書いてある<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>やネットで検索して見つかる<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>は、たいていの場合すでに整理されてそのままコピーすれば使えるようになっています。そのおかげで便利に使えるわけですが、真似して書いてみよう! と思う学習者からすると、模範解答があまりに完成されている場合「これ、どっからどう書いたらいいんだろう。そもそもどこから読めば……」と思ってしまったりすることがあります。その意味で今回のセッションはとても参考になる、そしてとても勇気づけられるものでした。失敗しながらでいいんだ!</p> </div> <div class="section"> <h4>ついでに、せっかくだから</h4> <p>次の記事で、たけうちさんの出された「お題」に対する私の回答を発表しようと思います。それもただ書くだけではもったいないと思い、作成過程で何を考え何をやらかしたかすべて書き留めておいたものを、そのまま。いわば実況形式です。<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%B8%E5%BD%D0%A4%B7%A5%B8%A5%E3%A5%F3%A5%B1%A5%F3">後出しジャンケン</a>のようですが、実際書いた時のまま無編集で載せますのでOKということにしてください。<br /> ……しかし、書いてたときは意図も想像もしてなかったことだけど、セッションの内容とダダ被りなんだよなあ。あんまり意味がないかもー<a class="keyword" href="http://d.hatena.ne.jp/keyword/%28%A1%AD%A1%A6%A6%D8%A1%A6%60%29">(´・ω・`)</a></p> </div><div class="footnote"> <p class="footnote"><a href="#fn-81f9c8ba" name="f-81f9c8ba" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">Ustでの公開と参加費負担についてはなかなか難しい問題なのでしょうが……</span></p> <p class="footnote"><a href="#fn-b195760e" name="f-b195760e" class="footnote-number">*2</a><span class="footnote-delimiter">:</span><span class="footnote-text">ただ、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Illustrator">Illustrator</a>の場合は<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>パネルが用意されてないので……</span></p> <p class="footnote"><a href="#fn-03ab6048" name="f-03ab6048" class="footnote-number">*3</a><span class="footnote-delimiter">:</span><span class="footnote-text">私は勝手に<a class="keyword" href="http://d.hatena.ne.jp/keyword/InDesign">InDesign</a>だと思いこんでいて実際その通りだったのですが、実は対象アプリケーションについては明記されていなかったらしいです</span></p> </div> chalcedony_htn InDesignのスウォッチ色設定切り替えスクリプトをウィンドウにしてみる hatenablog://entry/17680117126976452668 2010-03-26T00:58:45+09:00 2019-02-22T17:00:45+09:00 こないだのスクリプトをちょっと改造してみました。 実行のたびにダイアログを生成するのではなく、一度実行したら(閉じない限り)InDesignを終了させるまでずっと表示されたままになるウィンドウを作ります。その他、ちらほら修正など。 例によって動作確認したのはWindows XP SP3 InDesign CS4(6.0.4)のみです。 #target "InDesign" #targetengine "changeSwatchColor" (function(){ if ( app.documents.length == 0 ) { alert("ドキュメントが開かれていません"); retu… <p><a href="http://d.hatena.ne.jp/chalcedony_htn/20100323/1269341968">&#x3053;&#x306A;&#x3044;&#x3060;&#x306E;&#x30B9;&#x30AF;&#x30EA;&#x30D7;&#x30C8;</a>をちょっと改造してみました。<br /> 実行のたびにダイアログを生成するのではなく、一度実行したら(閉じない限り)<a class="keyword" href="http://d.hatena.ne.jp/keyword/InDesign">InDesign</a>を終了させるまでずっと表示されたままになるウィンドウを作ります。その他、ちらほら修正など。<br /> 例によって動作確認したのは<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows%20XP">Windows XP</a> SP3 <a class="keyword" href="http://d.hatena.ne.jp/keyword/InDesign">InDesign</a> CS4(6.0.4)のみです。</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink>#target <span class="synConstant">&quot;InDesign&quot;</span> #targetengine <span class="synConstant">&quot;changeSwatchColor&quot;</span> (<span class="synIdentifier">function</span>()<span class="synIdentifier">{</span> <span class="synStatement">if</span> ( app.documents.length == 0 ) <span class="synIdentifier">{</span> <span class="synStatement">alert</span>(<span class="synConstant">&quot;ドキュメントが開かれていません&quot;</span>); <span class="synStatement">return</span>; <span class="synIdentifier">}</span> <span class="synComment">// スウォッチの設定セットをつくる</span> <span class="synIdentifier">var</span> presetColorArr = <span class="synIdentifier">[</span> <span class="synIdentifier">{</span> name : <span class="synConstant">&quot;見出し1用&quot;</span>, cmyk : <span class="synIdentifier">[</span> 0,100,100, 0<span class="synIdentifier">]</span>, black : <span class="synIdentifier">[</span> 0, 0, 0,100<span class="synIdentifier">]</span>, set3 : <span class="synIdentifier">[</span> 20, 20, 20,100<span class="synIdentifier">]</span> <span class="synIdentifier">}</span>, <span class="synIdentifier">{</span> name : <span class="synConstant">&quot;見出し2用&quot;</span>, cmyk : <span class="synIdentifier">[</span> 0, 0,100, 0<span class="synIdentifier">]</span>, black : <span class="synIdentifier">[</span> 0, 0, 0, 50<span class="synIdentifier">]</span>, set3 : <span class="synIdentifier">[</span> 10, 10, 10, 40<span class="synIdentifier">]</span> <span class="synIdentifier">}</span> <span class="synComment">// 長いので省略</span> <span class="synIdentifier">]</span>; <span class="synComment">// ダイアログ(ウィンドウだけど)の内容を作成</span> <span class="synIdentifier">var</span> dlg = <span class="synStatement">new</span> Window(<span class="synConstant">&quot;window&quot;</span>, <span class="synConstant">&quot;スウォッチ色変更&quot;</span>); dlg.add(<span class="synConstant">&quot;statictext&quot;</span>, <span class="synStatement">undefined</span>, <span class="synConstant">&quot;どの設定に変更しますか?&quot;</span>); dlg.add(<span class="synConstant">&quot;button&quot;</span>, <span class="synStatement">undefined</span>, <span class="synConstant">&quot;カラー&quot;</span>).onClick = <span class="synIdentifier">function</span>()<span class="synIdentifier">{</span> changeColor(<span class="synConstant">&quot;cmyk&quot;</span>); <span class="synIdentifier">}</span> dlg.add(<span class="synConstant">&quot;button&quot;</span>, <span class="synStatement">undefined</span>, <span class="synConstant">&quot;モノクロ&quot;</span>).onClick = <span class="synIdentifier">function</span>()<span class="synIdentifier">{</span> changeColor(<span class="synConstant">&quot;black&quot;</span>); <span class="synIdentifier">}</span> dlg.add(<span class="synConstant">&quot;button&quot;</span>, <span class="synStatement">undefined</span>, <span class="synConstant">&quot;設定3&quot;</span>).onClick = <span class="synIdentifier">function</span>()<span class="synIdentifier">{</span> changeColor(<span class="synConstant">&quot;set3&quot;</span>); <span class="synIdentifier">}</span> <span class="synComment">// ダイアログを表示</span> dlg.show(); <span class="synComment">// 各スウォッチの色設定をモードに応じて変更する処理</span> <span class="synComment">// ボタンを押すと、この関数が実行される</span> <span class="synIdentifier">var</span> changeColor = <span class="synIdentifier">function</span>(mode)<span class="synIdentifier">{</span> <span class="synIdentifier">var</span> actDoc = app.activeDocument; <span class="synComment">// ボタンを押した時点のアクティブドキュメントを処理するのでココ</span> <span class="synStatement">for</span> ( <span class="synIdentifier">var</span> i = 0, len = presetColorArr.length; i &lt; len; i++ ) <span class="synIdentifier">{</span> <span class="synIdentifier">var</span> tmpSet = presetColorArr<span class="synIdentifier">[</span>i<span class="synIdentifier">]</span>; <span class="synStatement">try</span> <span class="synIdentifier">{</span> <span class="synIdentifier">var</span> targetColor = actDoc.swatches.item(tmpSet.name); targetColor.colorValue = tmpSet<span class="synIdentifier">[</span>mode<span class="synIdentifier">]</span>; <span class="synIdentifier">}</span> <span class="synStatement">catch</span>(e) <span class="synIdentifier">{</span> <span class="synStatement">alert</span>(<span class="synConstant">&quot;スウォッチがみつかりません: &quot;</span> + tmpSet.name); <span class="synIdentifier">}</span> <span class="synIdentifier">}</span> <span class="synIdentifier">}</span> <span class="synIdentifier">}</span>)(); </pre><p>私が使うときには複数のファイルに同じ設定をどんどん適用していくことになるので、いちいちダイアログを呼び出すのは面倒だなーって思ってこの形になりました<a href="#f-44acc5ba" name="fn-44acc5ba" title="開いてるすべてのドキュメントに一発で適用してもいいけど、1ファイルずつ確かめながら実行したいんだ……">*1</a>。<br /> あと、せっかく覚えたのでウィンドウを作ってみたかった。これだったら、最初の起動時に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%A6%A5%A9%A5%C3%A5%C1">スウォッチ</a>の設定セットを書いた外部ファイルを読み込むようにするのもありかもしれない。</p><p>ウィンドウの使用にはtargetengineの指定が必要です。最初の文はそれ。この<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>をESTKで実行するにはちょっと注意が必要ですね。<br /> 参考:<a href="http://detaramedia.blog95.fc2.com/blog-entry-75.html">Double-talk Publisher &#x304A;&#x624B;&#x5143;&#x7CFB;&#x30B9;&#x30AF;&#x30EA;&#x30D7;&#x30C8;&#x8003;</a></p><p>ところで、applicationオブジェクトからたどって作るダイアログは使い終わったら破棄(destroy)すべしと言われてるけど、ScriptUIで作る場合はどうなんだろう?<br /> そのへんよくわからないで作っています。(だめじゃん……)</p> <div class="footnote"> <p class="footnote"><a href="#fn-44acc5ba" name="f-44acc5ba" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">開いてるすべてのドキュメントに一発で適用してもいいけど、1ファイルずつ確かめながら実行したいんだ……</span></p> </div> chalcedony_htn InDesignで複数のスウォッチの色を一括で切り替えるJavaScript hatenablog://entry/17680117126976452707 2010-03-23T19:59:28+09:00 2019-02-22T17:00:46+09:00 たくさんあるスウォッチの色を頻繁に切り替えたいとき、手作業や別ドキュメントからの読み込みをするのがものすごく面倒になった*1ので作りました。 ScriptUIを触ってみたかったのでCS3/CS4のみ対応です(たぶん)。動作確認はWindows XP SP3 InDesign CS4(6.0.4)でしか行っていません。 (function(){ if ( app.documents.length == 0 ) { alert("ドキュメントが開かれていません"); return; } // スウォッチの設定セットをつくる var colorSetArr = [ { name : "見出し1用",… <p>たくさんある<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%A6%A5%A9%A5%C3%A5%C1">スウォッチ</a>の色を頻繁に切り替えたいとき、手作業や別ドキュメントからの読み込みをするのがものすごく面倒になった<a href="#f-62271787" name="fn-62271787" title="3回くらい繰り返したあたりで(早">*1</a>ので作りました。<br /> ScriptUIを触ってみたかったのでCS3/CS4のみ対応です(たぶん)。動作確認は<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows%20XP">Windows XP</a> SP3 <a class="keyword" href="http://d.hatena.ne.jp/keyword/InDesign">InDesign</a> CS4(6.0.4)でしか行っていません。</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink>(<span class="synIdentifier">function</span>()<span class="synIdentifier">{</span> <span class="synStatement">if</span> ( app.documents.length == 0 ) <span class="synIdentifier">{</span> <span class="synStatement">alert</span>(<span class="synConstant">&quot;ドキュメントが開かれていません&quot;</span>); <span class="synStatement">return</span>; <span class="synIdentifier">}</span> <span class="synComment">// スウォッチの設定セットをつくる</span> <span class="synIdentifier">var</span> colorSetArr = <span class="synIdentifier">[</span> <span class="synIdentifier">{</span> name : <span class="synConstant">&quot;見出し1用&quot;</span>, cmyk : <span class="synIdentifier">[</span> 0,100,100, 0<span class="synIdentifier">]</span>, black : <span class="synIdentifier">[</span> 0, 0, 0,100<span class="synIdentifier">]</span>, set3 : <span class="synIdentifier">[</span> 20, 20, 20,100<span class="synIdentifier">]</span> <span class="synIdentifier">}</span>, <span class="synIdentifier">{</span> name : <span class="synConstant">&quot;見出し2用&quot;</span>, cmyk : <span class="synIdentifier">[</span> 0, 0,100, 0<span class="synIdentifier">]</span>, black : <span class="synIdentifier">[</span> 0, 0, 0, 50<span class="synIdentifier">]</span>, set3 : <span class="synIdentifier">[</span> 10, 10, 10, 40<span class="synIdentifier">]</span> <span class="synIdentifier">}</span>, <span class="synIdentifier">{</span> name : <span class="synConstant">&quot;見出し3用&quot;</span>, cmyk : <span class="synIdentifier">[</span>100, 0,100, 0<span class="synIdentifier">]</span>, black : <span class="synIdentifier">[</span> 0, 0, 0, 60<span class="synIdentifier">]</span>, set3 : <span class="synIdentifier">[</span> 10, 10, 10, 50<span class="synIdentifier">]</span> <span class="synIdentifier">}</span>, <span class="synIdentifier">{</span> name : <span class="synConstant">&quot;見出し4用&quot;</span>, cmyk : <span class="synIdentifier">[</span>100, 50, 0, 0<span class="synIdentifier">]</span>, black : <span class="synIdentifier">[</span> 0, 0, 0, 70<span class="synIdentifier">]</span>, set3 : <span class="synIdentifier">[</span> 10, 10, 10, 60<span class="synIdentifier">]</span> <span class="synIdentifier">}</span>, <span class="synIdentifier">{</span> name : <span class="synConstant">&quot;見出し5用&quot;</span>, cmyk : <span class="synIdentifier">[</span> 50,100, 0, 0<span class="synIdentifier">]</span>, black : <span class="synIdentifier">[</span> 0, 0, 0, 60<span class="synIdentifier">]</span>, set3 : <span class="synIdentifier">[</span> 10, 10, 10, 50<span class="synIdentifier">]</span> <span class="synIdentifier">}</span> <span class="synIdentifier">]</span>; <span class="synComment">// モード識別準備</span> <span class="synIdentifier">var</span> mode = <span class="synConstant">&quot;&quot;</span>; <span class="synComment">// ダイアログの内容を作成</span> <span class="synIdentifier">var</span> dlg = <span class="synStatement">new</span> Window(<span class="synConstant">&quot;dialog&quot;</span>, <span class="synConstant">&quot;モード選択&quot;</span>); dlg.add(<span class="synConstant">&quot;statictext&quot;</span>, <span class="synStatement">undefined</span>, <span class="synConstant">&quot;どの設定に変換しますか?&quot;</span>); dlg.btn1 = dlg.add(<span class="synConstant">&quot;button&quot;</span>, <span class="synStatement">undefined</span>, <span class="synConstant">&quot;カラー&quot;</span>); dlg.btn2 = dlg.add(<span class="synConstant">&quot;button&quot;</span>, <span class="synStatement">undefined</span>, <span class="synConstant">&quot;モノクロ&quot;</span>); dlg.btn3 = dlg.add(<span class="synConstant">&quot;button&quot;</span>, <span class="synStatement">undefined</span>, <span class="synConstant">&quot;設定3&quot;</span>); dlg.btn1.onClick = <span class="synIdentifier">function</span>()<span class="synIdentifier">{</span> mode = <span class="synConstant">&quot;cmyk&quot;</span>; dlg.close(); <span class="synIdentifier">}</span> dlg.btn2.onClick = <span class="synIdentifier">function</span>()<span class="synIdentifier">{</span> mode = <span class="synConstant">&quot;black&quot;</span>; dlg.close(); <span class="synIdentifier">}</span> dlg.btn3.onClick = <span class="synIdentifier">function</span>()<span class="synIdentifier">{</span> mode = <span class="synConstant">&quot;set3&quot;</span>; dlg.close(); <span class="synIdentifier">}</span> <span class="synComment">// ダイアログを表示</span> dlg.show(); <span class="synComment">// キャンセルされてたらここで処理終了</span> <span class="synStatement">if</span> ( mode == <span class="synConstant">&quot;&quot;</span> ) <span class="synIdentifier">{</span> <span class="synStatement">return</span>; <span class="synIdentifier">}</span> <span class="synIdentifier">var</span> actDoc = app.activeDocument; <span class="synComment">// 各スウォッチの色設定をモードに応じて変更する処理</span> <span class="synStatement">for</span> ( <span class="synIdentifier">var</span> i = 0, len = colorSetArr.length; i &lt; len; i++ ) <span class="synIdentifier">{</span> <span class="synIdentifier">var</span> tmpSet = colorSetArr<span class="synIdentifier">[</span>i<span class="synIdentifier">]</span>; <span class="synStatement">try</span> <span class="synIdentifier">{</span> <span class="synIdentifier">var</span> targetColor = actDoc.swatches.item(tmpSet.name); targetColor.colorValue = tmpSet<span class="synIdentifier">[</span>mode<span class="synIdentifier">]</span>; <span class="synIdentifier">}</span> <span class="synStatement">catch</span>(e) <span class="synIdentifier">{</span> <span class="synStatement">alert</span>(<span class="synConstant">&quot;スウォッチがみつかりません: &quot;</span> + tmpSet.name); <span class="synComment">// エラー処理(手抜き)</span> <span class="synIdentifier">}</span> <span class="synIdentifier">}</span> <span class="synIdentifier">}</span>)(); </pre><p><span itemscope itemtype="http://schema.org/Photograph"><a href="http://f.hatena.ne.jp/chalcedony_htn/20100323195343" class="hatena-fotolife" itemprop="url"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/chalcedony_htn/20100323/20100323195343.png" alt="f:id:chalcedony_htn:20100323195343p:image" title="f:id:chalcedony_htn:20100323195343p:image" class="hatena-fotolife" itemprop="image"></a></span><br /> ↓↓↓<br /> <span itemscope itemtype="http://schema.org/Photograph"><a href="http://f.hatena.ne.jp/chalcedony_htn/20100323195342" class="hatena-fotolife" itemprop="url"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/chalcedony_htn/20100323/20100323195342.png" alt="f:id:chalcedony_htn:20100323195342p:image" title="f:id:chalcedony_htn:20100323195342p:image" class="hatena-fotolife" itemprop="image"></a></span><br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%A6%A5%A9%A5%C3%A5%C1">スウォッチ</a>は名前で識別しています。<br /> 処理する<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%A6%A5%A9%A5%C3%A5%C1">スウォッチ</a>の数やモードの数は増やすことができます。外部に設定ファイルを作ってそれを読み込んで……とかも考えたのですが、それはそれで面倒なので直打ちで。<br /> 設定を変更したいときに修正する箇所をもっと減らす方法はないかなあ。</p><p><ins datetime="2010-03-24T01:11:08+09:00">2010.3.24 追記:<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>の38行目、「staticText」→「statictext」に修正しました。ご指摘下さったmilligrammeさん、ありがとうございました。</ins><br /> </p> <div class="section"> <h4>そういえば</h4> <p>今年最初のエントリでした。あけましておめでとうございます?<br /> 前回あんなことを言っておいてこの体たらくですが、一応、オンラインブックマーク等でコメントは積極的にしているのです……でも100のブクマより1のブログエントリ、という気もしています。</p> </div><div class="footnote"> <p class="footnote"><a href="#fn-62271787" name="f-62271787" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">3回くらい繰り返したあたりで(早</span></p> </div> chalcedony_htn せっかくだから2009年を振り返ってみる hatenablog://entry/17680117126976452765 2009-12-31T14:43:26+09:00 2019-02-22T17:00:47+09:00 ほんとは年内にあと一回くらい更新しようと思っていたけど、ぐずぐずしてたら大晦日になってしまいました。 今年はアウトプットの年にしようと突然思い立ち、このブログをはじめたりTwitterでつぶやいたりソーシャルブックマークでコメントを書いたり(これは前からやってたけど)してみました。 そうやってWeb上で活動をはじめたのをきっかけに、DTP Boosterなどの勉強会に参加したりオフ会に行ったり飲みに行ったりと、Webで知り合った人たちと会う機会が多くなりました。実はこれは引きこもり気質の私には予想外の展開で、今でもわりと信じられません。 たぶん一年前の私が今の私を見たら「あんた誰だ」って言うに… <p>ほんとは年内にあと一回くらい更新しようと思っていたけど、ぐずぐずしてたら大<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B3%A2%C6%FC">晦日</a>になってしまいました。</p><br /> <p>今年はアウトプットの年にしようと突然思い立ち、このブログをはじめたり<a class="keyword" href="http://d.hatena.ne.jp/keyword/Twitter">Twitter</a>でつぶやいたり<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BD%A1%BC%A5%B7%A5%E3%A5%EB%A5%D6%A5%C3%A5%AF%A5%DE%A1%BC%A5%AF">ソーシャルブックマーク</a>でコメントを書いたり(これは前からやってたけど)してみました。<br /> そうやってWeb上で活動をはじめたのをきっかけに、<a class="keyword" href="http://d.hatena.ne.jp/keyword/DTP">DTP</a> Boosterなどの勉強会に参加したりオフ会に行ったり飲みに行ったりと、Webで知り合った人たちと会う機会が多くなりました。実はこれは引きこもり気質の私には予想外の展開で、今でもわりと信じられません。<br /> たぶん一年前の私が今の私を見たら「あんた誰だ」って言うに違いない……</p><br /> <p>こうして振り返ってみると、アウトプットしようと思って活動をはじめた結果、むしろインプットが非常に多くなった年でした。<br /> 書くためにいろいろ調べたり、勉強会に出たり、飲みに行ったりして非常にたくさんの知識を得た……のは確かなのですが、実はそれだけではなくて。<br /> この一年でインプットされた一番大事なものは、「意欲」だと感じています。<br /> 私のモチベーションに火をつけてくださった方々、直接お会いできた方もこちらが一方的に知っているだけの方もいますが、本当に感謝いたします。</p><br /> <p>ちゃんと勉強してみると知らないことばかりで恥ずかしくなり、もっと早くこのやる気が出ていればーとか今まで何してたんだーとか何年無駄にしたんだーなどと思うばかりですが、考えても仕方ないので今はこのまま突っ走ります。</p><br /> <br /> <br /> <p>……ということで、来年はもうちょっとまじめにこのブログでのアウトプットを増やそうかな……。まだはてダ市民にさえなれてないよ!</p> chalcedony_htn InDesignのセクションマーカーを一括登録するJavaScript(CS〜) hatenablog://entry/17680117126976452788 2009-11-12T21:00:53+09:00 2019-02-22T17:00:48+09:00 セクションマーカーを入力していく手間をちょっとだけ省きます。すでにセクションは作成されていることが前提です。 自分の作業で使うために作ったので汎用性は微妙ですが、あまりにブログを書いてないのでたまには更新しようと思い立った次第。実行するとこんなダイアログが出るので、カンマ区切りで入力します。 数が足りないと怒られます。 動作確認はWindows版CS4でしかしていませんが、たぶんCS以降なら動くんじゃないかと…… (function(){ var defaultArrStr = "1,2,3,4,5,6,7,8,9"; var secs = app.activeDocument.section… <p>セクションマーカーを入力していく手間をちょっとだけ省きます。すでにセクションは作成されていることが前提です。<br /> 自分の作業で使うために作ったので汎用性は微妙ですが、あまりにブログを書いてないのでたまには更新しようと思い立った次第。</p><p>実行するとこんなダイアログが出るので、カンマ区切りで入力します。<br /> <span itemscope itemtype="http://schema.org/Photograph"><a href="http://f.hatena.ne.jp/chalcedony_htn/20091112205933" class="hatena-fotolife" itemprop="url"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/chalcedony_htn/20091112/20091112205933.png" alt="f:id:chalcedony_htn:20091112205933p:image" title="f:id:chalcedony_htn:20091112205933p:image" class="hatena-fotolife" itemprop="image"></a></span><br /> 数が足りないと怒られます。<br /> 動作確認は<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a>版CS4でしかしていませんが、たぶんCS以降なら動くんじゃないかと……</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink>(<span class="synIdentifier">function</span>()<span class="synIdentifier">{</span> <span class="synIdentifier">var</span> defaultArrStr = <span class="synConstant">&quot;1,2,3,4,5,6,7,8,9&quot;</span>; <span class="synIdentifier">var</span> secs = app.activeDocument.sections; <span class="synIdentifier">var</span> secsLength = secs.length; <span class="synIdentifier">var</span> dlg = app.dialogs.add(<span class="synIdentifier">{</span>name:<span class="synConstant">&quot;セクションマーカー一括設定&quot;</span><span class="synIdentifier">}</span>); <span class="synIdentifier">var</span> col = dlg.dialogColumns.add(); col.dialogRows.add().staticTexts.add(<span class="synIdentifier">{</span>staticLabel:<span class="synConstant">&quot;セクションマーカーを入力してください。&quot;</span><span class="synIdentifier">}</span>); col.dialogRows.add().staticTexts.add(<span class="synIdentifier">{</span>staticLabel:<span class="synConstant">&quot;半角カンマ区切りで &quot;</span> + secsLength + <span class="synConstant">&quot; 個以上必要です。&quot;</span><span class="synIdentifier">}</span>); <span class="synIdentifier">var</span> textbox = col.dialogRows.add().textEditboxes.add(<span class="synIdentifier">{</span>editContents:defaultArrStr,minWidth:200<span class="synIdentifier">}</span>); <span class="synIdentifier">var</span> getArr = <span class="synIdentifier">function</span>()<span class="synIdentifier">{</span> <span class="synStatement">if</span>( dlg.show() ) <span class="synIdentifier">{</span> <span class="synIdentifier">var</span> arr = textbox.editContents.split(<span class="synConstant">&quot;,&quot;</span>); <span class="synStatement">if</span> ( arr.length &lt; secsLength ) <span class="synIdentifier">{</span> <span class="synStatement">alert</span>(<span class="synConstant">&quot;マーカーの数が足りません!&quot;</span>); getArr(); <span class="synIdentifier">}</span> <span class="synStatement">else</span> <span class="synIdentifier">{</span> <span class="synStatement">return</span> arr; <span class="synIdentifier">}</span> <span class="synIdentifier">}</span> <span class="synIdentifier">}</span> <span class="synIdentifier">var</span> markerArr = getArr(); <span class="synStatement">if</span> ( !markerArr ) <span class="synIdentifier">{</span> <span class="synStatement">return</span>; <span class="synIdentifier">}</span> <span class="synStatement">for</span> ( <span class="synIdentifier">var</span> i = 0, len = secs.length; i &lt; len; i++ ) <span class="synIdentifier">{</span> secs<span class="synIdentifier">[</span>i<span class="synIdentifier">]</span>.marker = markerArr<span class="synIdentifier">[</span>i<span class="synIdentifier">]</span>; <span class="synStatement">alert</span>(<span class="synConstant">&quot;セクション「&quot;</span> + secs<span class="synIdentifier">[</span>i<span class="synIdentifier">]</span>.marker + <span class="synConstant">&quot;」 : &quot;</span> + secs<span class="synIdentifier">[</span>i<span class="synIdentifier">]</span>.pageNumberStart + <span class="synConstant">&quot;ページから&quot;</span>); <span class="synIdentifier">}</span> dlg.destroy(); <span class="synIdentifier">}</span>)(); </pre><p>コメント入れるのサボってます。</p><p>最初のdefaultArrStrの値を変えると、ダイアログにあらかじめ入力されてるテキストが変わります。<br /> このあたりもうちょっとまじめに作りこんだら使い勝手が良くなる気がします……特定のスタイル(見出しなど)のついたテキストを自動で放り込むとか。そもそもそのスタイルついてたらセクションを自動で作成するとか。</p> chalcedony_htn 正規表現の先読みと後読みはどっちがどっちだかわかりにくいんだよ!(追記あり) hatenablog://entry/17680117126976452828 2009-09-07T19:20:33+09:00 2019-02-22T17:00:49+09:00 といつも思うので、自分用にメモすることで覚えようという魂胆です。 以下はInDesign CS4の正規表現について記述します(たしかCS3から使えたような気がする)。 結論から 名前 英語で 位置 演算子 後読み lookbehind マッチパターンより前の部分 (?<=) 肯定(?<!) 否定 先読み lookahead マッチパターンより後の部分 (?=) 肯定(?!) 否定 肯定の場合はパターンの前が「=」、否定の場合は「!」。 英語を見ると「後読み」「先読み」の訳語も納得できそうな気はするのですが、やっぱりわかりにくいです。背後と前方……とか言うとまた混ざるし! 「つぎの電車」と「こん… <p>といつも思うので、自分用にメモすることで覚えようという魂胆です。<br /> 以下は<a class="keyword" href="http://d.hatena.ne.jp/keyword/InDesign">InDesign</a> CS4の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%B5%B5%AC%C9%BD%B8%BD">正規表現</a>について記述します(たしかCS3から使えたような気がする)。</p> <div class="section"> <h4>結論から</h4> <table> <tr> <th>名前</th> <th>英語で</th> <th>位置</th> <th><a class="keyword" href="http://d.hatena.ne.jp/keyword/%B1%E9%BB%BB%BB%D2">演算子</a></th> </tr> <tr> <td>後読み</td> <td>look<strong>behind</strong></td> <td>マッチパターンより<strong>前</strong>の部分</td> <td>(?&lt=) 肯定<br />(?&lt!) 否定</td> </tr> <tr> <td>先読み</td> <td>look<strong>ahead</strong></td> <td>マッチパターンより<strong>後</strong>の部分</td> <td>(?=) 肯定<br />(?!) 否定</td> </tr> </table><p>肯定の場合はパターンの前が「=」、否定の場合は「!」。<br /> 英語を見ると「後読み」「先読み」の訳語も納得できそうな気はするのですが、やっぱりわかりにくいです。背後と前方……とか言うとまた混ざるし!<br /> 「つぎの電車」と「こんどの電車」はどっちが早く発車するかみたいな感じに似ていますな。<br /> 別に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B1%E9%BB%BB%BB%D2">演算子</a>さえ覚えてしまえば名前は意識しなくてもよさそうなのですが、せっかく<a class="keyword" href="http://d.hatena.ne.jp/keyword/InDesign">InDesign</a>には<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%B5%B5%AC%C9%BD%B8%BD">正規表現</a>の記述支援機能がついてるので、どうにか慣れておきたいところです。</p> </div> <div class="section"> <h4>先読みと後読みは便利</h4> <p>テキストデータがあって、あるパターンをもった文字列を探したいけど、その中でも「後ろに/前に決まったパターンの文字列がある場合だけ」マッチさせたい、みたいなときに活躍します。<br /> 例えば「2009年9月7日19時00分〜9月17日8時30分」とかいうテキストがあって、「○時」の数字だけ取り出したい場合は「直前に『日』があって、直後に『時』がある1桁以上の数字」を検索できればOK。<br /> これを<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%B5%B5%AC%C9%BD%B8%BD">正規表現</a>で書くと</p> <pre>(?<=日)\d+(?=時) </pre><p>こうなります。</p> <table> <tr> <td>(?<=日)</td> <td>後読み部分</td> </tr> <tr> <td>\d+</td> <td>マッチ部分</td> </tr> <tr> <td>(?=時)</td> <td>先読み部分</td> </tr> </table><p>ですね。</p> </div> <div class="section"> <h4>先読みと後読みは便利その2</h4> <p>先の例、検索で場所を探したいだけなら、実は後読みだの先読みだの考える必要もなかったりします。</p> <pre>日\d+時 </pre><p>だけでも検索には引っかかる。<br /> ただし、そのときのマッチ文字列は「日19時」と「日8時」。一方先読み/後読みを使った場合、マッチ文字列は「19」「8」になります。先読み/後読みの部分は除外されてます。<br /> この差は大きいです。例えば見つけた数字の修正をしたい場合でも、前者だと数字のところまでカーソルを動かさなければなりませんが、後者ならそのまま数字を打ち込めばいいわけです。<br /> もしくは、数字の部分だけに文字スタイルを適用したい場合も、後者ならば置換文字列に「$0」(「見つかったテキスト」)を入力して、置換形式のところで文字スタイルを指定して置換すればいいだけ。いちいち数字部分を選択しなおしてスタイル適用、が必要ありません。</p> </div> <div class="section"> <h4>あと、例のアレ</h4> <p>CS4の「<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%B5%B5%AC%C9%BD%B8%BD">正規表現</a>スタイル」。これを使うときはスタイルを設定したい文字列だけを厳密に取り出す必要があるので、先読み/後読みの使いこなしが前提になりますね。<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%B5%B5%AC%C9%BD%B8%BD">正規表現</a>スタイルは非常に気に入っている機能<a href="#f-243e1ded" name="fn-243e1ded" title="実を言えばCS4導入の一番の動機がコレ">*1</a>なので熱く語りたいところですが、まあ、いつかそのうち。</p> </div> <div class="section"> <h4>これだけ書けば</h4> <p>いい加減私のスカスカな脳ミソでも覚えただろう(`・ω・´)</p><p>『後読みが前、先読みが後ろ!』 ……やっぱりわかりにくい!! ><</p> </div> <div class="section"> <h4>追記(2009/09/08)</h4> <p><a href="http://blog.hatena.ne.jp/seuzo/">id:seuzo</a>さんからコメントをいただいて、もうちょっとだけわかった気がしたので追記しておきます。</p> <blockquote> <p>「後読み」のことを「戻り読み」ともいいます。</p> </blockquote> <blockquote> <p>(?=re)先読み指定があると、<br /> まだ読んでいない部分を先読みしてマッチしたら全体のマッチを成功させます。<br /> (?<=re)後読み指定があると、<br /> マッチ部分の後ろまで戻って、マッチしたら全体のマッチを成功させます。</p> </blockquote> <pre class="code" data-lang="" data-unlink>       |    \  __  /    _ (m) _ピコーン       |ミ|     /  `´  \      (&#39;A`)      ノヽノヽ        くく</pre><p>こうかな?<br /> <span itemscope itemtype="http://schema.org/Photograph"><a href="http://f.hatena.ne.jp/chalcedony_htn/20090908181152" class="hatena-fotolife" itemprop="url"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/chalcedony_htn/20090908/20090908181152.jpg" alt="f:id:chalcedony_htn:20090908181152j:image" title="f:id:chalcedony_htn:20090908181152j:image" class="hatena-fotolife" itemprop="image"></a></span><br /> マッチ部分を基準にして、データ処理の流れの「先を読む」か「後ろに戻る」か。<br /> やっぱり英語のほうがわかりやすい気がするけど<a href="#f-526c5372" name="fn-526c5372" title="日本語の場合「先手」「後手」という言葉もあるし、って自分で混乱させているな">*2</a>、これでなんとか覚えられそうです。日本語ムズカシネー</p> </div><div class="footnote"> <p class="footnote"><a href="#fn-243e1ded" name="f-243e1ded" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">実を言えばCS4導入の一番の動機がコレ</span></p> <p class="footnote"><a href="#fn-526c5372" name="f-526c5372" class="footnote-number">*2</a><span class="footnote-delimiter">:</span><span class="footnote-text">日本語の場合「先手」「後手」という言葉もあるし、って自分で混乱させているな</span></p> </div> chalcedony_htn (修正版)Illustrator 10で、正規表現にマッチする文字が連続してるときだけトラッキングをかけるJavaScript hatenablog://entry/17680117126976452866 2009-08-06T18:14:14+09:00 2019-02-22T17:00:50+09:00 まさかの2日連続投稿ですが、ただの続きです。昨日のスクリプトですが、せっかく正規表現を使っているのになぜか一文字ずつ検索していました。あほか。 一応動くとはいえ文字が多くなると激重だったので、勉強もかねて書き直したものが下です。パフォーマンスの改善に加えて、せっかくなので相対値だけじゃなくて絶対値指定? もできるようにしました。 // 正規表現にマッチする文字が並んでるときだけ指定量トラッキング // 下の例だと、「正規表現にマッチする」を処理した場合は // 「マ」「ッ」に-20のトラッキングがかかります。 // 09.08.06修正 // ・一文字ずつ現在値から増減するか、全文字を指定した… <p>まさかの2日連続投稿ですが、ただの続きです。</p><p><a href="http://d.hatena.ne.jp/chalcedony_htn/20090805/1249467691">&#x6628;&#x65E5;&#x306E;&#x30B9;&#x30AF;&#x30EA;&#x30D7;&#x30C8;</a>ですが、せっかく<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%B5%B5%AC%C9%BD%B8%BD">正規表現</a>を使っているのになぜか一文字ずつ検索していました。あほか。<br /> 一応動くとはいえ文字が多くなると激重だったので、勉強もかねて書き直したものが下です。パフォーマンスの改善に加えて、せっかくなので相対値だけじゃなくて絶対値指定? もできるようにしました。</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synComment">// 正規表現にマッチする文字が並んでるときだけ指定量トラッキング</span> <span class="synComment">// 下の例だと、「正規表現にマッチする」を処理した場合は</span> <span class="synComment">// 「マ」「ッ」に-20のトラッキングがかかります。</span> <span class="synComment">// 09.08.06修正</span> <span class="synComment">// ・一文字ずつ現在値から増減するか、全文字を指定した値に変更するか、選べるようにしました</span> <span class="synComment">// ・動作が劇的に速くなりました</span> (<span class="synIdentifier">function</span>()<span class="synIdentifier">{</span> <span class="synComment">// ----------------------------</span> <span class="synIdentifier">var</span> amount = -20 <span class="synIdentifier">var</span> charClass = <span class="synConstant">&quot;[ァ-ン]&quot;</span>; <span class="synComment">// エスケープとかは自分でやってね</span> <span class="synIdentifier">var</span> relative = <span class="synConstant">true</span>; <span class="synComment">// true: それぞれ現在値から増減 false:すべて指定した値に変更</span> <span class="synComment">// ----------------------------</span> <span class="synComment">// 以下本体 =================================================</span> <span class="synStatement">if</span> ( selection.length == 0 ) <span class="synIdentifier">{</span> <span class="synStatement">alert</span>(<span class="synConstant">&quot;何か選択して!&quot;</span>); <span class="synStatement">return</span>; <span class="synIdentifier">}</span> <span class="synIdentifier">var</span> sel = selection; charClass += <span class="synConstant">&quot;+&quot;</span>; <span class="synComment">// 量指定子追加</span> <span class="synIdentifier">var</span> rex = <span class="synStatement">new</span> <span class="synType">RegExp</span>(charClass,<span class="synConstant">&quot;g&quot;</span>); <span class="synStatement">for</span> ( <span class="synIdentifier">var</span> i = 0, len = sel.length; i &lt; len; i++ ) <span class="synIdentifier">{</span> <span class="synIdentifier">var</span> tmp = sel<span class="synIdentifier">[</span>i<span class="synIdentifier">]</span>; <span class="synStatement">if</span> ( tmp.typename != <span class="synConstant">&quot;TextArtItem&quot;</span> ) <span class="synIdentifier">{</span> <span class="synStatement">alert</span>(<span class="synConstant">&quot;テキストじゃないので飛ばします&quot;</span>); <span class="synStatement">continue</span>; <span class="synIdentifier">}</span> tmp = tmp.textRange(); <span class="synComment">// textRangeオブジェクトに変更</span> <span class="synIdentifier">var</span> contents = tmp.contents; <span class="synIdentifier">var</span> m = <span class="synIdentifier">[]</span>; <span class="synStatement">while</span> ( m = rex.exec(contents) ) <span class="synIdentifier">{</span> <span class="synIdentifier">var</span> index = m.index; <span class="synStatement">if</span> ( index == contents.length - 1 ) <span class="synIdentifier">{</span> <span class="synStatement">break</span>; <span class="synIdentifier">}</span> <span class="synComment">// 最後の文字ならループ抜ける</span> <span class="synIdentifier">var</span> range = tmp.textRange(index, rex.lastIndex -2); <span class="synComment">// 見つかった文字列の、最後から2番目の文字まで</span> <span class="synComment">// 相対指定かどうかで処理を分ける。</span> <span class="synComment">// relativeがtrueのときは現在の値を増減するので一文字ずつ処理する</span> <span class="synStatement">if</span> ( relative ) <span class="synIdentifier">{</span> <span class="synIdentifier">var</span> chars = range.characters; <span class="synStatement">for</span> ( <span class="synIdentifier">var</span> j = 0, c_len = chars.length; j &lt; c_len; j++ ) <span class="synIdentifier">{</span> chars<span class="synIdentifier">[</span>j<span class="synIdentifier">]</span>.tracking += amount; <span class="synIdentifier">}</span> <span class="synIdentifier">}</span> <span class="synStatement">else</span> <span class="synIdentifier">{</span> range.tracking = amount; <span class="synComment">// 絶対量ならいっぺんにいける</span> <span class="synIdentifier">}</span> <span class="synIdentifier">}</span> <span class="synComment">// whileループここまで</span> rex.lastIndex = 0; <span class="synComment">// 検索開始位置リセット</span> <span class="synIdentifier">}</span> <span class="synComment">// 選択オブジェクトループここまで</span> <span class="synStatement">alert</span>(<span class="synConstant">&quot;おしまい!&quot;</span>); <span class="synIdentifier">}</span>)(); </pre><p>要するに、量指定子を使ってト<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E9%A5%C3%A5%AD%A5%F3%A5%B0">ラッキング</a>をかける範囲をダイレクトに取得するようにしたってことです。おかげで次の文字がどうとか判定する必要もなくなり、<a class="keyword" href="http://d.hatena.ne.jp/keyword/RegExp">RegExp</a>オブジェクトを一つにしぼれました。うーん、昨日の自分が何を考えていたのかわからない。<br /> 相対値でなく全部同じ値にする場合はtextRangeオブジェクトのtrackingプロパティを使えば一文字ずつ処理する必要がなくなるので、より速くなります(よほど大量にヒットしなければ大差ないですが)。<br /> ただ、一つの状況に最適化すると応用が利かなくなるというわけで、characterオブジェクトにあってtextRangeオブジェクトにないプロパティを操作したい場合にはいろいろ書き換えが必要になってしまいますね。たいしたことないけど。</p> chalcedony_htn Illustrator 10で、正規表現にマッチする文字が連続してるときだけトラッキングをかけるJavaScript hatenablog://entry/17680117126976452913 2009-08-05T19:21:31+09:00 2019-02-22T17:00:51+09:00 タイトル長い。★追記:激重だったので修正版作りました!どうにも入りきらないテキストをむりくりスペースに収めたいとき、かなの間だけ詰めたりすることがよくあります。それを自動でやろうっていうスクリプトです。俺得です。 Illustrator 10はダイアログを出したりできない(ぽい)ので、文字やトラッキング量の指定はスクリプトを書き換えて行います。10じゃなければ、「イラストレーターで正規表現とテキストの変形 - なにする?DTP+WEB」でもっとずっと高性能なものが配布されています。いいなあこれ使いたいなあ……。 // 正規表現にマッチする文字が並んでるときだけ指定量トラッキング // 選択した… <p>タイトル長い。</p><p><ins datetime="2009-08-06T18:16:17+09:00">★追記:激重だったので<a href="http://d.hatena.ne.jp/chalcedony_htn/20090806/1249550054">&#x4FEE;&#x6B63;&#x7248;</a>作りました!</ins></p><p>どうにも入りきらないテキストをむりくりスペースに収めたいとき、かなの間だけ詰めたりすることがよくあります。それを自動でやろうっていう<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>です。俺得です。<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Illustrator">Illustrator</a> 10はダイアログを出したりできない(ぽい)ので、文字やト<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E9%A5%C3%A5%AD%A5%F3%A5%B0">ラッキング</a>量の指定は<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>を書き換えて行います。10じゃなければ、「<a href="http://d.hatena.ne.jp/kamiseto/20090804/1249382461">&#x30A4;&#x30E9;&#x30B9;&#x30C8;&#x30EC;&#x30FC;&#x30BF;&#x30FC;&#x3067;&#x6B63;&#x898F;&#x8868;&#x73FE;&#x3068;&#x30C6;&#x30AD;&#x30B9;&#x30C8;&#x306E;&#x5909;&#x5F62; - &#x306A;&#x306B;&#x3059;&#x308B;&#xFF1F;DTP+WEB</a>」でもっとずっと高性能なものが配布されています。いいなあこれ使いたいなあ……。</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink><span class="synComment">// 正規表現にマッチする文字が並んでるときだけ指定量トラッキング</span> <span class="synComment">// 選択したテキストオブジェクト(TextArtItem)について処理します。複数選択対応。</span> <span class="synComment">// 下の例だと、「正規表現にマッチする」を処理した場合は</span> <span class="synComment">// 「マ」「ッ」に-20のトラッキングがかかります。</span> <span class="synComment">// すでにトラッキングが設定されている場合は現状から増減します。</span> (<span class="synIdentifier">function</span>()<span class="synIdentifier">{</span> <span class="synComment">// ----------------------------</span> <span class="synIdentifier">var</span> amount = -20 <span class="synIdentifier">var</span> charClass = <span class="synConstant">&quot;[ァ-ン]&quot;</span>; <span class="synComment">// エスケープとかは自分でやってね</span> <span class="synComment">// ----------------------------</span> <span class="synComment">// 以下本体 =================================================</span> <span class="synStatement">if</span> ( selection.length == 0 ) <span class="synIdentifier">{</span> <span class="synStatement">alert</span>(<span class="synConstant">&quot;何か選択してください&quot;</span>); <span class="synStatement">return</span>; <span class="synIdentifier">}</span> <span class="synIdentifier">var</span> sel = selection; <span class="synIdentifier">var</span> rex = <span class="synStatement">new</span> <span class="synType">RegExp</span>(charClass,<span class="synConstant">&quot;g&quot;</span>); <span class="synIdentifier">var</span> rex2 = <span class="synStatement">new</span> <span class="synType">RegExp</span>(charClass); <span class="synStatement">for</span> ( <span class="synIdentifier">var</span> i = 0, len = sel.length; i &lt; len; i++ ) <span class="synIdentifier">{</span> <span class="synIdentifier">var</span> tmp = sel<span class="synIdentifier">[</span>i<span class="synIdentifier">]</span>; <span class="synStatement">if</span> ( tmp.typename != <span class="synConstant">&quot;TextArtItem&quot;</span> ) <span class="synIdentifier">{</span> <span class="synStatement">alert</span>(<span class="synConstant">&quot;テキストじゃないので飛ばします&quot;</span>); <span class="synStatement">continue</span>; <span class="synIdentifier">}</span> tmp = tmp.textRange(); <span class="synComment">// textRangeオブジェクトに変更</span> <span class="synIdentifier">var</span> contents = tmp.contents; <span class="synIdentifier">var</span> characters = tmp.characters; <span class="synIdentifier">var</span> m = <span class="synIdentifier">[]</span>; <span class="synStatement">while</span> ( m = rex.exec(contents) ) <span class="synIdentifier">{</span> <span class="synIdentifier">var</span> index = m.index; <span class="synStatement">if</span> ( index == characters.length - 1 ) <span class="synIdentifier">{</span> <span class="synStatement">break</span>; <span class="synIdentifier">}</span> <span class="synComment">// 最後の文字ならループ抜ける</span> <span class="synIdentifier">var</span> tc = tmp.characters<span class="synIdentifier">[</span>index<span class="synIdentifier">]</span>; <span class="synIdentifier">var</span> nc = tmp.characters<span class="synIdentifier">[</span>index + 1<span class="synIdentifier">]</span>; <span class="synStatement">if</span> ( !nc.contents.match(rex2) ) <span class="synIdentifier">{</span> <span class="synStatement">continue</span>; <span class="synIdentifier">}</span> <span class="synComment">// 次が違う文字クラスだったらパス</span> tc.tracking += amount; <span class="synComment">// ★</span> <span class="synIdentifier">}</span> <span class="synComment">// whileループここまで</span> rex.lastIndex = 0; <span class="synComment">// 検索開始位置リセット</span> <span class="synIdentifier">}</span> <span class="synComment">// 選択オブジェクトループここまで</span> <span class="synStatement">alert</span>(<span class="synConstant">&quot;おしまい!&quot;</span>); <span class="synIdentifier">}</span>)(); </pre><p>例によってエラーとかまじめに気にしてないです。</p><p>★のついてる行を書き換えれば、文字単位の属性にはいろいろ使いまわせる(んじゃないかな)と思います。<br /> ちなみにト<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E9%A5%C3%A5%AD%A5%F3%A5%B0">ラッキング</a>でなくカーニングを使いたい場合(あるんかな)には注意が必要で、</p> <pre class="code lang-javascript" data-lang="javascript" data-unlink>tc.kerning += (amount / 1000); <span class="synComment">// ★</span> </pre><p>と書き換えないととんでもない量になります。文字パレットと単位が違うんですね……。<br /> この単位の違い、リファレンスを見る限りCS2から解消されています。</p> chalcedony_htn InDesign単体でも白オーバープリント hatenablog://entry/17680117126976452961 2009-07-02T18:02:21+09:00 2019-02-22T17:00:52+09:00 もしかして常識だったらどうしよう。まあ、自分メモとして書いておくことにしよう。 Windows版しかわからないのだけど、Macだとどうなんだろう? InDesign単体なら大丈夫のはず InDesignは白や紙色のオブジェクトにオーバープリント属性を設定できません。プリント属性パネルのチェックが触れなくなるし、もともと別の色でオーバープリントが設定されているのを白に変えると自動でチェックが外れます。CS2までは線と塗りの入れ替えによってオーバープリント属性が残ってしまう問題(参考:DTP-Sブログ-ひねもすデジタルビヘイビア: InDesignでも発生する白のオーバープリント)があったのですが… <p>もしかして常識だったらどうしよう。まあ、自分メモとして書いておくことにしよう。<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a>版しかわからないのだけど、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac">Mac</a>だとどうなんだろう?</p> <div class="section"> <h4><a class="keyword" href="http://d.hatena.ne.jp/keyword/InDesign">InDesign</a>単体なら大丈夫のはず</h4> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/InDesign">InDesign</a>は白や紙色のオブジェクトにオーバープリント属性を設定できません。プリント属性パネルのチェックが触れなくなるし、もともと別の色でオーバープリントが設定されているのを白に変えると自動でチェックが外れます。CS2までは線と塗りの入れ替えによってオーバープリント属性が残ってしまう問題(参考:<a href="http://dtp-s2.seesaa.net/article/119121739.html">DTP-S&#x30D6;&#x30ED;&#x30B0;-&#x3072;&#x306D;&#x3082;&#x3059;&#x30C7;&#x30B8;&#x30BF;&#x30EB;&#x30D3;&#x30D8;&#x30A4;&#x30D3;&#x30A2;: InDesign&#x3067;&#x3082;&#x767A;&#x751F;&#x3059;&#x308B;&#x767D;&#x306E;&#x30AA;&#x30FC;&#x30D0;&#x30FC;&#x30D7;&#x30EA;&#x30F3;&#x30C8;</a>)があったのですが、CS3からはその点も修正されています。</p> </div> <div class="section"> <h4>と思ったら、段落境界線に罠が</h4> <p><strong>以下、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows%20XP">Windows XP</a> SP2、<a class="keyword" href="http://d.hatena.ne.jp/keyword/InDesign">InDesign</a> CS4(6.0.3)でやってます(CS1でも同様になります)。</strong><br /> 私はこんな感じの囲み線を使った見出しをよく作ります。段落前境界線に色を設定し、段落後境界線を白にしてうまいこと重ねるとできます。(参考:<a href="http://d.hatena.ne.jp/n-yuji/20050819">2005-08-19 - &#x9060;&#x8FD1;&#x6CD5;&#x30CE;&#x30FC;&#x30C8;</a>)<br /> <span itemscope itemtype="http://schema.org/Photograph"><a href="http://f.hatena.ne.jp/chalcedony_htn/20090702175753" class="hatena-fotolife" itemprop="url"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/chalcedony_htn/20090702/20090702175753.png" alt="f:id:chalcedony_htn:20090702175753p:image" title="f:id:chalcedony_htn:20090702175753p:image" class="hatena-fotolife" itemprop="image"></a></span><br /> 上に重ねる白い線の設定はこんな感じ。ちゃんとオーバープリントのチェックは触れなくなっています(なんか中に■があるけど、まあ、いいか)。<br /> <span itemscope itemtype="http://schema.org/Photograph"><a href="http://f.hatena.ne.jp/chalcedony_htn/20090702175754" class="hatena-fotolife" itemprop="url"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/chalcedony_htn/20090702/20090702175754.png" alt="f:id:chalcedony_htn:20090702175754p:image" title="f:id:chalcedony_htn:20090702175754p:image" class="hatena-fotolife" itemprop="image"></a></span><br /> ここからが問題。たとえば配色に悩んでいて、いろいろいじっている間になぜかオーバープリントに設定してしまったりして……<br /> <span itemscope itemtype="http://schema.org/Photograph"><a href="http://f.hatena.ne.jp/chalcedony_htn/20090702175755" class="hatena-fotolife" itemprop="url"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/chalcedony_htn/20090702/20090702175755.png" alt="f:id:chalcedony_htn:20090702175755p:image" title="f:id:chalcedony_htn:20090702175755p:image" class="hatena-fotolife" itemprop="image"></a></span><br /> やっぱ白でしょ、と色の設定を白に戻します。<br /> <span itemscope itemtype="http://schema.org/Photograph"><a href="http://f.hatena.ne.jp/chalcedony_htn/20090702175756" class="hatena-fotolife" itemprop="url"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/chalcedony_htn/20090702/20090702175756.png" alt="f:id:chalcedony_htn:20090702175756p:image" title="f:id:chalcedony_htn:20090702175756p:image" class="hatena-fotolife" itemprop="image"></a></span><br /> オーバープリントのチェックは触れなくなり、最初の設定と同じ状態に見えます。<br /> でも、ここでオーバープリントプレビューに切り換えてみると……<br /> <span itemscope itemtype="http://schema.org/Photograph"><a href="http://f.hatena.ne.jp/chalcedony_htn/20090702175757" class="hatena-fotolife" itemprop="url"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/chalcedony_htn/20090702/20090702175757.png" alt="f:id:chalcedony_htn:20090702175757p:image" title="f:id:chalcedony_htn:20090702175757p:image" class="hatena-fotolife" itemprop="image"></a></span><br /> あばばばばば。真っ青です。</p> </div> <div class="section"> <h4>他にも</h4> <p>下線や取り消し線の色、あとは段落スタイル・文字スタイルの文字カラーなどでも同じようなことが起きています。文字カラーのほうはもっと恐ろしくて、チェックが完全に外れているように見えるのにオーバープリントになっています。<br /> 設定のON/OFFに関わらずパネルで同じように見えるっていうのは明らかにおかしいと思うんですけど、なんにしろオーバープリントまわりはやっぱり怖い((( ゚Д゚)))<br /> CS4だとライブプリフライト機能で簡単に発見できるのが救いです……<a href="#f-42dcb722" name="fn-42dcb722" title="ただしデフォルトだとそこまで警告してくれない">*1</a><br /> やっぱり、よっぽどの理由がない限りオーバープリントは触っちゃだめってことですね。</p> </div><div class="footnote"> <p class="footnote"><a href="#fn-42dcb722" name="f-42dcb722" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">ただしデフォルトだとそこまで警告してくれない</span></p> </div> chalcedony_htn