フォーマッターJADE


目次

はじめに ▼
Jadeとは? ▼
Jadeの著作権 ▼
Jadeの入手方法 ▼
Jadeの構築方法 ▼
 Win32 ▼
 Unix ▼
Jadeの用法 ▼
Jadeの拡張 ▼
 デバッグ ▼
 頭書き/脚書き制御 ▼
 番号付け ▼
 外部実体の呼び出し ▼
現在のJadeの制約 ▼
 文字・グリフの取り扱い ▼
 検証 ▼
 その他の制約 ▼
バックエンド ▼
 RTFバックエンド ▼
 FOTバックエンド ▼
Jadeソースの読み方 ▼
バグについての報告 ▼
Jadeの配布 ▼

はじめに

 James Clark氏が著した“Jade - James' DSSSL Engine”の全訳を掲載します。この原文については,Jadeのパッケージ[ftp://ftp.jclark.com/pub/jade/jadew1_0.zip]に含まれているjade.htmを参照して下さい。訳の文責は岸 和孝にあります。

 DSSSL標準のJIS規格書がまだ刊行されておりませんので,用語は関連資料を元にして適当に訳しました。参考のため初出の原語は〔〕内に示しました。訳の不明な箇所がありましたら,ご指摘下さい。なお,項目番号は便宜上訳者が付けました。


