第1章 XSL-FO による組版の概要

組版とは原稿を指定されたレイアウトの通りに印刷用のページに仕上げることである。小規模な組版作業は、テキストファイルやMicrosoft Officeなどでとして執筆された原稿を元に、組版担当のオペレータがデスクトップパブシッリング(DTP)ソフトを使って、対話的に行うことが多い。商業用印刷分野ではIllustratorなどのデザインソフトを使って、印刷用のページをデザインしてPDFを作ることも行われる。こうした作業は制作者が人手で行う。

これに対して、XSL-FOはXMLドキュメントとして用意される原稿を印刷用のページに仕上げるときに採用される。ドキュメント原稿をXMLで用意する目的は、原稿をデータベースやCMS(コンテントマネジメントシステム)などに登録・管理して、出版工程まで自動化して出版作業に要する期間やコストを減らすことである。XSL-FOを使う制作プロセスは、XMLドキュメントをプログラムで自動処理・自動組版できるので、このような目的に最適である。XSL-FOを使う制作プロセスは比較的大規模な出版物を繰り返して組版するのに向いている。また、人手を介さないので自動組版ということもある。

1–1 組版で配慮すべきいくつかの項目

印刷用の組版は、紙のページ上に原稿をレイアウトして配置する。そこで、ページ指定、原稿へのレイアウト指定などの重要な指定項目がある。

1–1–1 ページとは

ページはシートまたはパネル上で文字などの情報を配置する領域でありその領域を数える単位でもある。書物の形式には巻物状(スクロール)と冊子状(コデックス)がある。冊子状の書物の場合、1枚の紙の片面が1ページである。巻物のときは巻物をスクロールする方向と行を進める方向が同じ方向であればページが必要なく、異なる方向のときはページが必須となる。

横書きの文書の縦スクロールではページ区切りが不要

図1・1 横書き文書の縦スクロール

縦書き文書の横スクロールではページ区切りが不要

図1・2 縦書き文書の横スクロール

XMLドキュメントをHTMLに変換して、CSSでレイアウトを指定し、ブラウザでパソコンやモバイル端末の画面に表示・印刷できる。しかし、ブラウザは文書を画面に高速表示することを主たる目的として設計されており、ブラウザではページ区切りは重視されていない

これに対し、XSL-FOは冊子や本のようなページの大きさやページの並びといったページ概念をもつ媒体を想定し、ページレイアウトを指定するための機能が豊富である。次のような印刷・製本向けの指定が充実している。

  • ページの縦と横のサイズ(判型)の設定
  • ページの中で本文を印刷する領域(版面)の設定
  • 本のタイトルや発行日を綺麗に配置し、見栄えの良い表紙を作る。
  • ページの上下左右のマージンを、本文のページと、そうでないページで切り替える。
  • 目次ページを作成する。目次の項目にはページ番号を添える。
  • 左ページ、右ページで鏡像になるレイアウトを設定する。
  • 本文ページにはヘッダー・フッター・サイドバー領域を設け、ヘッダーまたはフッター領域に(各ページの版面外に記載された章や節のタイトルなど)ノンブル(ノンブルは各ページのヘッダーまたはフッターに置くページ番号を表示する数字のこと。本書ではノンブルとページ番号という言葉をあまり厳密に使い分けていない。ページ番号は本文中の参照先ページ数を示す数字として使う。本の表紙はページ番号にカウントしないし、前書きや目次の部分と本文でページ番号を別にカウントすることもあるので、ページ番号は物理的なページの順番とは一致しないことが多い。)を印刷する。
  • 章の先頭ページには柱やノンブルを付けず(隠しノンブル)、2ページ目から柱やノンブルを付ける。
  • 節の見出しと節の本文などが別のページに分かれないようにする。
  • 表の途中で改ページするかしないかを指定する。改ページするとき表のヘッダー行を繰り返すかどうかを指定する。
  • 画像を自動的に本文版面の上部に寄せて配置する。
  • 注をページの下に脚注として配置する。
  • ページの横に傍注を付ける。
  • 段組を設定したページを作る。本文は1段組だが索引は2段組にする、などの切り替えを設定する。
  • 索引を作成し、索引項目に本文の参照位置のページ番号を添える。

