InDesignの制御文字について調べてみた
InDesignはとても多様な機能を持ったDTP組版アプリケーションです。そして、その多様な機能をドキュメント内部で記録しておくために、当然さまざまな「制御文字」を使っています。この制御文字は、XML書き出しやEPUB書き出しなどをした際には意味を持たなくなるわけですが、これがそのままXMLに書き出されれば当然トラブルの種になりそうです。ということで、InDesignの制御文字についてちょっと調べてみました。なお、調査した環境はOS X 10.9/InDesign CS6です。
調査対象の文字
今回調査の対象にしたのは、InDesign内コンテキストメニューの「特殊文字の挿入」「スペースの挿入」「分割文字の挿入」から選択して入力できる文字のうち、明らかに通常の記号に過ぎないものおよび、ページ番号など通常EPUBには書き出さないものを除いたもの(「特殊文字/記号」「特殊文字/マーカー」「特殊文字/引用符」項目を除去)、および、索引マーカー、脚注マーカーなどの各制御文字です。また、今回の基本資料として、こちらの英文記事を参考にしました。
これをもとに機能名を日本語版InDesignでの表記に置き換え、またEPUB制作時にXMLでの書き出しを行うとどういった状態で出力されるのか、同じくコピー&ペーストで書き出した場合はどうなるかに関して調べました。結果が以下の表です(クリックでGoogleドキュメントの元データにジャンプ)。
特に注意が必要そうな箇所は赤で塗りつぶしてあります。XML書き出し時にはかなりの制御文字が削除もしくは置き換えられていることがわかります。また、改行などを見ればわかるように、同一のコードが複数の制御文字に割り当てられています。あくまで推測ですが、InDesign内で異体字を表示する際に親字のUnicodeひとつに対して複数の異体字をaalt等のサブ属性を割り振って管理しているのと同種の処理を行っているのではないかと思います。
XML書き出しで問題が出そうな文字
さて、InDesignはXML書き出し時におおむね問題のない置換を行ってくれているようなのですが、いくつかちょっと問題のある処理があるようです。
ちょっと問題ありそうな箇所を列挙してみます。
・U+2011の分散禁止ハイフンが消えてしまう
・U+2003のEMスペースが通常の半角スペースに変わる(幅が狭すぎる)
・U+00A0の分散禁止スペース(ノーブレークスペース)がそのまま残る
・U+2006の1/6スペースがそのまま残る
・U+2005の1/4スペースがそのまま残る
・U+2004の1/3スペースがそのまま残る
・U+000Aの強制改行が通常の半角スペースに変わる
・U+200Bの任意の改行がそのまま残る
「分散禁止ハイフン」が消えてしまうのはとても困った挙動で、これは欧文の前後の文字を行末改行させないという挙動以外は通常のハイフンと変わらない約物ですので、消えてもらっては困ります。せめて通常のハイフンに置換して欲しいところです。
また、特殊幅スペース類に関しては、欧文フォントにはグリフの割り当てがあるようですので将来的にEPUBのほとんどのビューアで部分言語指定がきちんと反映されるようになってくればそのままでもよいかと思うのですが、現状では部分言語指定が効くビューアの方が少数で、また日本語フォントには該当コードポイントにグリフの割り当てがないようですので、現状まだ半角スペース等に変換した方が無難と考えます。
それから改行コード類ですが、「強制改行」は通常、組版の最終段階で文章中の改行位置の微調整に使うものですので、これが半角スペースになるのは困ります。削除が正しい対処かと思います。あとは「任意の改行」ですが、これは主に欧文などで長い単語が行末に来た際などに改行を許す位置を指し示すためのものですので、こちらもEPUB化では削除するのが正しそうです。
他には「索引の付加位置を示すマーカー」、「脚注のマーカー」、「アンカーオブジェクトのマーカー」、「CID/GIDしかない文字のInDesign内部表示用キャラクタ(参考)」が消えてしまうのも問題で気になるところですが、これらについては目視確認して個別箇所の処理が必要になりますので、別枠とします。
XML書き出し前にInDesign内で置換処理を行う必要がある
さて、対処なのですが、どうやらXML書き出しを行う前に、InDesign内で処置をする必要がありそうです。例えば強制改行などは半角スペースに置換されて書き出されてしまうため、XML書き出しを行った後では目視で潰すしかなくなってしまいます。ということでInDesign内でスクリプト処理を行うとすると、例えばAppleScriptを使って
1 2 3 4 5 6 7 8 9 10 11 12 13 |
tell application "Adobe InDesign CS6" --置換元:置換先をネストしたリストで列挙 set replaceCharaList to {{"<0009>", ""}, {"<2011>", "<002d>"}, {"<2003>", "<3000>"}, {"<00A0>", "<0020>"}, {"<2006>", "<0020>"}, {"<2005>", "<0020>"}, {"<2004>", "<0020>"}, {"<000A>", ""}, {"<200b>", ""}} --置換元:置換先を1項目ずつ取り出して置換実行 repeat with myCharaSet in replaceCharaList set myFindChara to item 1 of myCharaSet set myReplaceChara to item 2 of myCharaSet --置換処理 set find what of find text preferences to myFindChara set change to of change text preferences to myReplaceChara change text document 1 end repeat end tell |
といった形で、検索置換パレットを使ったループ処理を行うことになります。多少時間がかかりますが、制御文字の性質上これは仕方ありません。
コピー&ペーストで問題の出そうな文字
一方でInDesign内のテキストをそのままコピーし、テキストエディタにペーストした場合には、索引マーカー、脚注マーカー、アンカーオブジェクトマーカー、XMLタグマーカーなどを例外として、ほぼ全ての制御文字がそのままペーストされるようです。miにペーストした際にはU+2001のフラッシュスペースがU+2003のEMスペースに変換されるという挙動が見られたのですが、これはどうやらmiのみの問題のようで、テキストエディット等にペーストした際にはU+2001のままペーストされました。おそらくmiの内部でこのコードポイントを使用して何らかの処理をしており、それとバッティングするのを防ぐために変換されたものと思われます。
そのままペーストされるということは制御文字が剥き出しになるということなので、これは置換、削除する必要が出てきます。処理内容としては
・U+00ADの任意ハイフン → 削除
・U+0008の右インデントタブ → 削除
・U+0007の「ここまでインデント」文字 → 削除
・U+0003の先頭文字スタイルの終了文字 → 削除
・U+200Cの結合なし → 削除
・U+2003のEMスペース → 全角スペースに
・U+00A0の分散禁止スペース → 半角スペースに
・U+202Fの分散禁止スペース(固定幅) → 半角スペースに
・U+200Aの極細スペース → 半角スペースに
・U+2006の1/6スペース → 半角スペースに
・U+2009の細いスペース → 半角スペースに
・U+2005の1/4スペース → 半角スペースに
・U+2004の1/3スペース → 半角スペースに
・U+2008の句読点等の間隔 → 半角スペースに
・U+2007の数字の間隔 → 半角スペースに
・U+2001のフラッシュスペース → 半角スペースに
・U+200B任意の改行 → 削除
といったところでしょうか。強制改行が普通の改行と見分けられなくなってしまうのは問題ですが、これはテキストになってしまった後では目視で発見するしかありませんので自動処理はできません。あるいはコピー&ペーストする前に(テキストデータにする前に)InDesign内の検索置換で消しておくというような処置をすることになるでしょう。
(2016.4.13)
市川せうぞー師匠より関連情報をお知らせいただきましたのでリンクを貼っておきます。こちらはJavascriptで自動組版する際の制御文字の扱いに関する情報の模様。
(2016.4.14追記)