DSSSL 入門 (原題: An Introduction to DSSSL)

この文書は、 Daniel M. Germán 氏が http://csgrs6k1.uwaterloo.ca/‾dmg/dsssl/tutorial/tutorial.html で公開している "An Introduction to DSSSL" を翻訳したものです。

日本語版に関するお問い合わせは, 佐藤 (<hrs@eos.ocn.ne.jp>) までお知らせください.


An Introduction to DSSSL

Daniel M. Germán

このチュートリアルは, Jon Bosak 氏と匿名の人物によって投稿された play.dsl というスタイルシートに基づいたものです. どちらかと言うと単純さを優先していて, あまり詳しく解説しているものではありませんが, 理解するのが困難なものではないと思います.

Paul Prescod 氏による, もう一つのチュートリアルが http://itrc.uwaterloo.ca/‾papresco/dsssl/tutorial.html にあります. このチュートリアルはさらに細かい部分も書かれており, Scheme の知識を前提としていません.

読者に必要とされる条件:

必要なもの:

このチュートリアルの目的は DSSSL の基礎を紹介することです. ここでわたしたちは, (Jon Bosak 氏が投稿した play.dsl を元に) 演劇の台本用の DSSSL スタイルシートを作成していきます.

例のコピーは, 次の場所からダウンロードできます.

Lesson 1

まずは Hello World から

さて, わたしたちは既に SGML ファイルと DTD を入手しています. 最初のステップは, 演劇の台本テキストを組版しないで RTF ファイルとして出力することです.

ソースファイルのキーポイント


; This dumps the text of the plays without any particular format
; (訳: これは演劇の台本を組版しないで出力するものです)

(root
  (make simple-page-sequence
	(process-children))
)

ソースファイルの解説

得られる RTF ファイルは単に文字が並んでいるだけで, 余白や段落はまったくありません. また, フォントファミリ, フォントサイズ, ページサイズなどは Jade のデフォルト値が使われています.

Lesson 2

余白の追加

ソースファイルのキーポイント


(root
  (make simple-page-sequence
; margins
; (訳: 余白)
        left-margin:            1in
        right-margin:           1in
        top-margin:             1in
        bottom-margin:          1in
	(process-children))
)

ソースファイルの解説

Lesson 3

次に, SGML に現れるエレメントに一つずつ, 書式を追加して行きましょう.

ソースファイルのキーポイント


(element (PLAY TITLE)           ;the play's title
    (make paragraph
        quadding:               'center
        font-size:              18pt
        line-spacing:           18pt
        font-weight:            'bold
        keep-with-next?:        #t
        (process-children)))

ソースファイルの解説

Lesson 4

ソースファイルのキーポイント


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Front matter
;
(element (FM)                   
    (make paragraph
        font-size:              8pt
        line-spacing:           8pt
; left and right indentation 
        start-indent:       5cm
        end-indent:         5cm
; space before	
	space-before:        .5cm
; space after
	space-after:        .5cm
        (process-children)))

ソースファイルの解説

Lesson 5

保守しやすいように変数を追加する

ソースファイルのキーポイント


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Adding constants
(define *titleFontSize*         18pt)
(define *fmFontSize*            (/ *titleFontSize* 2))
(define *fmIndent*              3cm)
(define *fmSpaceBefore*         .5cm)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; TITLE of the PLAY