1–1–2 レイアウト指定の考え方

組版ではページの上に見出し・本文段落・箇条書き・図・表などの対象項目を適切に配置する。この配置指定がレイアウトである。XMLドキュメントには原則としてレイアウトは指定されない。そこで、XMLドキュメントを印刷するには、別途レイアウトを指定する必要がある。

DTPによる作業では、編集者やデザイナーが制作者に指示し、制作者が組版対象項目を適切に配置する。XSL-FOでは組版対象となる項目を組版オブジェクト(Formatting Object、FO)と呼ぶ。FOをどのように配置するかをプロパティによって指定する。

例えば段落はブロック組版オブジェクトという。段落にはフォントの設定、テキストの配置、左右の空き、前後の空き、左右の端から段落の開始辺と終了辺までの距離などの様々なプロパティを指定できる(詳しくは第10章 ブロック組版オブジェクトを参照)。

FOはXMLの用語では要素に相当する。プロパティはFOの属性である。XSL-FO V1.1仕様書では全部で81種類のFOと281種類のプロパティが定義されており、XSL-FOドキュメントのツリー構造の作り方(FOの出現順序・出現回数・親子関係)、どのFOにどのプロパティを適用できるかなどを規定している。

1–1–3 Web配信用のPDF

出版物の製作は組版工程と印刷工程が役割として分離している。現在では、できあがったPDFをWebで交換・配信するなど、印刷から離れた利用形態も多くなっている。印刷用のPDFと比べると、Webで配信するPDFでは目次から本文の見出しへのリンク(第23章 リンクを参照)を設定したり、しおり(第19章 しおりのFOを参照)を設定したりなどが必要である。

1–2 XSL-FOによる組版プロセス

XSL-FOを使う組版プロセスは図1・3 XSL-FOによる組版プロセスのようになる。

XSL-FOによる組版プロセス

図1・3 XSL-FOによる組版プロセス

XMLドキュメントをいきなり組版するのではなく、第1段階で、XMLドキュメントをXSL-FOドキュメントに変換する。第1段階で使うプログラムがXSLTプロセサである。XSLTプロセサのために、XMLドキュメントをXSL-FOドキュメントに変換するためのルールを記述したものがXSLTスタイルシートである。ソースのXMLドキュメントとXSLTスタイルシートをXSLTプロセサに入力するとXSL-FOドキュメントが出力される。XSL-FOドキュメントをXSLT以外の別の方法で作成しても構わない。

このXSL-FOドキュメントはレイアウトを指定した状態であり、組版された状態ではない。第2段階でXSL-FOプロセサによりXSL-FOドキュメントを組版処理する。

次にXMLドキュメント、XSLT、XSL-FOドキュメントの概要を説明する。

1–3 XMLドキュメント

XSL-FOによる組版の対象となるXMLドキュメントのタグセットはどのようなものでも構わない。文書型(DTDやスキーマ)を伴っていても良いし、伴わない整形式のXMLドキュメントでも良い。文書型はユーザーが独自に設定したものでも標準のものでも良い。但し、XSLTスタイルシートを作成するには、XMLの文書型について知っていることが前提である。次は簡単なXMLドキュメントの一部である。

<doc>
  <head>
    <title>
    スタイルシート解説
    </title>
    <author>
    アンテナハウス株式会社
    </author>
    <date>
    2001年2月
    </date>
  </head>
  <body>
    <section>
      <title>
    スタイルシートとは
      </title>
    …略…
    </section>
    …略…
  </body>
</doc>

XMLドキュメントは要素のツリー構造からなる。この例では、docがルート要素(文書全体を囲むタグ)、head要素、body要素はルート要素の子供で、headとbodyは兄弟である。headの子供がtitle、author、dateである。bodyの子供はsectionである。

1–4 XSLT

1–4–1 XSLTとは?

XSLT(XSL Transformations)は、XMLドキュメントのツリー構造を変換するための仕様である。XSLTは、ソースXMLドキュメントをXSL-FOドキュメントに変換する目的で設計された。XSLTによるXMLドキュメントのツリー構造の変換は汎用に使えることから、XSL-FO仕様開発の過程でXSLTは別の言語仕様として分離された。

