[2] [DFN[[RUBYB[文書型宣言] [Document type declaration]]]]は、
その[[文書]]の[[文書型]]及び[[文書型定義]]を[[宣言]]する[[マーク宣言]]です。
[[文書実体]] (または[[部分文書実体]]) の最初の方に記述します。

[16] '''文書型宣言と文書型定義''':
[RUBYB[文書型宣言] [Document type declaration]]と[RUBYB[[[文書型定義]]] [document type definition]]はよく混同されますが、
別のものです。文書型宣言を使って記述するのが[[文書型定義]]です。

;; [113] [[HTML]] における [[DOCTYPE]] については、 [CODE(HTML)[[[<!DOCTYPE HTML>]]]]
を参照してください。

* 構文

[14] [[ISO 8879]] を元に文書型宣言の構文を [[ABNF]]
で表すと、次のようになります。

- [7] [CODE(ABNF)[[DFN[文書型宣言]] := [CODE(SGML)[[[mdo]]]] [[DOCTYPE]] 1*dps [[文書型名]] [1*dps 外部部分集合参照 ] [1*dps [CODE(SGML)[[[dso]]]] [[文書型宣言部分集合]] [CODE(SGML)[[[dsc]]]] ] *dps [CODE(SGML)[[[mdc]]]] ;; [[JISX4151]]‐1992 (110)]]
- [8] [CODE(ABNF)[[DFN[dps]] := [[s]] / [[注釈]] ;; [[ps]] − ([[引数実体参照]] / [[Ee]])]]
- [10] [CODE(ABNF)[[DFN[外部部分集合参照]] := [[外部識別子]] [1*dps ([[CDATA]] / [[NDATA]] / [[SDATA]]) <内部部分集合で宣言される[[記法名]]> ] ;; Web SGML なら (見出し語 + 記法名) を使える [110] ]]

