k_ikiの雑記帳

DTPのこと、創作のことなど、思いつくまま

漱石が芥川・久米に宛てた手紙

明治の文豪・夏目漱石は、芥川が自殺する直前まで、彼宛に何度か手紙を書いている。

そのうち、芥川龍之介久米正雄両名に宛てた手紙の全文が掲載されたサイトを見つけたので、改めて読んでみた。

http://www.geocities.jp/sybrma/202sousekinotegami.html

無闇に褒めるのではない、徒に批判するのでもない。

文章の端々に見られる漱石一流の気遣いとユーモアに溢れた手紙。

この文を頂けるだけでどれほど嬉しい事だっただろうか。

 

苦悩に満ちた芥川の人生と共に、想像に頼る外ない当時の状況に想いを馳せる。

罫線の太さ

罫線の太さは、データ上でどのように設定していても、プリンターによってある程度補正されてしまう可能性がある。

線が細ければ細いほど、プリンターの解像度に影響されてしまう。

たとえば、0.1mmをかなり下回る、いわゆるヘアラインを印刷した場合。

 

600dpiのレーザープリンターだと、どんなに細い線を再現しようとしても、解像度の限界のせいで0.1mmより細い線はうまく再現できない。

同じ600dpiといえどもプリンターの機種や状態により差があるが、どんなに状態が良くても0.06mm程度までの再現が限界だろう。つまり、そこに線があれば、たとえその線幅がデータ上で0.06mmより細く設定されていても、0.06mmに近い太さで印字してしまうのだ。

また、0.07mmから0.1mmまでの罫線を0.01mm刻みで太さを変えて並べてみても、人間の目で違いがわかりづらいだけでなくプリンタの再現力のせいもあって、差異がほとんどわからないはずだ。

 

それに対し、2400dpiのレーザープリンターやイメージセッターだと、単純計算で最小の印字単位が600dpiのプリンターの1/4となる。

人間の目で、そこに罫線があると認識できないほど細い線でも印字できてしまう可能性があるのだ。

 

個人用に家庭用インクジェットやレーザープリンターで少部数を刷るだけなら、この問題は表面化しづらいだろう。なにせ、罫線自体は目に見える形で出力されてしまうのだから。では何が問題なのか。

大量に刷るため、業務用高解像度プリンターで印刷した場合に印刷事故がおきてしまう。

 

  • 校正用に安価なレーザープリンターから出力した。細い罫線がきちんと印字されている。
  • 校了となり、印刷に回した。刷り上がりを見ると、罫線が抜けてしまっている。(データ上、罫線は存在するが人間の目で見えないほど細い)

→印刷代と大量の紙が無駄になる。

 

これを防ぐため、Acrobatにはプリフライト機能が搭載されている。これにより、ある線幅よりも細い「ヘアライン」を警告するよう設定することができる。

 

なお、表組などで、表全体を囲む外側の罫は太い線・内側の線は細い線という使い分けをすることがよくある。

このとき、外罫を0.2mm、内罫を0.15mmと設定しても、見た目でほとんど差がわからないだろう。外罫を0.2mmにしたいなら内罫を0.1mmに。何らかの事情で内罫の太さとして0.15mmを確保したいなら外罫を0.3mmにするなど、太さのミリ数が小数点以下の罫線同士で強弱をつけたい場合、太いものが細いものの倍程度になるように設定するのが望ましいのではないかと思っている。

ルビ親文字差し替え

随分と昔、それこそAdobe CSシリーズの最初のバージョン向け(いや、もしかしたら2.0向けの時点で既に、かも)に流星さんがVBで作ってくださったスクリプトに、表題のようなものがありました。
振られているルビに影響を与えず、その親文字だけ文字を差し替えるためのスクリプトです。
そこで、書いてみましたがうまくいきません。

var my_sel = app.selection;
if (my_sel[0].rubyFlag == false){
    alert("ルビが設定された文字を選択してください");
    exit();
    }

var my_str = prompt("新しい親文字を入力してください。", my_sel[0].contents);
var my_ruby = my_sel[0].rubyString;
my_sel[0].contents = my_str;
my_sel[0].rubyFlag = true;
my_sel[0].rubyString = my_ruby;

説明のため、一旦話題を変えて標準機能のルビダイアログについて。
標準機能だと、複数の親文字にスペース区切りでモノルビが設定されている場合、親文字のどちらか一方を選んでルビダイアログを開くと……

こんな風に、ルビが設定された親文字全てを選んでくれます。

