(以下はShibuya.lisp TT #5でのLTの資料です。)

『プログラミングClojure』の
編集制作におけるLisp/Scheme

森田尚

hisashim at workbook.org

株式会社オーム社開発部(hmorita at ohmsha.co.jp)

前口上

  • 発表者について
    • 職業編集者
    • アマチュアプログラマ
  • ※この発表は発表者の個人的な考えを非公式に述べるものであり、雇用者が関知するものではありません。

  • Lisp/Schemeと題しているが、主にGaucheの話(Elisp, xyzzy Lispも若干)

質問歓迎です。いつでもご質問ください。

関係した本(抜粋)

コンピュータグラフィックス 理論と実践 UNIXという考え方 Linkers & Loaders CVSによるオープンソース開発 入門Meadow/Emacs Postfix詳解 ハッカーと画家 コンピュータ時代の創造者たち 入門xyzzy Ship It! On Lisp Subversion実践入門 第2版 実践Common Lisp +GAINER プログラミングErlang Manage It! Release It! プログラマのための論理パズル WiiRemoteプログラミング 入門git 入門GTK+ RailsによるアジャイルWebアプリケーション開発 第3版 プログラミングClojure 情熱プログラマー

こういった本を世に出すお手伝いをしてきました。

『プログラミングClojure』(2010-01)

プログラミングClojure

  • Stuart Halloway著 川合史朗訳

今日はこの本の編集制作を例に、ワークフローとツールを紹介します。

ゴール

  • かかわる人たち(著者・訳者・レビュア等)に最大限に力を発揮してもらう

ツール類はあくまで手段です。

ワークフロー

  1. 原稿を執筆・翻訳・編集してcommitする
  2. 最新のPDFがサーバ上に自動生成される
  3. みなで読んでトラッカーやMLでフィードバックする
  4. 1へ戻る

以上を繰り返して完成度を高めていく。

コンピュータソフトウェア開発と同様に、繰り返しにより漸進的に改善します。

道具立て(概要)

  • 構造化されたテキスト原稿
  • 自動組版システム
  • バージョン管理システム
  • トラッカー(問題追跡システム)
  • ビルドサーバ

実現するための道具立てです。

道具立て

  • 構造化されたテキスト原稿(XML/XHTML/LaTeXなど)
    • XMLベースの独自形式
  • 自動組版システム(内製ツールやLaTeX)
    • IdeoType+独自拡張
  • バージョン管理システム(Subversionなど)
    • 中央がSubversion、各人の手元ではsvnやgit
  • トラッカー(問題追跡システム)
    • Trac
  • ビルドサーバ(Hudson、CruiseControl.rbなど)
    • Hudson

今回はこれらを使いました。

実際の手順

  • Trac: レビュアがチケットを起こす
  • Subversion: 訳者が判断して原稿を編集する
  • Hudson: PDFを生成してダウンロード可能にする
  • 変更点を確認

(実際にどういう様子だったか、スクリーンショットを使って手順を紹介)

IdeoType

  • XML→(LaTeXやXSL-FO)→PDFと変換を行うスクリプト
  • v0.1はIPA未踏ソフトウェア創造事業の支援を受けて開発(2006-2007、美馬PM)
  • v0.2はその発展版で、pure Gaucheで実装(SXMLライブラリを利用)
  • http://ideotype.org

今回利用したIdeoType v0.2はGaucheで書かれています。

変換の各段階

  • XML(原稿)
      <h lang="en">Preface</h>
      <h lang="ja">まえがき</h>
    
  • TeXML(中間形式)
      <cmd name="chapter">
        <parm>まえがき</parm>
      </cmd>
    
  • LaTeX(中間形式)
      \chapter{まえがき}
    
  • PDF(最終出力)
      まえがき
    

XMLから中間形式を経てPDFが生成されます。LaTeXをバックエンドとして利用しています。

TeXMLはTeXのXML表現で、これによりTeXへのシリアライズにまつわる処理を分離・隠蔽しています。)

変換の各段階(右側は内部表現)

  • XML(原稿)
      <h lang="en">Preface</h>   (h (@ (lang "en")) "Preface")
      <h lang="ja">まえがき</h>  (h (@ (lang "ja")) "まえがき")
    
  • TeXML(中間形式)
      <cmd name="chapter">       (cmd (@ (name "chapter"))
        <parm>まえがき</parm>      (parm "まえがき"))
      </cmd>
    
  • LaTeX(中間形式)
      \chapter{まえがき}
    
  • PDF(最終出力)
      まえがき
    

IdeoType内部では、原稿はSXML(XMLのS式表現)になっており、自由に操作できます。

変換ルールの例

;; 出現要素にマッチさせるパターン
(define pattern-h1
  (sxpath "h1"))

;; マッチしたノードを処理するハンドラ
(define (h1->texml-chapter node root vars)
  `((cmd (@ (name "chapter"))
         (parm ,@(apply-templates node root vars)))))

変換ルールはパターンとハンドラとして定義されており、自由にカスタマイズ可能です。

ふりかえって

  • 技術的には普通(ユーザコンピューティングの一例)
  • 経験した方からは肯定的な評価
  • 発展途上で、改善の余地は大きい
  • 引き続き改善していきたい

技術的にはごく当たり前のものですが、この方法を経験された方には良い評価をいただいています。

まだ発展途上ですが、改善していきたいと考えています。

参考資料

ありがとうございました。