

* 引数 SCOPE (SGML 宣言)

[1] [[SGML宣言]]の[[引数]] [DFN[[CODE(SGML)[SCOPE]]]]
は、その SGML 宣言で指定した[[具象構文]]の適用範囲を[[文書]]全体とするか、
それとも[[文書実現値]]のみとするかを指定します。

[2]
- [CODE(ABNF)[[DFN[具象構文適用範囲]] := "SCOPE" 1*[[ps]] ("DOCUMENT" / "INSTANCE") ;; [[JISX4151]]-1992 (181)]]

:[CODE(SGML)[DOCUMENT]]:具象構文の適用範囲はその SGML 文書全体です。
ただし、 SGML 宣言そのものだけは、つねに[[規格参照具象構文]]になっています。
[WEAK[(そうしないと、箱の中の鍵の問題が生じるからです。)]]
:[CODE(SGML)[INSTANCE]]:具象構文の適用範囲はその文書実現値だけです。
言い換えれば、[CODE[前書き]]は規格参照具象構文です。

[4] [CODE(SGML)[SCOPE INSTANCE]] の時には、具象構文に3つの制約が課されます。

- 規格参照具象構文と同じ[[構文参照文字集合]]を使わなければなりません。
- [[重要なSGML文字]]が、[CODE[前書き]]の終わりと[CODE[文書実現値集合]]のはじめを区別できる物でなければなりません。
- [[量集合]]が、[[規格参照量集合]]以上の量を持った物でなければなり増せん。

(>>2,>>4 JIS X 4151-1992 12.3 参照。)

[3] >>4 の2つめの条件ですが、
[CODE[文書実現値集合]]の先頭に来得るのは
- [CODE[[[基本文書要素]]]] > [CODE[[[文書要素]]]] > [CODE[[[要素]]]]
-- [CODE[[[開始タグ]]]]
-- [CODE[[[内容]]]] ([CODE[開始タグ]]が省略された場合)
--- [CODE[[[混合内容]]]]・[CODE[[[要素内容]]]]
---- [CODE[[[データ文字]]]]
---- [CODE[要素]]
----- 文字列の種類としては文書要素と同じ。
---- [CODE[他の内容]]
----- [CODE[注釈宣言]] / [CODE[[[短縮参照使用宣言]]]] / [CODE[[[連結集合使用宣言]]]] / [CODE[処理指令]] / [CODE(SGML)[[[shortref]]]] / [CODE[[[文字参照]]]] / [CODE[[[一般実体参照]]]] / [CODE[[[マーク区間宣言]]]] / [CODE(SGML)[[[Ee]]]]
---- [CODE[s]]
--- [CODE[[[置換可能文字データ]]]] / [CODE[[[文字データ]]]]
---- これらの場合、[CODE[開始タグ]]が省略できないので、実はあり得ない。
-- [CODE[[[終了タグ]]]] ([CODE[開始タグ]]が省略され、[CODE[内容]]が空の場合)
- [CODE[[[他の前書き]]]] ([CODE[開始タグ]]が省略され、[CODE[内容]]が空で、[CODE[終了タグ]]が省略された場合)
-- 何であれ、先に[CODE[内容]]とみなされてしまうので、実はあり得ない。
-- ちなみに、[CODE[前書き]]なのだからもしかすると規格参照具象構文の支配下ではないかと思ってしまうが、よく読んでみるとちゃんと[CODE[文書実現値集合]]には SGML 宣言で指定した具象構文が適用されると書いてあるので、[CODE[文書実現値集合]]の一部である[CODE[他の前書き]]は、やはりその具象構文が適用される。

です。
ご覧の通り、ほとんどありとあらゆるものが該当します。

[4] この規定に違反してしまう具象構文の例ですが、
[CODE(SGML)[[[stago]]]] に [SAMP(SGML)[<!]] を割り当てると、
[CODE[前書き]]の一部の [CODE(SGML)[[[mdo]]]] として認知されてしまうので駄目です。

また、文書要素の開始タグが省略可能なので省略して、
その要素の内容が [SAMP[<?something]] だったとすると、
[PRE[
<!DOCTYPE root [<!-- ここは規格参照具象構文 -->]>
<!-- ここもまだ規格参照具象構文 -->
<?something
?>これは文書要素の一部です。
独自の具象構文を使っています。
{/root}
{!〜 独自の具象構文を使っています。 〜}
]PRE]

となるわけですが、これでは[CODE[前書き]]内の処理指令とみなされてしまいます。
開始タグを省略しないか、[[文字参照]]や一般実体参照
[WEAK[(実体の例: [SAMP(SGML)[<!ENTITY 似非pio CDATA "<?">]])]] を使わないといけません。

[5] この機能、どうしても最低でも文書型宣言だけは別の具象構文を使わないといけませんから、具象構文が混じった[[文書実体]]になってしまうのですけど、
本当に使い道があるのでしょうか?

同じように具象構文混在問題を抱える SGML 宣言は、別に必須じゃないしなあ。
