HTMLにおける「段落」をめぐって

HTML文書での段落の表現について、混乱し た議論や解説が少なからず見受けられる。この小文では、 HTMLの仕様で定義されるP要素と、日本語文の 段落に関したことを扱う。

HTMLではP要素がparagraphを表す

HTMLにおいてparagraphを表す要素はP要素であって、それ以 外には無い。これは疑う余地のない事実である。

paragraphと段落

段落 = paragraph

英語の "paragraph" に対応する日本 語は「段落」である、ということにすると何かと都合が良い。ただ し、「段落」は "paragraph" の訳語とし ては必ずしも適当とは言えず、敢えて「段落」と言わずに「パラグ ラフ」という言い方がなされることもある。しかしながら、paragraphの意味で「段落」という言葉を用いる のは一般の国語辞典にも見ることができ、ほかに適当な言葉が見当 たらないことから、ここでは「段落」を採用する。

段落 (= paragraph) は、一つ以上の 文の集まりであり、一つのまとまった内容を表す単位である。現在 のまともな文章作法の本ではそのように説明されているはずである。

段落の視覚的な表現方法は様々である。日本語の文書では最初 の行を1文字下げることで表すことが多い。欧文でもやはり先頭の 行の字下げで表現することが多いが、字下げの量が1文字分とは限 らない。改行しても全く字下げしないこともある (この体裁は、日 本の雑誌でも、比較的短めのリード文などに用いられることがしば しばある)。字下げが無い代わりに、段落間に間隔を空けることで 段落を見やすくすることもある。また、節の最初の段落についての み字下げを行わないというやり方もある。

ウェブブラウザでは、段落間に1行程度の間隔を空け、字下げを 行わない表示が多い。これはコンピュータのplain textでよくある書き方であり、文字端末 では読みやすい。また、ウェブの一大ブームの発端となったNCSA Mosaicもこの流儀で段落を表示した。以来 ウェブブラウザは、固執しているとも見えるほどにこの形式を踏襲 している。

しかしこれはHTMLのP要素が「1行空き」す るものであることを意味するものでは、もとよりない。 HTML 4.0の仕様書では、段落の整形はブラウ ザやスタイルシートによって変わることを、わざわざ独立した節を 設けて解説している (仕様書9.3.5)。

「日本語文の段落はBR」は本当か

日本語の文章における段落はP要素でなくBR要素 (line break) で表される、という主張が時折見 受けられる。だが、その場合の「段落」とは一体何なのだろうか? その「段落」で改行しなければならないとして、改行という視覚的 効果に訴える理由は何だろうか。

BR要素で表されるというその「段落」がparagraphのことでないと仮定してみよう。何に せよその「段落」は文の集まりを二つに分けるわけである。分けら れたそれぞれはやはり文の集まりである。なぜ分けるかというと、 文章を構成する上での必然性からそうするのが自然である (意味も 無く「ちょっと長くなったから、なんとなく」分けられたのでは、 読み手はたまったものではない)。するとここで、BR要素をはさん だ両側に、意味的にまとまりのあるいくつかの文の集まり――すな わちparagraphが現れることになる。結果 的に、BRで分けたりするよりは、分けられるそれぞれをP要素で表 すのが適切であるということになる。

また、文書をデータとして見ると、BR要素のような「区切り」 を使って文章のかたまりをいくつかの部分に分けるよりは、分けら れるそれぞれを一つの単位 (要素) として扱えた方が便利である。 例えば、スタイルシートで表示方法を決めるときには、段落が空要 素で区切られているだけだと、柔軟な表現はほとんど望めない。そ うでなく、段落自体が一つの要素として表されていれば、先頭の行 の字下げ、上下の余白、背景色、等々を自由に設定することができ る。

以上簡単に見たように、段落をBR要素で表すのは不適当である。 段落はP要素で表す。

タグの省略とP要素

P要素はそれ自体で一つの段落 (= paragraph) 全体を表す。 HTML 2.0以前の古い仕様では、P要素は空要素 として定義され、段落の区切りを表したこともあったよ うだが、そうした事情は現在全く気にする必要のないことである。 つまり、一つの段落はP要素の開始タグ (<P>) から始まり、終了タグ (</P>) で終わる。

ただし、P要素の終了タグは省略することもできる。なぜなら、 省略しても要素の終了が曖昧なく判定できるからである。例えば次 の二つの例は等価である。

  1. <P>段落1</P><P>段落2</P>
  2. <P>段落1<P>段落2</P>

どちらの例にも、P要素が二つあり、一つ目のP要素の内容は 「段落1」、二つ目のP要素の内容は「段落2」である。後者の例で は、二つ目の <P> が現れたときに、最初のP 要素の終了が分かる。P要素の中に別のP要素が入ることはできない からである。

また、親要素の終了タグがあるときにもタグを省略できる。次 の例のような場合である。

<BLOCKQUOTE><P>引用文</BLOCKQUOTE>

要素がオーバーラップすることはできないから、親要素 (BLOCKQUOTE) の終わりはP要素の終了をも意味する。

以上から分かるように、「</P> を書くの が正しくて、書かないのは間違い」ということはない。書かなかっ たとしても、P要素の中に入り得ない要素の開始タグ、ないしは親 要素の終了タグが現れた時点で、P要素は自動的に終わる。なお、P 要素の終了タグが省略できるのは、DTDでそのように定 義されているからであり、どんな要素のタグでも省略できるわけで はない。

