6.4.4. 段組指定の例

 それでは、段組指定の例を見てみることにしましょう。まず、サンプルとして DTD(リスト 6.3)と XML 文書(リスト 6.4)を示します。

リスト 6.3 [ poem.dtd ]
<!ELEMENT poem        (title?,work+)>
<!ELEMENT work              (workinfo?,phrase+)>
<!ELEMENT workinfo          (title?,author?,year?)>
<!ELEMENT title             (#PCDATA)>
<!ELEMENT author            (#PCDATA)>
<!ELEMENT year              EMPTY>
<!ATTLIST year              birth CDATA #IMPLIED
                            death CDATA #IMPLIED>
<!ELEMENT phrase            (#PCDATA)>
リスト 6.4 [ poem.xml ]
<?xml version="1.0" encoding="euc-jp"?>
<!DOCTYPE poem SYSTEM "poem.dtd">
<poem>
  <title>抄録 中華詩撰</title>

  <work>
    <workinfo>
      <title>登鸛鵲樓</title>
      <author>王之渙</author>
      <year birth="六九六" death="???" />
    </workinfo>
    <phrase>白日依山盡</phrase>
    <phrase>黄河入海流</phrase>
    <phrase>欲窮千里目</phrase>
    <phrase>更上一層樓</phrase>
  </work>

  <work>
    <workinfo>
      <title>春暁</title>
      <author>孟浩然</author>
      <year birth="六八九" death="七四〇" />
    </workinfo>
    <phrase>春 眠 不 覚 暁</phrase>
    <phrase>處 處 聞 啼 鳥</phrase>
    <phrase>夜 來 風 雨 聲</phrase>
    <phrase>花 落 知 多 少</phrase>
  </work>
  <work>
    <workinfo>
      <title>竹里館</title>
      <author>王維</author>
      <year birth="七〇一" death="七六一" />
    </workinfo>
    <phrase>獨 坐 幽 篁 裏</phrase>
    <phrase>彈 琴 復 長 嘯</phrase>
    <phrase>深 林 人 不 知</phrase>
    <phrase>明 月 來 相 照</phrase>
  </work>
  <work>
    <workinfo>
      <title>黄鶴樓送孟浩然之廣陵</title>
      <author>李白</author>
      <year birth="七〇一" death="七六二" />
    </workinfo>
    <phrase>故 人 西 辭 黄 鶴 樓</phrase>
    <phrase>煙 花 三 月 下 揚 州</phrase>
    <phrase>孤 帆 遠 影 碧 空 盡</phrase>
    <phrase>唯 見 長 江 天 際 流</phrase>
  </work>
</poem>

 例題に選んだのは中国唐代の漢詩撰集の抜粋です。漢文ですから、ここはひとつ縦組にもチャレンジしてみることにしましょう。その上で、新書などで見掛けるような上下二段組にしたいと思います。スタイルシートのサンプルをリスト 6.5に示します。

リスト 6.5 [ poem.dsl ]
<!DOCTYPE style-sheet PUBLIC "-//James Clark//DTD DSSSL Style Sheet//EN">

<style-sheet>
<style-specification>
<style-specification-body>

(define %body-width% 128mm)
(define %body-height% 170mm)
(define %gutter-height% 20pt)
(define %column-height% (/ (- %body-height% %gutter-height%) 2))

(define-page-model simple-iso-a5
  (width 148mm)
  (height 210mm)
  (filling-direction ’right-to-left)
  (region
    (x-origin 10mm)
    (y-origin 20mm)
    (width %body-width%)
  (height %body-height%)))

(define-column-set-model two-columns
  (width %body-width%)
  (height %body-height%)
  (column-subset
    (flow (#f body-text))
    (column (y-origin (+ %column-height% %gutter-height%))
            (height %column-height%))
    (column (y-origin 0mm)
            (height %column-height%))))

(element poem
  (make page-sequence
    language: ’JA
    font-family-name: "Ryumin Light"
    writing-mode: ’top-to-bottom
    repeat-page-models: ’(simple-iso-a5)
    (make column-set-sequence
      column-set-model: two-columns
      (process-children))))

(element (poem title)
  (make paragraph
    span: 2
    start-indent: 28pt
    font-size: 14pt
    line-spacing: 14pt
    space-after: 32pt))

(element work
  (make display-group
    space-after: 40pt))

(element workinfo
  (make paragraph
    start-indent: 10pt
    font-size: 10pt
    line-spacing: 15pt
    space-after: 10pt
    (process-matching-children ’title)
    (make line-field
      field-width: (- %column-height% 20pt)
      field-align: ’end
      (make sequence
        (process-matching-children ’author)
        (process-matching-children ’year)))))

(element (workinfo year)
  (make sequence
    (literal "(")
    (literal (attribute-string "birth"))
    (literal "~")
    (literal (attribute-string "death"))
    (literal ")")))

(element phrase
  (make paragraph
    lines: ’asis
    line-spacing: 20pt))

</style-specification-body>
</style-specification>
</style-sheet>

 page-model の定義ですが、行あたりの字数が少ないですから、二段組程度であれば用紙のサイズは小さめの方がバランスがよいでしょう。ここでは A5 サイズとしています。また、縦組としますので filling-direction(行送り方向に一致)を right-to-leftとしています。
 さて column-set-model の定義ですが、この例の場合、ポートは主ポートのみ(主ポートは #f であらわします)・ゾーンは body-text のみの構成ですから、column-subset-flow-map は次のようになります。

(flow (#f body-text))

 column-set-model の定義には filling-direction の指定がありませんが、未指定の場合は親(この場合 page-region)の指定を受け継ぎますので、やはり right-to-left ということになります。よって、column の y-originheight を指定する必要があります。このとき、column-set-sequence の子になるフロー・オブジェクトが流し込まれる領域は、column を定義した順になることに注意してください。つまり、リスト 6.5のcolumn の定義順を入れ換えると、フォーマットしたときに段の中身も入れ換わります。実際に試して結果を確認してみるとよいでしょう。
 この例では column-set-sequence 指定に文書の構造上直接対応するタグがありませんので、page-sequence の指定にぶら下げる格好になります。また、page-model は simple-iso-a5 ひとつしかありませんので、特質 column-set-model-map: による指定は省略し、column-set-model: によるデフォルトの column-set-model 指定を行っています。

(element poem
  (make page-sequence
    language: ’JA
    font-family-name: "Ryumin Light"
    writing-mode: ’top-to-bottom
    repeat-page-models: ’(simple-iso-a5)
    (make column-set-sequence
      column-set-model: two-columns
      (process-children))))

 文書のタイトル(<poem> ⇒ <title>)は、その後の本文の開始位置を各段で揃えるために、フロー・オブジェクトの表示領域が二段に跨がるように指定します。特質 span: の指定がこれにあたります。
 これ以外については既に学んだことの応用ですので、ここでの説明は割愛します。不明な点があれば、このあたりで復習してみるのもよいのではないでしょうか。


図 6.7 column-set-sequence を用いたフォーマットサンプル

<<prev      next>>