(訂正 2017.11.11 11:09)CC2017では、古いドキュメントでも再現します。
(追記 2017.11.11 15:00)対策用のイベントスクリプトを追記しました。
(追記 2017.11.11 22:20)検証バージョンを追記しました。
(追記 2017.11.13 16:00)注意とスクリプトを追記しました。
(追記 2017.11.15 15:30)Adobeから日本語版サポートが出ました。
今朝方とんでもないものを見つけました。
報告してくださったQ.kenさん、ありがとうございます。
事件の概要
以下のGIF画像の通り、CC2017で作成した表組をコピー・ペーストした際、ヘッダーとフッターがきれいに消えます。その後表に編集を加えると復帰するというもの。
他のバージョンではどうか?
手元の環境(macOS 10.10.5、CS6〜CC2017)で試したところ、CC2017でだけ起こります。
また、これはCC2017で新規作成した場合に起こるようで、CS6で作った書類をCC2017で開いて同じことをしても発症しませんでした。
【訂正】古いドキュメントで作られた表でもCC2017では上のGIFのようになります。
CC2018は追って検証しますね。
【追記】CC2018では起きません。あくまでCC2017固有の不具合のようです。
解決策
解決策として、USフォーラムでは下記のサイトが紹介されています。
頼むから日本語でもアナウンスしてくれよ、Adobe…。
スクリプトでちょっとだけ対応
コピーとカットだけですが、スクリプトで監視するようにしました。
スクリプトはこちらからどうぞ。
ただ、コピーとカットは見張れるのですが、option+ドラッグで複製した場合は現段階では対応できていません。
どなたか「こんな方法があるよ!」という知見をお持ちの方、是非ご教示ください。
【追記 11/13 16:00】マスターページにある表をローカルページでオーバーライドしても発生するようです。
ソースコード
一応載せておきます。
/* InDesign CC2017(12.1)で、表組の複製時にヘッダーとフッターが消えてしまうことへの警告を出すイベントスクリプト 参考:https://forums.adobe.com/thread/2409742 ©Yusuke S.(@Uske_S) 2017.11.11 作成 配布元:http://uske-s.hatenablog.com/ */ #targetengine "checkHeaderFooter" if (parseInt(app.version,10) !== 12) exit(); app.menuActions.item("$ID/&Copy").addEventListener("beforeInvoke", main); app.menuActions.item("$ID/Cut").addEventListener("beforeInvoke", main); function main(){ var myDoc = app.activeDocument; var mySel = (myDoc.selection.length)? myDoc.selection: exit(); var res; for (var i=0; i<mySel.length; i++){ res = checkoutTxf(mySel[i]); var myAllItems = mySel[i].allPageItems; for (var k=0; k<myAllItems.length; k++) res = checkoutTxf(myAllItems[k]); } if (res) alert("コピーした選択範囲に表のヘッダー・フッターが含まれています。\rCC2017ではペースト後に表ヘッダー・フッターが消えますので注意してください"); //オブジェクトをチェックする関数 function checkoutTxf(obj){ if (obj.constructor.name === "TextFrame" && getTableHF(obj)) return true; } //テキストフレームの表内にヘッダーかフッターがあるか調べる function getTableHF(txfObj){ if (!txfObj.tables.length) return false; var t = txfObj.tables; for (var i=0; i<t.length; i++){ if (t[i].headerRowCount || t[i].footerRowCount) return true; } return false; } }
使い方
startupScriptsフォルダに入れてください。
startupScriptsとはなんぞや?という方は、先日のDTP勉強会のスライドを貼っておきますので、こちらをご参照ください。
スライド2枚めにあるように、ひとつのフォルダに任意のスクリプトをまとめておき、複数のバージョンのInDesign(のscriptsフォルダ)へエイリアスで対応させるとスマートです。ただこのスクリプトに関してはCC2017でだけ動作するようにしているので、CC2017のstartupScriptsフォルダに入れるだけでも事足りるとは思います。
スクリプトに関する不具合等はコメントしていただくか、Twitterでご連絡ください。
【追記 11/13 16:00】Q.kenさんのスクリプト(一部改変)
フォーラムでQ.kenさんがスクリプトを書いてくださいました。ただそのままだとペーストボードやマスターページのものが省かれてしまいます*1。そこで、Page.allPageItems
をDocument.allPageItems
に書き換えたものが下記スクリプトです。フォーラムにも投稿したので承認されれば見えるようになりますが、念のためこちらにも掲載しておきます。
//全ページに対して実行する var doc = app.activeDocument; //ページ内の全てのオブジェクトをループ処理でテキストフレームを選別 var allObjLen = doc.allPageItems.length; for (var j=0; j<allObjLen; j++) { var myItemAllObj = doc.allPageItems[j]; if (myItemAllObj.constructor.name === "TextFrame") { tableInFrame (myItemAllObj); } } //表を含むテキストフレームに対して1mm伸ばして元に戻す function tableInFrame (myTextFrame){ if (myTextFrame.tables.length > 0){ var frameY2 = myTextFrame.visibleBounds[2]; myTextFrame.visibleBounds = [ myTextFrame.visibleBounds[0], myTextFrame.visibleBounds[1], myTextFrame.visibleBounds[2]+1, myTextFrame.visibleBounds[3]]; myTextFrame.visibleBounds = [ myTextFrame.visibleBounds[0], myTextFrame.visibleBounds[1], frameY2, myTextFrame.visibleBounds[3]]; } }
欲を言えば「PDF書き出し」のメニューアクションのbeforeInvoke
イベントにでも挟めば完璧でしょう。その場合は、
Document.allPageItems
からTextFrame
オブジェクトを抽出し、中に表があれば(tables.length > 0
)ヘッダー・フッターの有無(HeaderRowCount
等)を調べる- ヘッダー・フッターがあればテキストフレームを調整していいのか警告を出す(
confirm
) - 良ければ上記スクリプトを実行する
てな感じでイベントを実装すればいいのかなと思います。
【追記 11/15 15:30】Adobe公式日本語版ヘルプ
やっと出ました。一体どんな不具合だったのかよくわからない「簡潔な」表記ですが、一応これで対応できそうです。
*1:Page.allPageItemsはローカルページに触れているオブジェクトに限定されます。PBやマスターも含めたい場合は、Document.allPageItemsを利用します。