2017年7月29日

ちょいスクリプト:索引の種

InDesignの索引作成機能がどうも使いづらいので、語句を拾いながら、スクリプトで「ノンブル(タブ)語句」の組をファイルに書き出すようにした。

var curSlc = app.activeDocument.selection[0];
var curStr = curSlc.contents;
//var curNom = app.layoutWindows[0].activePage.name;
var curNom = curSlc.parentTextFrames[0].parentPage.name;
var outFile = new File("/Users/tak/Dropbox/索引/writeout.txt");
outFile.encoding = "UTF-8";
outFile.lineFeed = "Unix";
if ( outFile.open("a")) {
    outFile.writeln(curNom + "\t" + curStr) ;
    outFile.close();
    alert (curNom + "\t" + curStr +" を追加しました。");
    } else {
    alert("書き出しファイルが開けません");
 }

索引に拾う語句をドラッグで選択して、このスクリプトを実行(ショートカットをCtrl+Opt+Cmd+iにした)。alertで書き込めたことを知らせてくれるけど、tail -f を使って書き込み具合をterminalで監視しておくのもいいかな。


〔2017-07-30追記〕ノンブルを取得する方法を変えた。はじめはコメントアウト部分のようにしていたが、これだと対象の語句がある頁ではなく、画面上いちばん多く見えている頁のノンブルを取得してしまい、対象語句が次頁にわたっている場合など、別の頁のノンブルを拾ってしまう。

2017年2月6日

ちょいスクリプト:12時制を24時制に書き換える

「午後4:05」→「16時5分」、「午前8時半」→「8時30分」という具合に12時制の時刻を24時制の「hh時mm分」の形式に書き換える。

ただし、「午後12時」は本来「夜中の0時」のはずだけど、「昼の12時15分」のつもりで「午後12時15分」と書く人もいるので、「午後12時」については疑問出しをするようにした。

perl

#!/usr/bin/perl
use utf8;
binmode STDOUT, ':utf8';
binmode STDERR, ':utf8';
binmode STDIN, ':utf8';

while (<>) {
        y/1234567890:/1234567890:/;
        s/(\d+):(\d+)/\1時\2分/g;
        s/(?<=時)半/30分/g;
        s/00分//g;
        s/午後0/12/g;
        s/午後10/22/g;
        s/午後11/23/g;
        s/午後12(?=時\d+分)/昼?夜?0/g;
        s/午後12(?!時\d+分)/0/g;
        s/午後1/13/g;
        s/午後2/14/g;
        s/午後3/15/g;
        s/午後4/16/g;
        s/午後5/17/g;
        s/午後6/18/g;
        s/午後7/19/g;
        s/午後8/20/g;
        s/午後9/21/g;
        s/午前(?=\d+)//g;
    print $_;
}

javascript

var mySel = app.activeDocument.selection;
var myStr = mySel[0].contents;
myStr = myStr.replace(/0/g, "0");
myStr = myStr.replace(/1/g, "1");
myStr = myStr.replace(/2/g, "2");
myStr = myStr.replace(/3/g, "3");
myStr = myStr.replace(/4/g, "4");
myStr = myStr.replace(/5/g, "5");
myStr = myStr.replace(/6/g, "6");
myStr = myStr.replace(/7/g, "7");
myStr = myStr.replace(/8/g, "8");
myStr = myStr.replace(/9/g, "9");
myStr = myStr.replace(/:/g, ":");
myStr = myStr.replace(/(\d+):(\d+)/g,  "$1"+"時"+"$2"+"分");
myStr = myStr.replace(/(?<=時)半/g, "30分");
myStr = myStr.replace(/00分/g, "");
myStr = myStr.replace(/午後0/g, "12");
myStr = myStr.replace(/午後10/g, "22");
myStr = myStr.replace(/午後11/g, "23");
myStr = myStr.replace(/午後12(?=時\d+分)/g, "昼?夜?0");
myStr = myStr.replace(/午後12(?!時\d+分)/g, "0");
myStr = myStr.replace(/午後1/g, "13");
myStr = myStr.replace(/午後2/g, "14");
myStr = myStr.replace(/午後3/g, "15");
myStr = myStr.replace(/午後4/g, "16");
myStr = myStr.replace(/午後5/g, "17");
myStr = myStr.replace(/午後6/g, "18");
myStr = myStr.replace(/午後7/g, "19");
myStr = myStr.replace(/午後8/g, "20");
myStr = myStr.replace(/午後9/g, "21");
myStr = myStr.replace(/午前(?=\d+)/g, "");
mySel[0].contents = myStr;


2017年1月27日

ちょいスクリプト:ルビを統合する

韓国の人の姓名にカタカナのふりがなをつけていた(姓と名のふりがなは「・」で区切る)。

当初、字音ルビとして1文字ずつのモノルビとしたけれど、連音もあるので名の部分についてはグループルビにとの指示があったので、そのように直した(姓はモノルビのまま)。
ところが、こんどは、字間が開きすぎているから、姓・名全体をグループルビにしてほしいと新たな指示が……