では、スクリプトの話に戻します。
上記のスクリプトだと、選択した文字しか拾ってくれません。例えば、図示したテキスト最初の文字「山」を選択した場合は「山」だけを。なんだか当然の事を言っているようですが、標準機能のルビダイアログとは動作が違うよ、ということです。
そのまま強引に文字を差し替えてみましょう。例えば、「山」を「川」に。

「路」のルビが見た目には消えてしまいました。ですが、情報としてはルビが残ったままの状態です。
一旦こうなると、ルビを一旦クリアして打ち直してやらないと直りません。
あるいは、上記スクリプトで親文字を両方とも選んで打ち直す(または打ち直さずそのままOKを押す)ことでも直ることは直ります。
 
このスクリプトの改善点としては、複数文字列にルビが設定されている場合、一文字だけ選んだ時の動作が標準機能によるルビダイアログと同様の選択結果になるのが理想ですが、そこで詰まってます。
なんか、すっごく単純なことのような気がするのですが、実際にはそうではありませんでした(^^;
 
今回もまた流星さんのお力をお借りし、上記の私のソースを改変していただきました。
複数文字列にルビが設定されている際、例えば先頭の一文字だけを選んでやれば対象の親文字を全て拾ってくれます。

#target indesign
// つか、メンドイんすけど、コレwww
if (app.selection!=0){
    var sel=app.selection[0];
    if (sel.constructor.name.match(/^Character|Text|Paragraph|Line|TextStyleRange|Word|TextColumn$/)){
        // ルビ文字判定
        if ( ! sel.rubyFlag ) {
            // ルビじゃない文字入ってるぜ
            alert("ルビが設定された文字を選択してください");
            exit();
            }
        // 選択範囲の前方確認
        var fc=sel.characters[0]; // 最初の文字
        if (fc.rubyFlag){
            /* 最初の文字がルビの親文字だったら、その前の文字も同じルビ文字を持つか? */
            rs=fc.rubyString;
            if (fc.index>1){
                ge=fc.parentStory.characters[fc.index-1];
                var aa=[];
                for (;;){
                        if (ge.rubyFlag==true && fc.rubyString==rs && ge.contents!="\r") { // 同じルビ文字だ
                            aa.push(ge.index);
                            if (ge.index-1==fc.parentStory.characters.length-2){ break }
                            ge.select(SelectionOptions.addTo); // 選択範囲に含むぜ
                            ge=fc.parentStory.characters[ge.index-1]; // 対象を変更
                        }else{ break }
                    }
                }
            } // 前方確認完了
        // 選択範囲の後方確認
        var lc=sel.characters[sel.characters.length-1]; // 最後の文字
        if (lc.rubyFlag){
            /* 最後の文字がルビの親文字だったら、その次の文字も同じルビ文字を持つか? */
            rs=lc.rubyString;
//~             alert(lc.index+1);
//~             alert(lc.parentStory.characters.length-1);
            if (lc.index+1<lc.parentStory.characters.length){
                ge=lc.parentStory.characters[lc.index+1];
                for (;;){
                        if (ge.rubyFlag==true && lc.rubyString==rs && ge.contents!="\r") { // 同じルビ文字だ
                            ge.select(SelectionOptions.addTo); // 選択範囲に含むぜ
                            if (ge.index+1<lc.parentStory.characters.length){
                                ge=lc.parentStory.characters[ge.index+1]; // 対象を変更
                                }else if(ge.index+1==lc.parentStory.characters.length){
                                    break;
                                }
                        }else{ break }}
                }
            } // 後方確認完了
        // 親文字入力プロンプトを表示する
        var my_sel=app.selection[0];
        var my_str=prompt("新しい親文字を入力してください。", my_sel.contents);
        if (my_str==null){ // キャンセルされたとき
            // 元の選択範囲を掴み直す
            sel.select();
            exit();
            }
        if (my_str !="") {
            var my_ruby=my_sel.rubyString;
            my_sel.contents=my_str;
            my_sel.rubyFlag=true;
            my_sel.rubyString=my_ruby;
        }
    }
    exit();
}

ルビの文字数に応じた変形の続き:モノルビを分割

今回は以前の日記ルビの文字数に応じた変形で書いた件について。
pictrix師匠から、もう解決済みではないかとのお返事をいただいているのですが、実はまだです(^^;
ではどうしているかというと、上記リンク先でも書いたとおり、バイカモさんの「ルビ分割修正」スクリプトを利用させていただいております。
相変わらず、何回かに一回はスクリプトのダイアログこそ出るものの動作しなくなるので、InDesignの再起動をしなければならない場面が出てきます。
 
さて、pictrix師匠のソースを改造するにあたり、ルビの親文字の先頭に何らかの文字を追加し、処理の最後に削除すればどうかと思って検討してみました。
しかし、私のアホな頭脳では、ルビの親文字の先頭をどう判別すればいいのかわからず、モノルビが設定されたすべての文字の直前に文字を追加するという間抜けな事態を招くのみでした……
竹取(たけ とり)物語(もの がたり) → ★竹★取★物★語  という感じに。
 
そんなこんなで悪戦苦闘が続いておりますが、今後はテキストの状態で整形して流し込む方法に統一して進めようという流れになりつつあります(^^;
時間が許す限り検討を続けていきたいと思います。

ドキュメント中で使っているスタイルを書き出す

表題の目的を満たすスクリプト、既に何人かの方がWEBにアップなさってますね。
このブログ記事を書くにあたって何度もお世話になっているmgさんも書かれています。
そのmgさんの記事をもとに、出版ネッツ関西さんもWindows対応+フォルダ&ファイル名指定可能版として記事を書かれています。
特にグループ化したスタイルを書き出せるところが便利で、ちょうど今ほしかったスクリプトだったのでとても助かりました。

フォルダ&ファイル名指定への対応版(ver.3)はWindows対応版だけのようなので、Macで動くように少し書き換えてみました。
変更部分のソースのみ以下に示します。

	//ここからファイル出力
	var fileObj = File.saveDialog("保存先とファイル名を指定して下さい");
	var fileObj = new File(fileObj.fsName);
	var flag = fileObj.open("w");
	if(flag == true){
		fileObj.writeln("段落スタイル" + "\r" + pstList + "\r" + "文字スタイル" + "\r" + cstList);
		fileObj.close();
		alert("書き出しました");
	}

そうそう、スクリプトを走らせても見た目何の変化もなく書き出しが終了しますので、一応スクリプトの動作が完了したことをアラートダイアログで表示するようにしました。

メタ文字のエスケープ

InDesign正規表現検索・置換をJavascript中に記述することができるわけですが、なぜか、InDesign上での正規表現検索・置換に成功したパターンをJavascript中にそのまま記述しても置換が成功しないことがあります。
今回、InDesignドキュメント中の半角括弧を全角に置換するスクリプトを書いていて気付きました。
どうやら、メタ文字のエスケープが効いていないようです。
そこで、バックスラッシュ自体もエスケープしてみました。
Macだとバックスラッシュがふたつ、Winだと円マークがふたつ連続している状態です。
そうすると、置換に成功しました。
※下記の検索パターンは、半角括弧で起こした後、改行することなく必ず半角括弧で閉じている文字列を最小一致にて検索対象としています。念のため。
(Mac OSX 10.7.5 / Windows7 pro SP1、いずれもInDesign CS6にて検証)

var mySel = app.selection[0];
var myObj = mySel.parentStory;
app.changeGrepPreferences = NothingEnum.nothing;
app.findGrepPreferences = NothingEnum.nothing;
app.findGrepPreferences.findWhat = "\\((.*?)\\)";
app.changeGrepPreferences.changeTo = "($1)";
myObj.changeGrep();

これ、たけうちとおるさんが発表なさってる検索置換(1)変換.jsxに検索文字列と置換文字列を入れてやれば、検索範囲のコントロールができるので便利ですね。
ところで今リンク先のたけうちさんの記事に寄せられている、私のそれより新しいコメントに気付いたのですが、数字を表すメタ文字 \d が反応しないというのも同じ理由です。
Javascript中では \\d と記述してやらないとInDesign側へバックスラッシュ文字を渡してやることができず、数字にマッチしないどころか d そのものにマッチしてしまうのです。
 
 
追記
スタイルグループに対応しないという記述を見落とした(^^;
たけうちさんのスクリプト中、たとえば置換用段落スタイルならスクリプト冒頭付近でスタイル名を入力しておき、検索置換関数内で

app.activeDocument.paragraphStyles.item(myChangeP_style);

としてスタイル名を受け取るところがあるわけですが、グループ名を指定する記述がありません。
グループ名が必要ならグループ名も指定してやらないといけないのです。

app.activeDocument.paragraphStyleGroups.itemByName("グループ名").paragraphStyles.itemByName("スタイル名");

というふうに。
InDesignタグテキストであれば  という記述でよい タグテキストにおけるグルーピングしたスタイル参照) ですし、グループ内のスタイルを当てた文字列をスタイルパネルで確認すると スタイル名 (グループ名) と表示されているので、スクリプト内でもそのように記述すればよいのではないかと思ってしまうかもしれない(私はそうでした……)のですが、そうではないのですね。