終了タグを省略したときのブラウザの挙動

ところがここで、P要素の終了タグを書いた場合と省略した場合 とで、文書の整形結果に違いが出るブラウザがある。

タグの省略は、タグを書いても書かなくても同じだからこそ許 されているのであるから、省略できるタグの有無が整形結果に影響 を及ぼすべきではない。HTML 4.0の仕様書で はこの点についてもわざわざ断っている。(以下、 仕様書4.1節から引用)

A user agent must ensure that rendering is unchanged by the presence or absence of start tags and end tags when the HTML DTD indicates that these are optional.

つまり、</P> の有無によって表示結果が 変わるブラウザは、HTML 4.0に適合しないの である。

それでは、ウェブブラウザをテストしてみよう。次のような文 書をブラウザに整形させる。「定義文2」の末尾で </P> が省略されていることに注目されたい。 正しく作られたブラウザなら、このタグはあっても無くても整形結 果に影響しないはずである。

<dl>
  <dt>定義語1</dt>
      <dd><p>定義文1</p></dd>
  <dt>定義語2</dt>
      <dd><p>定義文2</dd>
  <dt>定義語3</dt>
      <dd><p>定義文3</p></dd>
</dl>

整形結果の画像として、Internet Explorer 4.0の表示Lynx 2.8の表示とを用意した ので御覧戴きたい (使用したブラウザは両方ともWindows用のもの)。 IE4の表示では、「定義文2」(Pの終了タグを省略し たとき) の後の余白が、他の定義文のものと異なってしまっている。 一方、Lynxの表示では、タグを書いたときも省略したときも同じよ うに表示されている。もうお分かりのことと思うが、Lynxの表示は 適切であり、IE4の表示は誤りである。

なお、上の例文の完全なファイ ルを用意したので、読者がお使いのブラウザでどのように表示 されるか試してみることができる。

さらにまた、スタイルシート (CSS) を使った文書で </P> を省略するとそれ以降の表示がおかしく なる (どうやら text-indent に悪影響が出るらしい) ことのあるNetscape Navigator 4.0というブラウザもあるが、この ようなものは論外である。1日も早くバグが取り除かれることを願 う。

P要素は文章を書く上で最も基本的な要素である。ウェブブラウ ザには、P要素まわりの不備は是非とも無くしてもらいたいもので ある。

(この項は、1998年8月19日に、高橋征義氏の御提 案によって付け加えられた。ただし内容に誤りがあればそれは私一 人の責任である)

P要素の内容モデル

P要素の中にはいわゆるブロック要素 (P要素、UL要素、PRE要素、 BLOCKQUOTE要素等) を含むことはできず、行内要素 (EM要素、 STRONG要素、Q要素等) のみが入ることができる。

しばしば間違われるのは、ブロック要素であるリスト (UL要素 等) をP要素の中に入れようとすることである。これは HTMLの文書構造では許されていない。 DTDで許 されていない以上、それに従うよりない。どうしようもないことで ある。

ここで、DIV要素を持ち出して、段落であることを示す文字列を CLASS属性に指定することで、擬似的に「ブロック要素が入る段落」 のようなものを作ることができるとの主張がある。

しかし、CLASS属性に何を指定しようとDIV要素はDIV要素でしか ない。DIV要素は特に意味を持たない要素であって、段落という意 味が与えられているわけではない。よって、DIV要素で段落の代わ りにすることはできない。段落を意味する要素としてP要素が既に 定義されているにもかかわらずDIVを段落のつもりで用いるのは混 乱の元であり、好ましくない。

もし強引に「このDIVは段落である」と言い張ってみても、HTML 文書を処理するプログラムはそれを関知しない。それはあくまでそ の文書の書き手が設けた個人的なルールでしかないからである。あ る人は CLASS="paragraph" という指定で段落を表す かもしれないし、別の人は CLASS="para" という属 性指定をするかもしれない。恣意的なマーク付けに頼るのであれば、 共通のDTDを使うことの意義はほとんど失われ てしまうと言ってよい。

もっとも、単に表示できれば良いというのであれば、DIV要素を 使うのもあり得ない選択ではない。しかしそれは、BLOCKQUOTE要素 を字下げの目的に使うのとさほど大きな違いはない。

このようにHTMLの段落の中にUL要素等を入れるのは基本的に無 理だが、しかし実際に段落の中に箇条書きを含む文章があるのだか ら、それに従ってマーク付けしたい、という欲求は少なからずある と思われる。

新たに文章を書くのであればDTDに沿った 形にマーク付けしていけば良いだけだが、既存の文書をマーク付け するときには、「段落の中のリスト」のように、マーク付けしたい 文書の構造がどう考えてもDTDに合わないので 困るという問題が生じる。用途を詳しく分析した上で DTDを設計すれば、そのようなことはあまり起 きない (かもしれない)。しかし、HTMLのよう に一つのDTDを様々なタイプの文書に用いるの では、この種の不都合は避け難い。

1998年6月9日 初版公開, 1998年8月19日 最終更新
矢野啓介 <yano@moon.email.ne.jp>