(element (PLAY TITLE)           
    (make paragraph
        quadding:               'center
        font-size:              *titleFontSize*
        line-spacing:           *titleFontSize*
        font-weight:            'bold
        keep-with-next?:        #t
        (process-children)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Front matter
;
(element (FM)                   
    (make paragraph
        font-size:              *fmFontSize*
        line-spacing:           *fmFontSize*
; left and right indentation 
        start-indent:          *fmIndent*
        end-indent:            *fmIndent*
; space before	
	space-before:          *fmSpaceBefore*
; space after
	space-after:           *fmSpaceBefore*
        (process-children)))


Lesson 6

エレメントの順番を変えて出力する

ソースファイルのキーポイント


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; PERSONAE
(element PERSONAE
     (process-children))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; PERSONA
(element PERSONA                ;a person
    (make paragraph
        space-before:           *personaSpaceBefore*
        start-indent:          *personaIndent*
        (process-children)))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; TITLE inside PERSONAE
(element (PERSONAE TITLE)           
    (make paragraph
        font-size:              *personaetitleFontSize*
        line-spacing:           *personaetitleFontSize*
        font-weight:            'bold
        keep-with-next?:        #t
        (process-children)))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; PGROUP
; We have to extract the description of the group (located
; at the end of the PGROUP, and displayed at _the beginning_

(define (*groupName*)
; First set x to  GRPDESCR content
  (let ((x
	 (data (select-elements (children (if (equal? (gi) "PGROUP")
					      (current-node)
					    (ancestor "PGROUP")))
				'(GRPDESCR))))
	)
; if x ends in "." drop the latter. then concatenate ":"
    (string-append		
     (if (string=?
	  (substring x (- (string-length x) 1) (string-length x))
	  ".")
	 (substring x 0 (- (string-length x) 1))
       x)
     ":"
      )
    )
  )


(element PGROUP
    (make paragraph
        start-indent:          *personaIndent* 
        space-before:           *textSpaceBefore*
        font-weight:            'bold
	(literal (*groupName*))
        (process-children)))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; PERSONA inside a PGROUP
(element (PGROUP PERSONA )           
    (make paragraph
        space-before:           *personaSpaceBefore*
        start-indent:           *pgroupIndent*
        font-weight:            #f
        (process-children)))


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; GRPDESCR
; it has been extracted, so ignore
(element GRPDESCR
    (empty-sosofo))

Lesson 7

スタイルを使う

ソースファイルのキーポイント


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Scndescr

(define *sceneStyle*            ;style for all scene descriptions
    (style
        quadding:               'center
        font-size:              (+ *textFontSize* 4pt)
        line-spacing:           *textFontSize*
        font-weight:            #f
        font-posture:           'italic
        start-indent:           *sceneIndent*
        end-indent:             *sceneIndent*))

(element SCNDESCR
    (make paragraph
        use:                    *sceneStyle*
	space-before:           *sceneSpaceBefore*
        (process-children)))

Lesson 8

ソースファイルのキーポイント


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; STAGEDIR
;
(element STAGEDIR               
    (make paragraph
        font-posture:           'italic
; If it is inside a line or speech, don't put space-before, otherwise
; skip some space
        space-before:           (if (or (equal? (gi (parent)) "LINE")
                                        (equal? (gi (parent)) "SPEECH"))
                                    0pt
                                    *textFontSize*)
; surround so not spoken accidentally
        (literal "[")           
        (process-children)
        (literal "]")))

Lesson 9

表組を作成する

ソースファイルのキーポイント


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; SPEECH
(element SPEECH                 ;a set of lines by one or more speakers
    (make table                 ;use a table to accommodate multiple speakers
        space-before:           (/ *textFontSize* 2)
        may-violate-keep-after?: #t
        (make table-column      ;ensure speaker column is narrow
            column-number:      1
            width:              *speakerWidth*)
        (make table-cell        ;collect all speakers
            (make paragraph
                (with-mode *speechSpeaker*
                           (process-matching-children "SPEAKER"))))
        (make table-cell        ;collect all lines and instructions
            (process-children))))


(mode *speechSpeaker*           ;collect all speakers into single column
    (element SPEAKER            ;separate with ampersands to indicate multiple
        (if (= (child-number) 1)
            (make sequence
                font-posture:   'italic
                (process-children))
            (make sequence
                font-posture:   'italic
                (literal " & ")
                (process-children))))

    (default                    ;fail-safe - this should not trigger
        (empty-sosofo)))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; SPEAKER
; This has been taken care of in speechSpeaker mode, therefore ignore in 
; normal mode
(element SPEAKER                ;this should not trigger - only in mode
    (empty-sosofo))

(element LINE                   ;all of the lines for a given set of speakers
    (make paragraph
        (process-children)))

まとめ - Final Remarks

DSSSL は複雑な言語です. 今までの説明は, この言語の特徴について, ほんの少し概説したに過ぎません. このチュートリアルが理解できたからと言って, DSSSL のエキスパートになれたと思い込まないでください. 「DSSSL では何が可能なのか」については, ここまでの解説で感じとってもらえたと思います. またこれが, DSSSL 規格の草稿を読み, 理解を深めるきっかけとなればと思います.

Good luck!

このチュートリアルに関するご意見がありましたら, dmg@csg.uwaterloo.ca まで遠慮なくお知らせください.


Last modified: Thu Mar 13 12:01:35 1997
© 1997 Daniel M. Germán