「XSL Transformations (XSLT) Version 1.0」は1999年にW3C の勧告になった。その後、2007年にXSLT V2.0がW3C勧告となった。本書執筆時点(2017年2月)でXSLT V3.0が勧告候補である。

XSLTの仕様を実装するプログラムがXSLTプロセサである。勧告版のXSLT仕様を実装するXSLTプロセサは沢山あり、その多くは無償で配布されている。

XSLTプロセサには入力XMLドキュメントのツリーを変換するためのルールを外部ファイルとして与える。このルールを記述したファイルをXSLTスタイルシート(またはXSLスタイルシート)という。XSLTスタイルシートの内容は入力XMLドキュメントの要素を、異なるXML要素に変換するためのテンプレートを記述したものである。このテンプレートの作り方次第で、色々なツリー構造のXMLドキュメントを、異なるツリー構造のXMLドキュメントに変換できる。

1–4–2 XSL-FO用XSLTスタイルシート

次に、XMLドキュメントをXSL-FOドキュメントに変換するXSLTスタイルシートのごく一部を示す。

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0"
                xmlns:fo="http://www.w3.org/1999/XSL/Format"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml"
       version="1.0"
       indent="no" />
  <xsl:param name="toc-make" select="true()"/>
<!-- Paper Size -->
  <xsl:param name="paper-width">210mm</xsl:param>
  <xsl:param name="paper-height">297mm</xsl:param>
        …略…
<!-- Content Transform-->
  <xsl:template match="doc">
    <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
      <fo:layout-master-set>
        <fo:simple-page-master margin-top="5mm"
                               margin-bottom="5mm"
                               margin-right="5mm"
                               margin-left="10mm"
                               master-name="PageMaster">
        …略…
        </fo:simple-page-master>
        …略…
      </fo:layout-master-set>
        …略…
    </fo:root>
  </xsl:template>
</xsl:stylesheet>

このXSLTスタイルシートの中で、xsl:という名前空間接頭辞で始まる要素がXSLT仕様で決まっているルール記述用の要素である。また、fo:という接頭辞で始まっている要素が、XSL-FOドキュメントに出力される要素である。

XMLドキュメントをXSL-FOドキュメントに変換するためのXSLTスタイルシートを作成するには、XMLドキュメントの構造についての知識に加えて、

  1. XSLTのルールの書き方に関する知識
  2. 出力するXSL-FOに関する知識

が必要である。

第1のXSLTのルールの開発はプログラミングに近い部分がある。テンプレートの使い方を覚えればHTMLへの変換など汎用に使える。本書ではXSLTの書き方に関する解説は行わない。日本語で書かれたXSL-FOのためのXSLTスタイルシートの書き方については、次の資料を参考にしてほしい。

第2のXSL-FOについては本書で説明する。綺麗なレイアウト指定にはXSL-FOの仕様を理解するだけではなく、印刷の世界で培われてきた日本語組版の知識と経験が必要である。特に、印刷物ではレイアウト指定の良し悪しが、見易さ、読み易さに大きな影響を与える。優れたスタイルシートを作るには、プログラムの知識だけではなく、ページレイアウトをデザインする能力も必要である。

XMLのタグセットが同一であれば、1種類のXSLTスタイルシートで、そのタグセットを採用する任意のXMLドキュメントをXSL-FOドキュメントに変換できる。スタイルシートをうまく作れば、レイアウトを調整するにしても若干の調整で済み、スタイルシートの使い回しで、効率をあげることができる。一つ一つのXMLドキュメントを手作業でページ組版するのと比べると、短時間で膨大なドキュメントを組版することもできる。優れたスタイルシートは価値ある知的資産である。

1–5 XSL-FOドキュメントの例

XSL-FOドキュメントは、fo:rootをルート要素とする整形式XMLである。通常、XSLでは名前空間接頭辞としてfoを使う。しかし、その接頭辞をXSLに結び付ける名前空間宣言があれば、他の接頭辞を使っても構わない。XSL名前空間のURIは次の通り。

