SGML には省略タグ機構という仕組みがあります。これは、SGML宣言で OMITTAG YES と宣言されている時に限って有効ですが、HTML も OMITTAG YES となっていますので、省略タグ機構を用いることが出来ます(ただし HTML+ は OMITTAG NO)。そして実際、広く用いられています。
OMITTAG YES だからといって、何でも好き勝手に省略できるわけではありません。タグの省略は、以下の全てを満たす場合のみ可能です。
あるタグが省略を許されているか否かは、要素宣言を見れば分かります。たとえば、
<!ELEMENT P - O (%inline;)* >
- O の部分で開始タグ、終了タグの省略可否が示されています。- は省略不可、O は省略可能(Omissible)であることを示しています。つまり、P 要素は、開始タグ省略不可、終了タグのみ省略可能です。
開始タグ終了タグの双方が省略可能なものもあります。
<!ELEMENT TBODY O O (TR)+ >
これは開始タグも終了タグも省略できる要素です(ただし、実際に省略するには「自明である」という条件もクリアしなければなりません。これは後述します)。
また、省略の可否は要素ごとに決められていて、似たような使い方をするからと言って省略の可否が同じとは限りません。たとえば Hn は P と構造が似ていますが、
<!ELEMENT (%heading;) - - (%inline;)* >
となっていて、終了タグが省略できません。
省略可能とされているものはたいていそのまま省略できますが、文脈上、省略が自明でない場合には省略することが出来ません。
2003-12-16: ここには省略が自明でない例が出ていましたが、いずれも例として不適切でしたので削除しました。詳細はsatoshiiさんのご指摘と、そのリンク先をご覧ください。
また、必須の属性を持つ要素の開始タグは、省略できません。属性を指定するには開始タグが必要ですから、属性が必須なのであれば、開始タグを書かざるを得ません。
最後にもうひとつ、中身が EMPTY の場合、その開始タグを省略することが出来ないと言うルールがあります。<IMG> や <META> のような、中身のない空要素の開始タグは省略できません。が、HTML の DTD では、これらはそもそも省略できないように宣言されています。
また、空要素の場合は終了タグを省略しなければならないことになっています。</IMG> などは書いてはいけません。
XML では空要素にも終了タグが存在します。むしろ終了タグの省略が一切できませんので、</img> を書かなければなりません。ただし、「NET可能開始タグ」と NET を使って <img/> と書くこともできて、こちらが良く使われます(NET については「短縮タグ機構」を参照)。
XHTML1.0 も XML ですから、この XML のルールが適用されます。