DTPab

印刷やデザイン、アドビ製アプリやスクリプトなど、雑多な技術ブログ

技術書典7にて初の同人誌を委託販売します

【追記 9/24 9:00】ここで紹介している同人誌はBOOTHにて頒布中です!

uske-s.booth.pm

f:id:uske_S:20190910220948p:plain

以前のエントリでも書きましたが、初の同人誌を無事入稿することができたので、改めて本の紹介をさせてもらいます。
みんなサークルチェックしてくれよな!

techbookfest.org

何が書かれているか?

本の内容は書名『InDesign × Google Apps Script ―ルビ振りAPI編』の通りです。
Yahoo! のWebAPIのひとつ、ルビ振りAPIをInDesignのExtendScriptから利用するというものです。

なぜExtendScriptからGASを叩くのか

InDesignに元から用意されているSocketオブジェクトを使わずに、curlコマンドを使ってGoogle Apps Scriptにアクセスし、そこからルビ振りAPIを叩きます。
なぜそんなまだるっこしいことをしたかというと、一番にはまずやってみたかった、ということ。
もうひとつはそのSocketオブジェクトがHTTPS通信に対応していない、かつ今後ExtendScriptがアップデートされる可能性はゼロに近い、という意味でもSocketオブジェクトを使わない通信方法を確立したいということ。
その意味で、今回のチャンレジ自体は決して無意味なものではなかったと思っています。
ただAPI叩くならCEP(Adobeアプリケーション用エクステンション)でいいじゃん、というのは当然として、ExtendScriptで完結させることで導入コストを下げられるという面はあるでしょう。
ともかく、InDesignとGoogle Apps Scriptを絡めて(CEPやSocketを使わずに)なにかやろうなんて酔狂な話はあまり聞いたことがないので、GASに興味を持っていたInDesignスクリプターの方や、GASは使えるけどDTPの現場にどうやって導入しようか考えているという方に読んでもらえれば嬉しいです*1

内容の比重

今回はどちらかというとGoogle Apps Scriptの開発の説明に重きを置き、InDesignのExtendScriptの説明はさらっと済ませています。
なので読者対象としてはInDesignのスクリプトをある程度触れる方、ないしJavaScriptがある程度読める方ということになるのですが、スクリプト自体はそこそこ使えるものになっていますので、理屈はさておき漢字を習う学年別にルビを振りたいという要望に答えられるものは載せたつもりです。

ルビ振りAPI

Yahoo!が提供するルビ振りAPIについて少し紹介しておきます。
ルビを取得したいテキスト情報と、grade*2を指定することで、学習学年別に漢字のルビを取得できるというものです。
このルビ振りAPIから得られるデータはXMLになるため、Google Apps Script側で(ライブラリを用いずに)XMLを任意の形にパースする処理を組み立てています。そのあたりも解説を加えているので、GASでXMLを扱う際の一助にもしていただけるかと思います*3

f:id:uske_S:20190904002800p:plain
こんな感じのXMLが返される
これをGASで加工し、呼び出し元(ExtendScript)に値を戻す、ということをやります。

InDesignからは何をすればいいの?

掲載しているサンプルコードを用いると、InDesignから所定の情報をGASに渡すだけで、ルビ情報がJSONで返ってきます。
つまり、InDesign用ExtendScriptのモジュールのような形でルビ振りAPIを実行してもらえるように作っています。
実は本書に掲載しているGASの開発は一切せずに、いきなりInDesignのルビ振りスクリプトとして利用することも可能です。
ただ(前述の通り)そこそこのものではあるので、もっと実用的に使い勝手の良いものが必要であれば適宜カスタマイズしていただく必要があるでしょう。

強力なレビュワー

執筆に当たり、技術的な部分でなかひこくん(id:takanakahiko)氏に、編集的な部分でこうちゃん黒猫まみれ(id:macneko-ayu)氏にレビューしていただきました。
なかひこくん氏には、GASのことはもちろん、ExtendScriptについてもアドバイスをいただきました。構成が明確になり、とてもわかりやすくなったと思います。
こうちゃん氏には、編集スキルをふんだんに奮っていただき、日本語的な部分や細かい文法上のミスなどを拾っていただきました。
改めてお二人には最大級の感謝を! 忙しい中レビューしていただき、本当にありがとうございました。

目次

この本の目次です。

調査編
1 プログラムの全体像
2 ルビ振りAPIにアクセスするには

  • リクエストURL
  • アプリケーションID(appid)の取得
  • ルビ振りAPIを試す
  • ルビ振りAPIの叩き方
  • ルビ振りAPIの戻り値

実装編
1 GASの実装

  • GASのプロジェクトを作る

2 GASをWebAPIとして利用するには

  • ルビ振りAPIにリクエストを送る
  • XMLから必要な情報を取り出す
  • GASの戻り値を設定する
  • 必要な引数を持たせてGASにアクセスする
  • GASのコード
  • GASを外部から叩けるAPIとして公開する

3 ExtendScriptの実装

  • ExtendScriptのサンプルコード
  • 必要な情報を用意して各関数を実行するmain関数
  • GASのAPIを叩くfetchRubyAPI関数
  • InDesignのテキストにルビを設定するsetRuby関数

サンプル

前付け、調査編、実装編からそれぞれひと見開きずつサンプル用意してみました。

はじめにより

f:id:uske_S:20190910230906p:plain

調査編より

f:id:uske_S:20190910230911p:plain

実装編より

f:id:uske_S:20190910230915p:plain

最後に

初めて技術同人誌を作ってみたのですが、今回はRe:VIEWなどを使わずInDesign単品で制作しました。
最初からWYSIWYGなアプリケーションで制作しているのでそのあたりの利点を活かしつつ*4、なるべく読みやすいよう組版設計やフォント選びなどを行いました。このあたりの細かい話は(長くなってしまったので)後日別の記事として立てようと思います。

それでは、技術書典7、Taz Booksさん(さ01D)へよろしくお願いします!

*1:そんな需要がどれほどあるのか……

*2:学年の指定。「小学校学習指導要領」の付録「学年別漢字配当表」(1989年3月15日文部科学省告示。1992年4月施行)を参考に設定されている。

*3:GASでのXMLの処理について、なかひこくん(id:takanakahiko)氏にご指導賜りました。他にもGASのコード周りを強力にバックアップしてくれました。

*4:ページに収めるために言い回しを変更したり、挿入する図版のサイズを調整したり、など