Jadeとは?

 Jadeは,DSSSLスタイル言語の処理系で,現在のバージョンは1.0です。DSSSLについての全般的な情報は,DSSSL page[http://www.jclark.com/dsssl/]を参照して下さい。

 あなたはDSSSList(DSSSLユーザーのメーリングリスト)においてJadeについて話し合ったり他のユーザーから助けてもらったりすることができます。私は,DSSSList上でJadeの新しいバージョンについて発表します。それを購読するには,majordomo@mulberrytech.comへメッセージとして“subscribe dssslist”と書いたメールを送って下さい。その要約を購読する場合は,メッセージとして“subscribe dssslist-digest”と書いたメールを送って下さい。その一覧は,archived[http://www.mulberrytech.com/dsssl/dssslist/archive]にあります。

 Jadeは,次の構成要素を含んでいます。


Jadeの著作権

 Jadeは,SPと同じ条件の下で認可を受けます。これは商業的な使用においても,どんな制限もありません。

 もし商業的な製品としてJadeを使う場合は,それが何であるかを私に教えて下さい。私はJadeの使用を認めるでしょう。


Jadeの入手方法

 Windows 95かWindows NTを使っている場合は,binary distribution[ftp://ftp.jclark.com/pub/jade/jadew1_0.zip]にすべてがあります。

 そうでない場合は,ソースから構築する必要があります。ソースは,Jade[ftp://ftp.jclark.com/pub/jade/jade1_0.zip]にあります。そのパッケージは,SPの互換バージョンのためのソースを含んでいます。(それは,SPの最新バージョンからの差分かもしれません。)

 新しいディレクトリーを作って,そのディレクトリーにソースファイルを解凍して下さい。ソースzipファイルの中のファイルはCR・LFで区切られた行を使っていますので,Unixで解凍する場合は,“unzip -a”を使って下さい。Windowsでは,長いファイル名を保つ,WinZip 6.1のようなunzipを使わなければなりません。使用するunzipがファイル名の大文字・小文字を保つことを確かめるべきです。unzipのバージョンによっては,-Uオプションを使う必要があります。


Jadeの構築方法

Win32

 Microsoft Visual C++ 4.2bだけがサポートされています。バージョン4.2で試しましたが,バージョン4.1でも動きました。

 makefileとしてSP.makを開いて下さい。そして少なくともlib - UnicodeDebugとlib - UnicodeReleaseのコンフィグレーションを作って下さい。

 次に,makefileとしてjade.makを開いて下さい。そしてjadeコンフィグレーションを作って下さい。

 debugコンフィグレーションを伴うDLLとEXEがlib\UnicodeDebugディレクトリーで終わります。releaseコンフィグレーションを伴うそれらがbinディレクトリーで終わります。

Unix

 gcc 2.7.2だけがサポートされます。(2.6.3と2.7.1でもできますが,2.7.0は使わないで下さい。)

 x86プロセッサーでgcc 2.7.2を-Oで使う場合は,-fno-strength-reduceを使わなければなりません。gcc 2.7.2.1では,その問題は解決されています。

 Unix上での構築では,技術上の欠陥の解決を準備するように,不規則に試されています。(典型的に,解決には,いくつかの証拠となる事例を必要とします。)

 あなたはinclude指令をサポートするMakefileを必要とします。

 make -f Makefile.jadeで構築して下さい。Jadeは,-DSP_MULTI_BYTEでコンパイルされたSPを必要とすることに注意して下さい。どんな開発においても,make -f Makefile.jade dependも行なって下さい。

Jadeの用法

 あなたのパスへJade(バイナリー)を含んでいるディレクトリーを加えて下さい。そして,そのディレクトリーをdssslディレクトリーとして下さい。次のようなコマンドを実行してみて下さい。

jade demo.sgm nsgmls -s demo.fot

 もしすべてが働いている場合は,エラーはありません。

 処理する文書のシステム識別子をJadeへの引数として指定します。もしこれを省略すると,標準入力は行われません。

 Jadeは,次に述べるように,DSSSL指定のためのシステム識別子を決定します。

  1. -dオプションが指定されると,システム識別子として引数が使われます。
  2. そうでない場合は,文書の前書き〔prolog〕で処理指令〔processing instruction〕を探します。次の二種類の処理指令が識別されます。
    <?stylesheet  href="システム識別子"  type="text/dsssl">
    

     処理指令のシステムデータ〔system data〕がSGML開始タグ〔start-tag〕のように解析されます。文書の実際の具象構文〔concrete syntax〕が何であっても,参照具象構文〔reference concrete syntax〕を使って解析されます。処理指令を始める名前は,stylesheetかxml-stylesheetです。処理指令は,type属性の値がtext/dsssl,text/x-dsssl,application/dsssl,application/x-dssslのいずれかでなければ,無視されます。href属性のシステム識別子は,DSSSL指定のシステム識別子です。

    <?dsssl システム識別子>
    

     システム識別子は,初めの名前と空白の後に続く処理指令のシステムデータの部分です。

     処理指令は前書きの中でだけ識別されますが,文書実体〔document entity〕で生じなくてもかまいません。例えば,それは文書型定義で生じます。システム識別子は,処理指令が生じた場所に関して解釈されます。
  3. そうでない場合は,.dslで変更した拡張子を持つ文書のシステム識別子が使われます。

 DSSSL指定文書は,一つ以上のスタイル指定を含むことができます。もしDSSSL指定のシステム識別子の後に#idが続く場合は,Jadeは一意の識別子がidであるスタイル指定を使います。これは,-dオプション,処理指令共に可能です。

 DSSSL指定は,DSSSL方式に適合するSGML文書でなければなりません。例えば,demo.dslを参照して下さい。

 Jadeは,通常のSPオプションに加えて,次のオプションをサポートします。

-d DSSSL指定

 DSSSL指定が,使用するDSSSL指定のシステム識別子であることを指定します。

-G

 デバッグモード。エラーが式の評価で生じた時に,Jadeはスタックトレースを表示します。これがtail-call最適化に問題を起こすことに注目して下さい。

-t 出力形式

 出力形式は,次のような種類を指定します。

fot

 フローオブジェクトツリーのSGML表現。

rtf
rtf-95

 MicrosoftのRich Text Format rtf-95は,Word 97よりもWord 95に最適化した出力を生成します。

tex

 TeX。

sgml

 SGML(SGML-to-SGML変形のために用います。)

xml

 XML(SGML-to-XMLのために用います)。

-o 出力ファイル

 出力ファイルへ出力します。ファイル名を省略すると,最後の入力ファイルの名前に出力形式の名で取り替えられた拡張子が付けられます。入力ファイル名がない場合は,jade-outが拡張子に加えられます。

-V 変数

 この定義がスタイルシートにおける変数についてのどんな定義に対しても優先的になることを除いて,これは,次を行なうことと同じです。

(define 変数 #t)

 Jadeは,SP_CHARSET_FIXEDとSP_SYSTEM_CHARSETの環境変数を無視し,常にその内部文字集合としてUnicodeを使います。それはちょうど,SP_CHARSET_FIXEDが1でSP_SYSTEM_CHARSETが設定されなかったようにです。従って,SP_ENCODING環境変数だけがJadeの文字集合操作と関係します。


Jadeの拡張

 次の外部手続き〔external procedure〕が利用できます。これらの外部手続きは,標準と同じ方法で原型〔prototype〕によって定義されます。これらの外部手続きの一つを使うために,“UNREGISTERED::James Clark//手続き::名前”の公開識別子を使って,標準のexternal-procedure手続きを使わなければなりません。ここで,名前は,典型的に,次のDSSSL指定に含まれている名前です。

(define 名前
  (external-procedure 
    "UNREGISTERED::James Clark//手続き::名前"))

 指定された公開識別子〔public identifier〕のことが分からない場合は,external-procedureが#fが返されることに注意して下さい。これらの拡張をサポートしない他の処理系と一緒にうまく働くDSSSL指定を可能にするために,これを使うことができます。

デバッグ

(debug オブジェクト)

 オブジェクトの値を含んでいるメッセージを生成し,オブジェクトを返却します。


頭書き/脚書き制御

(if-first-page sosofo1 sosofo2)

 これは,simple-page-sequenceのheader/footer特性の一つの値の指定でだけ使えます。ページがsimple-page-sequenceの最初のページである場合,sosofo1として表示するsosofoを返却します。そうでない場合は,sosofo2としてページを表示するsosofoを返却します。

(if-front-page sosofo1 sosofo2)

 これは,simple-page-sequenceのheader/footer特性の一つの値の指定でだけ使えます。ページが右ページ(奇数ページ)の場合は,sosofo1として表示するsosofoを返却します。そうでない場合,つまり左ページ(偶数ページ)の場合は,sosofo2として表示するsosofoを返却します。


番号付け

(all-element-number)
(all-element-number osnl)

 これは,どんな共通識別子をもっている要素でも数えることを除くと,element-numberと同じです。osnlが要素でない場合は#fを返却します。そうでない場合は,osnlの前で始まった要素の番号に1を加えたものを返却します。これは,文書でどんな要素にも一意の識別子を作るための効果的な方法を提供します。


外部実体の呼び出し

(read-entity 文字列)

 これは,システム識別子の文字列を持った外部実体〔external entity〕の内容を含んでいる文字列を返します。これは,本文の実体(CDATAとSDATA)のためにだけ用いるべきで,2進数実体〔binary entity〕(NDATA)のために使うべきではありません。


現在のJadeの制約

 この節では,フロントエンド〔front-end〕(汎用的なDSSSLエンジン)の制約を説明します。各々のバックエンド〔backend〕にも独自の制約があります。

 DSSSLのDSSSL Online部分集合だけが,次の追加機能(完全なDSSSLのすべての部分)で実行されます。

 幾つかのサポートされたフローオブジェクトに適用できる,引き継がれた特性だけが指定できることに注意して下さい。

 Jadeは,次のモジュールで構成する一つの,固定されたグローブプランだけをサポートします。


文字・グリフの取り扱い

 たった一つの定義済みの文字レパートリー〔character repertoire〕だけをサポートします。四つの大文字からなる16進数字XXXXである形式U-XXXXの文字名〔character name〕は,その符号をもって,Unicode文字を参照しているものとして識別されます。多くの文字のために,ハイフンによってその語を分けた,小文字のISO/IEC 10646名前を使うことができます。

 ISO実体集合からの幾つかの共通のSDATA実体名が識別され,文字に対応付けされます。さらに,四つの大文字からなる16進数字XXXXである形式U-XXXXの文字名は,その符号をもってUnicode文字に対応付けされます。

 Jadeは,文字とグリフ〔glyph〕に関係づけた構造的な形式のいずれも使いません。

 次のスタイル言語宣言(non-DSSSL Online declarationと同様に)は,無視されます。


検証

 調べることが望ましい幾つかのことが検査されません。


その他の制約

 次の基本が残されています。

char-script-case

 常に,最後の引数を返却します。

char-property

 常に,#fか指定された省略時値を返却します。

address-visited?

 常に,#fを返却します。


バックエンド

RTFバックエンド

 次のフローオブジェクトクラスだけが実行されます。

sequence
character
paragraph
paragraph-break
line-field

 paragraphの始まりにおいてだけ。

display-group
simple-page-sequence
score

 afterとthroughを活字体で印字するだけ。

rule

 水平方向だけ。ページレイアウトの全体像において現われるだけの定規。

box

 箱の内側の字下げの変化には働きません。

leader

 フローオブジェクトの内容が無視され,点線が常に使用されます。指定された長さは無視され,それは行にいつも満たされます。

external-graphic

 Windowsプラットホームにおいて,これは,記憶マネージャー〔storage manager〕がCLSIDで,(かっこを含んでいる)記憶オブジェクト識別子〔storage object identifier〕がCOM CLSIDである,公的システム識別子notation-system-id:の値を作ることによって,埋め込れたOLEオブジェクトに使えます。システム識別子は,だけかもしれません。(つまり,記憶オブジェクト識別子は空でもかまいません。)この場合,ファイルのためのOLE省略時CLSIDが用いられるでしょう。(通常は,ファイルの拡張子に基づいて選ばれます)

link

 同じRTF出力ファイルにおける一つの要素である相手先だけ。

table
table-part
table-column

 table-auto-width特性は,適切にサポートされません。実は,RTFでは可能ではありません。

table-row
table-cell
table-border
mathフローオブジェクト

 これらはWordのEQフィールドに変えられます。WordのEQ特性は,本当に良い処理を行なうにはあまり強力ではありません。over-mark表現域とunder-mark表現域の適切な位置を自動的に計算する方法はありませんので,markフローオブジェクトクラスには特別な問題が多くあります。しかし,幾つかの追加の特性では,明白に指定されるべき位置付けを許すようにしています。

 多くのDSSSL特性は,RTFで表現することができません。バックエンドがそれを最良にできます。

 Microsoft Wordで正しいページ番号を得るために,この文書を開いた後に,次のようにタイプしてみて下さい。CTRL+END→CTRL+A→F9

 Word Viewer 97では,代わりに次のようになります。CTRL+END→ALT→V→N→ALT→V→P

 印刷する際に,ページ番号は自動的にごく新しくなります。

 RTFバックエンドは,幾つかの追加の特性をサポートします。ここでCと名付けた特性を使うために,公開識別子と一緒にdeclare特性を用いて宣言して下さい。

"UNREGISTERED::James Clark//Characteristic::C"
heading-level

 値は整数です。それはフローオブジェクトをparagraphに分けるために適用します。その値が1と9の間にあれば,paragraphはそのレベルの頭書き〔header〕として出力されます。そうでなければ,本文〔body text〕として出力されます。この特性を使うことによって,Wordに対して有用な「アウトライン表示」と「文書マップ」を与えることになります。(RTF文書のための「文書マップ」のWordの取り扱いは,バグの多いことに注意して下さい。RTF文書をロードする場合で,以前の文書がオンラインの「アウトライン表示」を使っていたならば,RTFは,どのparagraphが頭書き〔handling〕であるかを推測しようとしますが,殆どうまくいきません。このことを避けるために,RTF文書をロードする以前に「標準表示」へスイッチします。) この初期値は0です。

page-number-format

 値は,format-number手続きに関しては文字列です。これはsimple-page-sequenceの中のページの参照のために,page-number-sosofoとcurrent-page-number-sosofoによって使われた番号のformatを制御します。初期値は,1です。これは,simple-page-sequenceフローオブジェクトに適用されます。

page-number-restart?

 値は,ブールです。もしそれが真であれば,page-number-sosofoとcurrent-page-number-sosofoの目的のために,そのsimple-page-sequenceのためのページ番号が1から再開始します。初期値は,#fです。これは,simple-page-sequenceフローオブジェクトに適用されます。

page-n-columns

 値は,厳密な正整数で,コラムの番号を指定します。初期値は,1です。これは,simple-page-sequenceフローオブジェクトに適用されます。

page-column-sep

 値は,長さで,コラム間の間隔を指定します。初期値は,.5inです。これは,simple-page-sequenceフローオブジェクトに適用されます。

page-balance-columns?

 値は,ブールで,真の場合に,page-sequenceの最終ページでのコラムは釣り合いがとられるべきです。初期値は,#fです。これは,simple-page-sequenceフローオブジェクトに適用されます。

superscript-height

 値は,長さです。parentのベースライン上のsuperscriptのベースラインの高さを指定します。これは,superscriptフローオブジェクトとscriptフローオブジェクトに適用されます。

subscript-depth

 値は,長さです。parentのベースライン上のsuperscriptのベースラインの深さを指定します。これは,superscriptフローオブジェクトとscriptフローオブジェクトに適用されます。

over-mark-height

 値は,長さです。主要な表現域の内容のベースライン上のmarkフローオブジェクトのover-mark表現域の内容のベースラインの高さを指定します。それもscriptフローオブジェクトのmid-sup表現域の内容の高さを制御します。これは,markフローオブジェクトとscriptフローオブジェクトに適用されます。

under-mark-depth

 値は,長さです。主要な表現域の内容のベースライン上のmarkフローオブジェクトのunder-mark表現域の内容のベースラインの深さを指定します。それもscriptフローオブジェクトのmid-sup表現域の内容の深さを制御します。これは,markフローオブジェクトとscriptフローオブジェクトに適用されます。

grid-row-sep

 値は,長さです。gridフローオブジェクトの行の間隔を指定します。

grid-column-sep

 値は,長さです。gridフローオブジェクトの列の間隔を指定します。


FOTバックエンド

 生成されるSGMLのための文書型定義は,jade/fot.dtdです。

 declare特性で宣言した特性は,報告されません。

 declare-flow-objectで宣言したクラスのフローオブジェクトは,報告されません。


Jadeソースの読み方

 Jadeソースは,次のヘッダーから読み始めて下さい。

grove/Node.h
style/FOTBuilder.h
style/StyleEngine.h

バグについての報告

 もしあなたがJadeでバグを見つけた場合は,それを報告する時間をとって下さい。もしJadeが全くどんな入力でもクラッシュする場合は,バグですから,それについて報告して下さい。もしJadeがDSSSL標準によって必要とされた方法でDSSSL標準に適合する指定を処理できない場合は,現在の制約としてここで文書化されていなくても,またDSSSL標準に提案された技術的正誤表[http://www.ornl.gov/sgml/wg8/document/1883.htm]でエラーとして文書化されていなくても,それはバグですので,それについて報告して下さい。

 私[jjc@jclark.com]へ電子メールでバグを報告して下さい。それらは,comp.text.sgmlにもsp-progメーリングリストにもDSSSListメーリングリストにも送らないで下さい。

 私はすでに文書化されている制約に関するバグ報告を見たくはありません。どうか制約一覧を慎重に読んで下さい。しかし,あなたが書きたいと思う現在の制約を知らせる自由はあります。

 このステージにおいても,Jadeのコンパイルを妨げるC++コンパイラーのバグについて知りたいわけではありません。もしあなたのコンパイラーがJadeをコンパイルすることを拒むならば,それについてだけ聞きたいのです。

 バグを報告する前に,あなたのバージョンが最新のものであるか調べてみて下さい。

 バグを報告する場合に最も重要なことは,私がJadeを動かすことができて,その問題を生じさせることができるファイルの完全な集合があることです。文書型定義が標準であったにしても,あなたが使ったすべての文書型定義を含めて下さい。また,私が使うべきコマンドラインについて,そしてJadeのふるまいのどこがおかしいのかも書いて下さい。もしファイルが大きいパッケージである場合は,tarかzipのファイルにして,“ftp://ftp.jclark.com/incoming”へアップロードして下さい。

 もしあなたがバグの解決法を持っているのであれば,それは役に立ちます。しかし,バグの解決に時間をかけるあまり,それを報告することをどうか延期しないで下さい。さらに,バグを再現させるためのファイルを付けないで,苦境に陥った状態を知らせないで下さい。


Jadeの配布

 Jadeに貢献できる幾つかの方法があります。

(1998年3月記)


(c)1998 JAGAT