モノルビにせよグループルビにせよ、分けて付けてあるルビを一つにまとめようとすると、手作業ではいま付いているルビをいったん消して、新たにルビを付け直すことになる。これでは入力ミスが起こりかねないので、スクリプトで処理することにした。

//統合したい部分は検索など何らかの方法で選択してあるものとする。
var oyaStr = app.activeDocument.selection[0];
var oyaChars = oyaStr.characters;
var newRuby = "";
var prevcharRuby = "";

//親文字列1文字ずつについてルビを読んでいく。
for ( C = 0; C < oyaChars.length; C++ ) {

//前の親文字のルビと同じだったら何もしない。
//【注意!】同じ読みが連続している場合は一つ消えるので、後で修正が必要。
//そうでなければ、新しいルビ文字列に書き足す。
        if ( oyaChars[C].rubyString !== prevcharRuby ) {
                newRuby = newRuby + oyaChars[C].rubyString;
        }
//現在の親文字のルビを、次の親文字のルビと比較するため、変数prevcharRubyに取っておく。
        prevcharRuby = oyaChars[C].rubyString;

//現在の親文字のルビを消し、前後のアキも「自動」に戻す。
        oyaChars[C].rubyString = "";
        oyaChars[C].rubyFlag = false;
        oyaChars[C].leadingAki = -1;
        oyaChars[C].trailingAki = -1;
}
//以上の操作で収集したルビ文字列を選択部分のルビとする。
oyaStr.rubyString = newRuby.replace(/\u0020|\u3000/g,"");

//以下は組方の設定。
oyaStr.rubyType = RubyTypes.GROUP_RUBY;
oyaStr.rubyAlignment = RubyAlignments.RUBY_JIS;
oyaStr.rubyParentSpacing = RubyParentSpacing.RUBY_PARENT_121_AKI;
oyaStr.rubyFlag = true;
oyaStr.rubyXOffset = 0;

グループルビでは、全体のルビが個々の親文字それぞれのルビ文字列だとされているようなので、ルビ文字列をただ連結していくと、同じルビが繰り返されることになる。それを避けようと、同じルビ文字列は付け足さないようにしている。
ただし、同じ読みを重ねるような姓名の場合、一つ消えてしまうことになるので注意!

〔1月28日修正〕
  • if文のところが冗長だったので整理した。(elseは必須でないのにいまごろ気付いた)
  • 収集したルビ文字列を選択部分のルビとするとき、モノルビの箇所で区切りに使っていた空白文字が残っているのを削除するようにした。

なお、このスクリプトは、たけうちとおるさんの「グループルビをモノルビに、モノルビをグループルビに」を参考にさせていただいた。

2017年1月25日

ちょいスクリプト:モノルビをグループルビに

モノルビにしていたのに、あとでグループルビにという指示が出たとき、これでちゃちゃっと。

var OyaStr = app.activeDocument.selection[0];
//ルビ文字列から区切りの空白(全角・半角)をトル。
var newRuby = OyaStr.rubyString.replace(/[  ]/, ""); 
OyaStr.rubyString = newRuby;
//種類をグループルビに。
OyaStr.rubyType = 1249011570; 
//揃えを1-2-1(JIS)ルールに。
OyaStr.rubyAlignment = 1249012339 ;


それにしても、InDesignのオブジェクトのプロパティって、オブジェクトモデルビューアで調べるわけだけど、それぞれにちゃんと名前がついているのにスクリプトではこうやって番号で指定しないといけないのは不便じゃないのかな。

2017年1月20日

ちょいスクリプト:註合い印の番号を変更する

InDesignで本文中の註合い印をルビ「(註番号)」の形式で付けていると、著者校で註が追加されたり削除されたりするのに従って、合い印の番号もずらさなければいけない。

一箇所ずつルビを編集していけばいいのだけど、番号を書き換えるスクリプトを書いてみた。この例では註番号を「2」増やす。

var oldNum = app.activeDocument.selection[0].rubyString.replace(/[()]/g,"");
var newNum = String(parseInt(oldNum) + 2);
app.activeDocument.selection[0].rubyString = "(" + newNum + ")";

もともと、合い印のところは文字スタイルを当てている(ルビの文字サイズを通常のルビより大きくし、位置も下揃えにしている)ので、文字スタイルを検索し、見つけたところで上のスクリプトをあてる(ショートカットを設定しておくと楽)。もちろん、手動で選択したところにあててもいい。


《何をやっているかというと…》
  1. 検索などで選択された文字のルビ文字列(rubyString)からreplace関数で前後のパーレンを取って、変数oldNumに代入。
  2. oldNumは文字列なので足し算をするためにparseInt関数で数値に変え、増減値(この場合2)を加えて、String関数で文字列に戻して、newNumに代入。
  3. 検索で選択された文字のルビ文字列として、前後にパーレンを付けたnewNumを指定する。

2017年1月19日

13日の金曜日を探す