[[#comment]]


** 構文図

[15] いいかげんな構文の図を描いてみました。

[PRE[
mdo->DOCTYPE-> ps -> Name --------------------+
               \/     \/                      \/
           keyword -> ps ------------------> dso -> isub -> dsc
                      |                     /\/\            |
                      |                     | ps ---> mdc <-+
                      |                     | /\       /\
                      +->  SYSTEM  -> ps -> syslit ----+
                      \/                        /\
                    PUBLIC  -> ps -> minlit -> ps
]PRE]

[PRE[
 mdo
  #
 DOCTYPE
  #
 ps ---> rni
  #       #
 Name   keyword
  |       |
  +---+---+<------------------r----------------------+
      |                                              |
  +---+---+                                          |
  |       #                                          |
  |      ps ----+-------------------------+-------+  |
  |       |     #                         #       #  |
  |       |   SYSTEM                   PUBLIC   keyword
  |       |    |   |                    #  |      
  |       |    |   |                   ps  |
  |       |    |   |                  # |  |
  |       |    |   | +---------- minlit |  |
  |       |    |   # #               |  |  |
  |       |    $   ps                |  |  |
  |       |    |  |  #               $  r  r
  |       |    |  | syslit           |  |  |
  |       |    |  $  |  #            |  |  |
  |       |    |  |  | ps            |  |  |
  |       |    |  |  |  |            |  |  |
  +-------+----+--+--+---------------+--+--+<-+
          |                                   |
  +-------+-----+-----+                       r
  |             #     #                       |
  |            dso   otherwise ---------------+
  |             #
  |           intsub
  |             #
  |            dsc
  |             |
  +------+------+
         #
        mdc
]PRE]

[[#comment]]


* 内部部分集合と外部部分集合

[5] 旧来の SGML では、文書型宣言は必須でした。 [[class]] 
としての文書型定義と、 [[instance]] 
である[[文書実体]]は常に対を成す必要があったからです。しかし、
文書型定義を全ての[[文書実体]]に含めなければならないとすると面倒で、
無駄でもあります。ですから、たいていは[[外部部分集合実体]]として外部 [[DTD]] 
を用意しておいて、
それを公開識別子や[[システム識別子]]による参照として文書型宣言中に記述します。

[6] しかし、 >>5 のようにしていても、
ある文書では文書型定義の一部を修正したいということがあり得ます。
その時は、[[内部部分集合]]に差分の定義を書いておくことが出来ます。
[WEAK[もちろん、外部部分集合無しですべて内部部分集合に書いても構いません。]]

[[#comment]]


* 文書型宣言の省略

[9] Web SGML では、
- [CODE(SGML)[[[LINK]] [[EXPLICIT]] NO]] ([[明示連結]]不使用) かつ
- [CODE(SGML)[[[CONCUR]] NO]] (並行文書型不使用) かつ
- [[文書実現値]]が[[完全タグ付き]]又は[[充足タグ付き]]であり、かつ
- -- [CODE(SGML)[[[IMPLYDEF]] DOCTYPE YES]] 又は
-- [CODE(SGML)[IMPLYDEF [[ELEMENT]] YES]] 

のとき、 [[SGML文書実体]]の[[前書き]]を省略できます。
このとき、次の暗黙の宣言が仮定されます。
:[CODE(SGML)[IMPLYDEF DOCTYPE YES]] のとき:
[CODE(SGML)[<!DOCTYPE #IMPLIED SYSTEM>]]
:[CODE(SGML)[IMPLYDEF DOCTYPE NO]] のとき:
[CODE(SGML)[<!DOCTYPE #IMPLIED>]]

(Web SGML K.4.9 参照。)

[12] 素の SGML は [ABBR[oo] [オブジェクト指向]] でいうところの
class-based で、 Web SGML は prototype-based 
風な特徴を取り入れてみたというところでしょか
(といっても Web SGML に prototype はないですが)。

[[#comment]]


* DOCTYPE switch

[13] 21世紀初頭の [[WWWブラウザ]]の多くでは、
文書型宣言の記述によって [[CSS]]
の解釈等を変更する [DFN[[[DOCTYPEスイッチ]]]]が実装されています。

DOCTYPE スイッチは [[WinIE]] 
の不具合など旧来の実装と本来の仕様に従った実装との互換性の問題への一つの解法として提案されたものですが、
文書型宣言の本来の役割に基づくものではありませんし、
何らかの規格としてまとめられているものでもありませんから、
[[著者]]の誤解と混乱を招いています。

[11]
[[WinIE]] の DOCTYPE switch って 
[[XML宣言]]だけじゃなくて[[注釈宣言]]なんかでも効かなくなるのか。
どうしようもないなあ。

[[#comment]]


* 参考文献

[1] ''マニアックな文法論議 - 文書型宣言の読み方''
[PRE[
 <http://www.ne.jp/asahi/minazuki/bakera/html/sgml/doctype>
[[#comment]]
]PRE]


* 例

[3] [[規格参照具象構文]]や他の主要な[[具象構文]]では、 
[SAMP(SGML)[<![[DOCTYPE]] [CODE(HTMLe)[[[html]]]] [[PUBLIC]] "-//W3C//[[DTD]] HTML 4.01//EN">]]
のように記述します。

[4] >>3 の例では、文書型は [SAMP(HTMLe)[html]] です。 
[SAMP[-//W3C//DTD HTML 4.01//EN]] 
という[[公開識別子]]で[[識別]]される[[外部部分集合]]と、
空の[[内部部分集合]]で文書型定義は構成されます。

[[#comment]]


* メモ

[17]
[CITE[カナかな団の躁鬱_2006_03_a]] <http://aboutworks.com/shokodei/diary/2006/2006_03_a.html#PrintNo1>

[AA(hw)[ワロス]]
([[名無しさん]] [WEAK[2006-05-28 08:13:21 +00:00]])

[18]
[CITE[HTML5 IRC logs: freenode / #whatwg / 20080130]] ([TIME[2008-01-30 17:41:59 +09:00]] 版) <http://krijnhoetmer.nl/irc-logs/whatwg/20080130#l-52>

[111] [CITE[IRC logs: freenode / #whatwg / 20081015]] ([TIME[2008-10-17 21:04:09 +09:00]] 版) <http://krijnhoetmer.nl/irc-logs/whatwg/20081015#l-710>

[112] [CITE[html-wg-94q3: Re: HTML 2.0 editing status]]
([TIME[2008-03-15 05:24:26 +09:00]] 版)
<http://ksi.cpsc.ucalgary.ca/archives/HTML-WG/html-wg-94q3.messages/0056.html>


[FIG(quote)[
[FIGCAPTION[
[19] [CITE@en[Windows RSS Publisher's Guide (work-in-progress) - Microsoft RSS Blog - Site Home - MSDN Blogs]]
([TIME[2015-05-04 11:40:03 +09:00]] 版)
<http://blogs.msdn.com/b/rssteam/archive/2005/08/02/publishersguide.aspx>
]FIGCAPTION]

> To limit the impact that feeds with DTDs can have on a user’s computer, the RSS Platform’s parser rejects all feeds that contain references to DTDs and IE7 displays an error instead of showing the feed reading view. 

]FIG]




[FIG(quote)[
[FIGCAPTION[
[20] [CITE@en[RFC 6241 - Network Configuration Protocol (NETCONF)]]
([TIME[2017-05-07 18:00:15 +09:00]])
<https://tools.ietf.org/html/rfc6241#section-3.2>
]FIGCAPTION]

> Document type declarations (see Section 2.8 of
>    '''['''W3C.REC-xml-20001006''']''') MUST NOT appear in NETCONF content.

]FIG]
