SCOPE

具象構文適用範囲 (SCOPE DOCUMENT, SCOPE INSTANCE)

引数 SCOPE (SGML 宣言)

[1] SGML宣言引数 SCOPE は、その SGML 宣言で指定した具象構文の適用範囲を文書全体とするか、 それとも文書実現値のみとするかを指定します。

[2]

DOCUMENT
具象構文の適用範囲はその SGML 文書全体です。 ただし、 SGML 宣言そのものだけは、つねに規格参照具象構文になっています。 (そうしないと、箱の中の鍵の問題が生じるからです。)
INSTANCE
具象構文の適用範囲はその文書実現値だけです。 言い換えれば、前書きは規格参照具象構文です。

[4] SCOPE INSTANCE の時には、具象構文に3つの制約が課されます。

(>>2,>>4 JIS X 4151-1992 12.3 参照。)

[3] >>4 の2つめの条件ですが、 文書実現値集合の先頭に来得るのは

です。 ご覧の通り、ほとんどありとあらゆるものが該当します。

[4] この規定に違反してしまう具象構文の例ですが、 stago<! を割り当てると、 前書きの一部の mdo として認知されてしまうので駄目です。

また、文書要素の開始タグが省略可能なので省略して、 その要素の内容が <?something だったとすると、

<!DOCTYPE root [<!-- ここは規格参照具象構文 -->]>
<!-- ここもまだ規格参照具象構文 -->
<?something
?>これは文書要素の一部です。
独自の具象構文を使っています。
{/root}
{!〜 独自の具象構文を使っています。 〜}

となるわけですが、これでは前書き内の処理指令とみなされてしまいます。 開始タグを省略しないか、文字参照や一般実体参照 (実体の例: <!ENTITY 似非pio CDATA "<?">) を使わないといけません。

[5] この機能、どうしても最低でも文書型宣言だけは別の具象構文を使わないといけませんから、具象構文が混じった文書実体になってしまうのですけど、 本当に使い道があるのでしょうか?

同じように具象構文混在問題を抱える SGML 宣言は、別に必須じゃないしなあ。