ことしから10年間の「13日の金曜日」を列挙するbash oneliner。
科学的にはなんの特別なこともない日だけど、bashのfor文の練習に。

$ for y in {2017..2026}
> do
> for m in {1..12}
> do
> ncal $m $y | grep '^金.*13' > /dev/null
> if [ $? -eq 0 ]
> then echo "$y"年"$m"月13日は金曜日だ。
> else :
> fi
> done
> done

味噌は、
  • for は入れ子にできる。
  • calでなく、同じ曜日の日を1行に並べるncalを使っている。
  • ncalの出力からgrepで13日の金曜日を選んでるけれど、それ自体の出力は/dev/nullに捨てて、そのかわりに返り値(マッチが成功した場合に0を返す)を利用している。

なお、ncalの出力はこんな形になっている。
$ ncal 1 2017
    1月 2017
月     2  9 16 23 30
火     3 10 17 24 31
水     4 11 18 25
木     5 12 19 26
金     6 13 20 27
土     7 14 21 28
日  1  8 15 22 29

ubuntuのncalは当日をハイライト表示するけれど、そのエスケープシークエンスがじゃまなので、ハイライト抑止オプション -h を付ける必要がある。

2017年1月12日

ちょいスクリプト:箇条書きの番号をシフト

注に初校で追加があって、そのあと注番号がずれていくような場合にこんなスクリプトを書いた。

var selectedIndex = app.activeDocument.selection[0].contents;
var fixedIndex = String(parseInt(selectedIndex) + 2);
app.activeDocument.selection[0].contents= fixedIndex;

contentsは文字列(数字)なので、
まず、javascript本体のparseInt()関数で数値にして、
それに番号がずれる幅(上の例では2)を加えて、
それをString()関数で文字列に戻している。

注は、
(12) こんな感じになっているので、正規表現検索「^(?<=()\d+(?=))」で数字部分を検索して、上のスクリプトを当てればいい。

本文中の合い印も変えないといけないけど、それはまたこんど。

2017年1月8日

ちょいスクリプト:書名に鉤括弧を付ける

当初、括弧の付いていなかった資治通鑑、唐書などの書名に二重化鉤括弧を付けるようにと、初校の戻しに指示があった。一重鉤括弧の付いている書名も二重鉤括弧にするとの指示も。

そこで、InDesign用にこんなスクリプトを書いてみた。

var mySel = app.activeDocument.selection;
var myStr = mySel[0].contents.replace(/[「」]/g,"");
myStr = "『" + myStr + "』";
mySel[0].contents = myStr;


2017年1月1日

2017年始まりのご挨拶に代えて


パウル・クレーが「Die Zwitscher-Maschine」を描いたのは1922(大正11)年。

この年、ワシントン海軍軍縮条約、中国の主権・独立・領土保全を認める9カ国条約が結ばれています。日本では全国水平社創立、日本農民組合結成、女性の集会参加を許す治安警察法改正などがありました。日本共産党結党も同年7月。その一方、イタリアでは10月にムッソリーニのファシスト政権が成立し、翌月「年末まで」と限り「秩序回復」名目に独裁権が与えられます。ロシアではスターリンが党書記長に就任しています。ドイツでヒトラーがミュンヘン一揆を起こし、失敗したのは翌23年ですが、そののちナチス・ドイツ成立の1933年、この作品は「退廃芸術展」に展示されることになります。

95年後のいま、さえずることとは? レバーを回すのはだれ? いろいろ考えたくなります。


絵の画像データはWikimedia Commonsから:https://commons.m.wikimedia.org/wiki/File:Die_Zwitscher-Maschine_(Twittering_Machine).jpg#mw-jump-to-license

2016年10月28日

InDesignもワンライナーで行こう

活版時代の縦組みでは、本文中の括弧内などに本文より小さい活字が入る場合、右寄セ組(InDesignの用語だと「文字揃え=仮想ボディの右」)としていた。
活版ならではの物理的制限からきた習慣なのだろうけど、それをInDesignで再現しようとすると、縦中横など90度回転させたものの文字揃えが中央のままになってしまう。



これを他の文字同様、仮想ボディの右で揃えるには、文字パレットのオプションにある縦中横設定で「左右位置」を補正すればよい。本文が9ポ、括弧書きが8ポなら左右位置を0.5ポにすればよい。





でも、何箇所もあるから、縦中横設定パネルをいちいち出して、いちいち補正値を入力するのは大変。
修正箇所は検索パネルで探して(すると修正箇所が選択状態になる)、そこに、たった1行のこのスクリプトを当てればいいのだ。
app.activeDocument.selection[0].tatechuyokoYOffset = 0.5;

(文字の並び方向がX軸なので、縦組みの場合、左右方向はY軸になる。ややこしい)

修正箇所の検索までスクリプトで行おうとすると、例外の扱いとかややこしいけど、検索パネルと組み合わせれば、とても簡単。スクリプトにショートカットを設定しておけば、さらに手数は少なくて済むのだ。どう?