この文書の最新版は「鳩丸よもやま話 : マーク区間とは」に移転しています。以下の文章は古くなっているかも知れません。
SGML には、マーク区間(marked section の訳語、マーク指定区域とも言います)という便利な仕組みがあります。まず、ルールをざっと説明しましょう。
マーク区間は、"<![" で始まり、キーワード(状態見出し語)、"[" 、内容、"]]>" という形で構成されます。そこで指定されるキーワードによって内容の扱いが変わります。
<![INCLUDE[ <P>この部分は INCLUDE ……表示/解釈されます。</P> ]]>
キーワード "INCLUDE" は、その部分が「含まれる」、すなわち普通に表示されたり解釈されたりすることを意味します。
<![IGNORE[ <P>この部分は IGNORE ……無視されます。</P> ]]>
キーワード "IGNORE" では、区間内は無視されます。
<![CDATA[ この部分は CDATA として扱われ、 < や > はタグの区切り子としては解釈されません。 & なんて書くとそのまま & と表示されますし、 <!--この部分もしっかり表示されます。--> ]]>
キーワード "CDATA" では、区間内は CDATA として扱われます。マーク区間終了区切り子 "]]" を除く全ての文字はデータとして扱われます。
同様に、キーワード "RCDATA" を用いると、区域内を RCDATA として扱います。
キーワード "TEMP" は、その区間を一時的なものとします。扱いは INCLUDE と同じです。
よく使われるのは、INCLUDE と IGNORE です。XML では CDATA型の内容をもつ要素が使えないことになっているので、CDATA も割と良く使われるようです。
マーク区間は、うまく使うと非常に便利なものです。たとえばこのように……。
<!ENTITY % test.section "INCLUDE"> …… <![%test.section;[ <H1>テスト区間</H1> <P>テスト区間です。とりあえず表示はされる予定です。</P> <P>INCLUDE を IGNORE に変えれば無視されます。</P> ]]> …… <![%test.section;[ <H1>テスト区間再び</H1> <P>またテスト区間です。とりあえず表示はされる予定です。</P> ]]>
パラメータ実体を使っておくと、先頭行の "INCLUDE" を "IGNORE" に書き換えるだけで、複数の箇所を一度に無効にできます。有効/無効の切り替えが簡単にできるわけです。もう少し複雑な例だと、こんなのがあります。
<!ENTITY % foo.deprecated "IGNORE"> <![%foo.deprecated;[ <!ENTITY % foo.recommended "IGNORE"> ]]> <!ENTITY % foo.recommended "INCLUDE"> ……共通部分…… <![%foo.recommended;[ この部分は厳格な推奨仕様 ]]> <![%foo.deprecated;[ この部分は非推奨仕様 ]]> ……共通部分……
最初の行で foo.deprecated が IGNORE とされているため、次のマーク区間は無視され、その次の宣言で foo.recommended が INCLUDE とされます。よって、以下 foo.recommended の部分は含まれ、foo.deprecated の部分は無視されます。
最初の行の IGNORE を INCLUDE とすると、次のマーク区間が有効となり、foo.recommended は IGNORE とされます。次の宣言は無視されませんが、先の宣言と重なるため無効です。よって、最初の場合と比べて、ちょうど INCLUDE と IGNORE が正反対になります。
このような手法は DTD の中でよく見かけるものですが、文書インスタンス(本文)の中でも使うことが出来ます。いや、これは面白そうです……。
しかし、残念なことに、現実にはマーク区間を理解してくれるブラウザは皆無です。間抜けなことに、ブラウザはマーク区間を単なるタグとみなして、訳の分からない表示をしたります。
一番最初の INCLUDE の例文を、あなたのブラウザはどのように表示するでしょうか?
……どうでしょうか。]]> が表示されているとしたら、それはあなたのブラウザが正しく HTML を解釈できていないということです。 上記の例では、おそらくほとんどの人が ]]> を見ているでしょう。ですから、HTML 文書にはこんな小細工をしないようにした方が賢明です。