http://www.w3.org/1999/XSL/Format

また、XSL名前空間に属する要素には、他の名前空間に属する属性を持たせることができる。この場合、拡張された属性名は、空でない名前空間URIをもつ必要がある。XSL-FOドキュメントの要素を、FOノードとし、属性をFOのプロパティとするツリーで表現したものをFOツリーという。次にXSL-FOドキュメントの先頭部分の例を示す。

<?xml version="1.0" encoding="UTF-16"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
  <fo:layout-master-set>
    <fo:simple-page-master margin-top="5mm"
                           margin-bottom="5mm"
                           margin-right="5mm"
                           margin-left="10mm"
                           master-name="PageMaster"
                           page-height="297mm"
                           page-width="210mm">
      <fo:region-body margin-top="8mm"
                      margin-right="8mm"
                      margin-bottom="8mm"
                      margin-left="8mm"/>
    </fo:simple-page-master>
      …略…
  </fo:layout-master-set>
      …略…
    <fo:page-sequence master-reference="PageMaster">
      <fo:flow flow-name="xsl-region-body" >
        <fo:block …>本文のテキスト</fo:block>
      </fo:flow>
    </fo:page-sequence>
</fo:root>

1–6 XSL-FOプロセサ

XSL-FOドキュメントを組版する処理を行うのがXSL-FOプロセサ(日本語ではXSL-FO組版エンジンということもある)である。XSL-FOは標準仕様なので、世界にはいくつものXSL-FOプロセサがある。このうち、主なものを表1・1 主なXSL-FOプロセサに示す。ApacheTMFOP(Formatting Objects Processor)というオープンソースが広く使われている。XSL-FOプロセサの組版処理や制約条件はXSL-FO仕様書に記述されている。そこでXSL-FOの仕様に準拠するXSL-FOプロセサで同じXSL-FOドキュメントを組版すると、ほぼ同じ組版結果を得ることができる。但し、処理の詳細はXSL-FOプロセサの実装に任されているので、例えばテキストの改行位置、和欧文間の空き、約物の詰め(日本語組版では句読点、括弧類などを約物という。句読点や括弧類はグリフの前後に空きがあるので、組版処理においては空きを詰めることがある。これを約物の詰め処理という。JIS X4051「日本語文書の組版方法」やW3C「日本語組版処理の要件」など文字組版についての規格や解説は多い。)処理など組版結果はXSL-FOプロセサによって多少異なる。できあがったページレイアウトが完全に互換になることは想定されていない。

印刷のためのレイアウトは設定項目が多く複雑である。アンテナハウスのAH XSL Formatterは日本語組版用に最適なXSL-FOプロセサである。2000年にV1.0を発売して以来、FOPでは飽き足らない需要に応えて機能の強化を図っている。2017年4月時点の最新版はV6.4である。

表1・1 主なXSL-FOプロセサ
製品名提供元URL
AH XSL Formatterアンテナハウスhttp://www.antenna.co.jp/AHF/
FOPApachehttps://xmlgraphics.apache.org/fop/
XEPRenderXhttp://www.renderx.com/tools/xep.html
XF Rendering ServerEcrionhttp://www.ecrion.com/

1–7 XSL-FOユーザーとXSL-FOプロセサの役割

XSL-FO V1.1仕様書に記述されている内容を分類すると図1・4 XSL-FOユーザーとプロセサの役割のようになる。XSL-FOユーザーは、XSL-FOドキュメントを作るにあたって、FOがどのような機能をもっているか、FOのレイアウトをプロパティによってどのように指定できるかを理解しなければならない。その際、ベースになっているエリアモデルについても基本的な理解が必要である。

FOやプロパティの組版処理で満たすべき制約条件はXSL-FOプロセサを実装する人が対象である。制約条件については利用者はXSL-FOプロセサに任せることができる。

images/coverage--epub--.png

図1・4 XSL-FOユーザーとプロセサの役割

XSL-FO V1.1の仕様書は長文で、しかも難解な部分が沢山ある。しかし、こうした難解な部分の多くは利用者が理解しなくても差し支えないところである。