[172] [DFN[[[SGML]] [RUBYB[[[宣言]]]@en[declaration]]]]は、 [[SGML文書]]の先頭にあって、
[[SGML文書]]で使用する[[具象構文]]その他のオプションを記述したものです。実際にはほとんどの場合
[[SGML宣言]]は単一システム内であるために暗黙裡に合意されているとみなし、省略されます。

* SGML 宣言の構文

[4] SGML 宣言は、必ず[[規格参照具象構文]]でないといけないこととなっています。
しかも、[[引数]]・[[注釈]]には[[マーク文字]]と[[最小データ文字]]しか使うことができず、
それ以外が必要なら (可能な箇所では) [[文字参照]]を使うこととなります。
[[実体参照]]は、まだ定義されていないので、使うことはできません。
([[JISX4151]]‐1992 12. 参照。)

[FIG[
- 
[PRE[
[DFN[SGML 宣言]] := [CODE(SGML)[[[mdo]]]] "SGML"
    1*[[ps]] [[最小表記]]    ;; SGML の版
    1*ps [[文書文字集合]]
    1*ps [[容量集合]]
    1*ps [[具象構文適用範囲]]
    1*ps [[具象構文]]
    1*ps [[機能使用]]
    1*ps [[応用特有情報]]
     *ps [CODE(SGML)[[[mdc]]]]
    ;; (171)
]PRE]
- [CODE(ABNF)[[DFN[ps]] := [[s]] / [[注釈]] ;; / [[引数実体参照]] / [[Ee]]]]
- [CODE(ABNF)[[DFN[注釈]] := [CODE(SGML)[[[com]]]] *文字 [CODE(SGML)[com]]]]
- [CODE(ABNF)[[DFN[mdo]] := "<"]]
- [CODE(ABNF)[[DFN[mdc]] := ">"]]
- [CODE(ABNF)[[DFN[com]] := "--"]]
- [CODE(ABNF)[[DFN[文字]] := [[最小データ文字]] / <[&#<>!|%;*@^_{}~]> / "[" / "]" / <"> / [[TAB]] ;; = TAB / CR / LF / SP / 印字可能文字 − <[$\`]> = %x09 / %x0A / %x0D / %x20-23 / %x25-%x5B / %x5D-5F / %x61-7E]]
]FIG]

[8] [[WebSGML]] では、 SGML 宣言を外部実体にできるようになりました。
[FIG[
- [CODE(ABNF)[[DFN[SGML 宣言]] := "<!SGML" 1*ps (SGML 宣言参照 / SGML 宣言本体) *ps ">" ;; [171] ]]
- [CODE(ABNF)[[DFN[SGML 宣言参照]] := <名前(規格参照具象構文)> [ [[外部識別子]] ] ;; [171.1] ]]
-- 外部識別子は、 SGML 宣言本体を参照するものでなければなりません。既定値は [CODE(SGML)[[[SYSTEM]]]] です。
-- [[公式公開識別子]]を使う場合、[[公開文種別]]は [CODE(SGML)[[[SD]]]] とすることが推奨されています。
- 
[PRE[
[DFN[SGML 宣言本体]] :=
         [[最小表記]]    ;; SGML の版
    1*ps [[文書文字集合]]
    1*ps [[容量集合]]
    1*ps [[具象構文適用範囲]]
    1*ps [[具象構文]]
    1*ps [[機能使用]]
    1*ps [[応用特有情報]]
  [ 1*ps 追加要件 ]
    ;; [171.2]
]PRE]
]FIG]

* SGML 宣言の最小表記

[7] SGML 宣言の最初にある最小表記では、
その宣言が (ひいてはその[[文書]]が)
適合する (ことを主張する) 規格の版を示します。

,*最小表記の最小データ	,*適合する規格
,[CODE(SGML)[ISO 8879:1986]]	,規格本体
,[CODE(SGML)[ISO 8879:1986 (ENR)]]	,規格本体 + 附属書 J ([[ENR]])
,[CODE(SGML)[ISO 8879:1986 (WWW)]]	,規格本体 + 附属書 J + 附属書 K ([[WebSGML]])

ENR や Web SGML の JIS の印刷版では、
植字上の表現のために  [CODE(SGML)[ISO 8879'' : ''1986]]
のように間隔が空いて見えますが、 ISO や JIS 原案委員会の
HTML 版を見る限り間隔はないのが正しいようです。
[WEAK[技術規格では普通の出版物とは違って規定内容が曖昧でないように印刷時にも注意しないと駄目だと思う。。。]]

[9] Web SGML では、上3種のいずれかでなければならないとしています。
しかしながら、無印や ENR を選択する場合は SGML
宣言本体参照機能は使えなくなるでしょう。
もちろん Web SGML で追加された追加の引数は指定できなくなります。

[[#comment]]


* SGML 宣言の追加要件

[FIG[
[11] 
- [CODE(ABNF)[[DFN[追加要件]] := "SEEALSO" 1*ps ("NONE" / 1*(1*ps 公開識別子)) ;; [199.1] ]]
]FIG]

[12] Web SGML で追加された追加要件引数を使って、
SGML 宣言で表現できない追加の要件に言及できます。
追加の要件は、 SGML とは関係のないものであっても構いませんが、
SGML の規格の要求に矛盾するものであってはなりません。
また、追加要件を満たさなくても[[報告可能マーク誤り]]にはなりません。
(K.3.9 参照。)

K.3.9 備考に示されている要件の例 :
- 特定の[[実体]]制約に関する表明の要件
- 指定された[[要素型]]に関する[[書式付け]]の慣習
- [[表]]の[[行]]中の[[こま]]の数がある[[属性]]で指定された数を超えないなどの[[データ]]に関する制限

公開識別子をシステムが知らないとしても誤りとはしません。

[13] 附属書 L では、 [[XML]] の例を示しています。
[FIG[
[PRE(code)[
SEEALSO "ISO 8879//NOTATION
         Extensible Markup Language (XML) 1.0//EN"
]PRE]
]FIG]

;; [15] でも、こう書いたところで XML システムは SGML
に矛盾する要件を一杯持ってるので SGML
に適合しないのは変わりないですけど。

[[#comment]]


* SGML 宣言の省略

[2] [[SGML]] 宣言は、その SGML 文書を単一システムでのみ使用する場合は、省略することが出来ます。 (システムが補充します。) しかし、複数のシステムをまたいで使用する場合には省略できません。 ([[JISX4151]]‐1992 5.2.3 参照。)

[10] Web SGML では、[[適合SGML文書]]は SGML
宣言を含むことが望ましいとされています (K.3)。

[3] >>2 例えば [[XML]] で SGML 宣言が必要ない [WEAK[(実際には書くことが出来ない)]] のは、 [[XML処理系]]というシステムでの使用だけが仮定されているからです。 XML 以外の SGML システムに転送するときには、 SGML 宣言が補われることになります[WEAK[(が、それは整形式ではなくなってしまいます)]]。

* 処理

[16] [[SGML]] は、その構文のいくつかの部分を独自に定めたり、
いくつかの機能を有効にするか無効にするか選択したりすることを認めています。
理論上 [[SGML文書]]は自己完結しており、 [[SGML宣言]]にそうした事項を記述し、
これを[[SGML文書]]の先頭に付与することで、任意の[[SGML文書]]を曖昧なく処理できることになっています。

[17] 実際これがどの程度機能していたか不明であり、怪しいものです。
いくつかの [[SGML]] の実装が、ある程度 [[SGML宣言]]に従って動作モードを切り替えることができることは知られていました。
しかし、一般に [[SGML応用]]は自身に適合する[[SGML文書]]が用いるべき
[[SGML宣言]]を提供し、[[SGML文書]]は暗黙のうちにこれを採用することとし
(宣言そのものは省略し)、その[[SGML応用]]のみを扱う実装はそれを前提として他の
[[SGML宣言]]を想定しないような運用がなされていました。

[18] また、実際に[[SGML文書]]で用いられる[[文字コード]]と [[SGML]]
における[[文書文字集合]]との関係については (時代背景もあって) 十分に整理されておらず、
[[SGML宣言]]における指定方法には様々な混乱が見られました。
現実的には [[SGML宣言]]に基づき[[文字コード]]に関わる処理が変更されることはほとんどなかったと思われます。

* メモ

- [1] ''マニアックな文法論議 - SGML宣言の読み方'' <http://www.ne.jp/asahi/minazuki/bakera/html/sgml/sgmldecl>

- [5] SGML 宣言は規格参照具象構文でないといけないから、[[前書き]]や[[文書実現値]]と同じ実体に含めるとしたら [[ISO/IEC646]] [[旧IRV]] の[[超集合]]か、最低でも [[ISO/IEC646の版]]の超集合で符号化されていないと役に立たないんじゃ・・・と思ったんだけど、よく考えれば[[文書文字集合]]は具象構文とは別立てだから、たとえ [[EBCDIC]] だろうと問題はないんだ。

[6] >>5 でも構文参照文字集合と文書文字集合って矛盾しててもいいものなの?
規格参照具象構文で文字番号 0〜127 は旧 IRV
に固定されていると考えないといけないのかも?

[14]
[CITE@ja[日本語用SGML DCL(宣言)ファイル]]
<http://www.nihs.go.jp/dig/ich/multi/m2/e2b-m2/ICHICSR-sjis.dcl>

>
[PRE[
    SGML Declaration for ICH SGML Applications using sjis.
    This Declaration was written by James Clark for
    the SP parser.  

    This character set declaration is suitable for use with the ujis or
    sjis coding systems.  It's probably rather easier to lie a bit. 
]PRE]

たしかにこれはひどい。[[文書文字集合]]で
[CODE(SGML)@en[[[ISO Registration Number 87//CHARSET JIS X 0208 Japanese Character Set//ESC 2/6 4/0 ESC 2/4 4/2]]]]
が [CODE(char)[[[0x80]]]]〜[CODE(char)[[[0xFE]]]]
の[[1バイト符号化文字集合]]として定義されており、
[[名前文字]]にも [CODE(char)[[[0x80]]]]〜[CODE(char)[[[0xFE]]]] 
が追加されている。
([[名無しさん]])