p要素は最小の節

平成15年8月24日

読点をまたいでの blockquote というのは、アリなのですかね。頭の中では、<p>hoge、<blockquote>hogehoge</blockquote>hoge。</p>こういう感じなのだけれど、これだと文法違反以前の問題として、頭の中で描いたとおりの意味としては解釈されない。で、あるならば、q タグでもって同一段落内に内包させるのが適切な感じもするけれど。強引に<p>hoge、hoge。</p><blockquote>hogehoge</blockquote><p>hoge。</p>こうすると、丸く収まる。けれど、意味付けのために語群を変えるのは本末転倒というか。

「paragraph=段落」ではないのが問題の出発点。p要素はDTDにある通り、HTMLでは最小の節を担当している。だから、ブロックレベル要素を内包できない。Strictなマークアップを好む方々の間でdiv要素が人気を博すのは、リスト関連以外にはdiv要素しか上位の節単位となりうる要素が用意されていないからだ。これはXHTML2.0以前のHTMLにおける致命的欠陥だと私は思う。divには意味が与えられていないことには注意すべきであって、私はdiv抜きでは話が通じなくなるHTML文書はよろしくないと考える。

脱線したので話を戻すと、p要素を日本語でいうところの段落ではなく、最小の節単位とみなせば、別に読点でp要素が終わってしまってもかまわない。

おまけの話、というかHTMLの思想みたいなことについて補足を少々。

HTMLは、文書型を宣言した後は、全部html要素の子要素として各要素が配置される。最終的にかなり深い入れ子構造となることが多いのだけれども、このときHTMLでは、「ブロックレベル要素の兄弟要素はすべてブロックレベル要素となるべきだ」という思想がある。もちろん、さまざまな場合において、文法的にはそうならなくともよいことは周知の事実だ。しかし匿名ブロックという考え方が必要になる理由を考えるとき、根本的にはブロックレベル要素の兄弟はブロックレベル要素でなければならないのは当然のことと感得されるだろう。

もしp要素の中にブロックレベル要素のblockquote要素が入れ子になったとしたら、あえて視覚に訴える説明をするならば、blockquote要素の前後で改行が入ることになるだろう。このときp要素はblockquote要素の前後でブロックが分割される。blockquote要素によって、否応なく2つの匿名ブロックが生じるわけだ。こうしたマークアップされていないブロック要素を放置するのは気持ち悪いので、最小の節単位を意味する要素がほしくなる。

私見を述べるなら、paragraphという英単語には段落という意味も節という意味もあるのだから、p要素の入れ子、さらにp要素へのh1-6要素の内包も認めればよかったのに、と思わずにはいられない。見出しも含むような場合にはsectionと呼ぶべきだ、という意見もあるだろうが、実際には小見出し程度ならparagraphの一部として扱われることも少なくない。あるいは日本語の段落には形式段落と意味段落があって(以下略)。

XHTML2.0ではsection要素が導入されるそうだが、これがなるべく融通の利く仕様となることを願ってやまない。sectionの入れ子は当然アリにしてほしいわけだ。

平成15年9月7日

何でそういう結論になりますか。

この類いの表現は,芸術やら随想やら日記やらならば,著者の心情を表現する手法として問題ないとは思う。しかし,それが正しい文章表記ではないことは知っておかないといけない,と思います。というか,一文章書きとして,知っておいてほしい,と切に祈ります。

p要素を段落と捉えると、小節を表現できなくなります。p要素はブロックレベル要素を内包できませんから。小節は明らかに、インライン要素ではないはずです。要は、文書構造のどのレベルまでブロックレベル要素とみなすかという話ではないのですか。読点で終わるブロックレベル要素なんて許せない、というなら、引用部分はq要素で結構でしょう。表示の都合上、それでは読みにくいというならCSSでdisplay:block;とすればいい。実際、DDTさんはq要素をCSSでブロックレベル要素のように表現していらっしゃる。でも、私はそれはおかしいと思う。

引用部分をブロックレベル要素風に表現した方がわかりやすいのならば、その引用部分はそもそもブロックレベル要素としてマークアップされるべきです。適当な要素が他にないならともかく、引用にはq要素とblockquote要素が用意されているのです。そして、p要素中のインライン要素をdisplay:block;とした場合、その前後に(レンダリングの都合上の)匿名ブロックが生じます。否応なくそうなるわけですが、気持ち悪い話です。何もマークアップされないところに小節が匿名のブロックレベル要素として現出するわけですから。匿名ブロックといえばdiv要素ですが、p要素はもちろんdiv要素も内包できません。

DDTさんがCSSで表現した結果を見れば、DDTさんはq要素で引用している部分をホントはブロックレベル要素にしたかったということがわかるし、CSSで無理にそれを実現してしまったから、結果的にマークアップされない匿名ブロックが登場しています。これはおかしいのではありませんか。

私の主張を整理すると、次のようになります。

  1. p要素がブロックレベル要素を内包できないのは、最小節を明示する要素だから。
  2. DDTさんは読点で段落が終わるのはおかしいと考えていらっしゃるようだが、そもそもp要素は段落を明示するものではない。paragraphには節という意味もあることに注意すべきだ。読点で終わるp要素はおかしい、という感覚は、段落という日本語に引き摺られた錯覚ではないか。
  3. 節という文章ブロックは読点で終わってもよろしい、という考え方がDDTさんのCSSには現れている。q要素をCSSでdisplay:block;としてp要素内にブロックレベル要素と匿名ブロックを作っているが、q要素をblockquote要素とし、その前後をp要素とするのがスジではないのか。

根本的に欠陥があるのはHTMLの仕様です。p要素の下にブロックレベル要素を置けない以上、p要素をどのレベルで用いるかによって、文書構造明示のレベルが規定されてしまいます。p要素の入れ子が認められるか、あるいはブロックレベル要素を内包できネストが可能なリスト以外のテキスト系要素がひとつでも存在すれば、そもそもこんな問題は生じていないでしょう。節は節として、段落は段落としてマークアップすればよいのですから。

平成15年9月7日

形式段落はマークアップできても、複数の形式段落からなる意味段落はマークアップできない、という問題は文章の整理では対処できません。p要素で意味段落をマークアップしたら、形式段落をマークアップできる要素がなくなってしまいます。

平成15年9月7日

引用部分の明示のためには、インライン要素のq要素と、ブロックレベル要素のblockquote要素がちゃんと用意されている。それなのにどちらもdisplay:block;としてしまったら、ソースを見なければ、blockquote要素をclassで分類した場合と区別がつかない。q要素をdisplay:block;するCSSはおかしい。q要素をdisplay:block;するならblockquote要素にすべきで、とするとDDTさんも読点で終わるp要素を検討せざるをえないのではないか。

読点で終わる匿名ブロックはよくて、読点で終わるp要素はダメだという感覚が私には理解できない。

平成15年9月8日

私が最小の節をp要素でマークアップするべきだと考える根拠は、HTML4.01の仕様書にあります。なお私はHTML4.01しかマークアップに用いないので、他の仕様は流し読みしただけで詳しいことは覚えていませんのであしからず。

Certain HTML elements that may appear in BODY are said to be "block-level" while others are "inline" (also known as "text level"). The distinction is founded on several notions:

Content model
Generally, block-level elements may contain inline elements and other block-level elements. Generally, inline elements may contain only data and other inline elements. Inherent in this structural distinction is the idea that block elements create "larger" structures than inline elements.
Formatting
By default, block-level elements are formatted differently than inline elements. Generally, block-level elements begin on new lines, inline elements do not. For information about white space, line breaks, and block formatting, please consult the section on text.
Directionality
For technical reasons involving the [UNICODE] bidirectional text algorithm, block-level and inline elements differ in how they inherit directionality information. For details, see the section on inheritance of text direction.

Style sheets provide the means to specify the rendering of arbitrary elements, including whether an element is rendered as block or inline. In some cases, such as an inline style for list elements, this may be appropriate, but generally speaking, authors are discouraged from overriding the conventional interpretation of HTML elements in this way.

The alteration of the traditional presentation idioms for block level and inline elements also has an impact on the bidirectional text algorithm. See the section on the effect of style sheets on bidirectionality for more information.

ブロックレベル要素とインライン要素の違いは何か? という問いへの回答として、Formattingが現れていることに注意すべきです。デフォルトでブロックレベル要素と行内要素は異なる整形結果を与えられる……その例として唯一挙げられているのが、ブロックレベル要素は新しい行で始まるということなのです。

ここで問題になるのは、デフォルトとは何か? ということです。私は、原稿用紙に手で書く文章を想定すればいいのではないか、と考えます。マークアップ前の手書きのテキストにおいて自然に改行される箇所で(最小単位の)ブロックレベル要素が切り替わる、というのが私の主張です。もちろんそれは、日本語の形式段落とは異なってきます。なぜなら、形式段落は単なる改行では終了しないからです。

もし形式段落を最小のブロックレベル要素(これはDTDからも仕様にある文言から考えても絶対確実なp要素の定義)とするならば、デフォルトでブロックレベル要素とインライン要素がFormattingの区別を与えられる、という条件に反します。一部のインライン要素の直前で改行が行われることになるからです。

p要素は形式段落を意味する、といった説明は仕様の中にありません。形式段落を最小の節と考える人は形式段落をp要素とすればよく、形式段落はいくつかの小節からなると考える私は、読点で終わるp要素を問題としない。自分はどうなんだろう、と悩む人は、HTMLのことはいったん忘れて、紙に手で文章を書いてみればよいのではないか、と思うのです。

ところで、Content modelの説明は興味深いですね。ブロックレベル要素とは、基本的にブロックレベル要素を内包できる要素だといっているわけです。ブロックレベル要素の説明にブロックレベル要素という言葉が入ってしまっている。でも、この文章は直感的には理解できます。そして、p要素はブロックレベル要素の例外として、ブロックレベル要素を内包できない(The P element represents a paragraph. It cannot contain block-level elements (including P itself).)と明記されているわけです。ははぁ、なるほど……と、かつて私は思ったのでした。

平成15年9月8日

小節を明示できないことに何か問題があるのでしょうか。

ありますとも。ブロックレベル要素を内包できないp要素が、単にマークアップされていないというだけの理由で、本来ブロックレベル要素であるべき小節(=デフォルトで改行によって区切られる小節)を内包することは許されません。ですから、p要素=形式段落と考えるのは誤りで、あくまでも最小の節をp要素とみなすべきだと私は主張するのです。

文体のクセによって、人によっては形式段落とp要素はほとんど合致するでしょうが、そうならないケースがたくさんあってもおかしくないはずです。だから、p要素=形式段落と考えてはいけないのです。そもそもW3Cの仕様書を見れば、カンマで終わるp要素こそないものの、日本語の形式段落の発想とは相容れないp要素の異様な小分けが随所に見られます。DDTさんの主張では、こうしたことを説明できないように思われます。

平成15年9月8日

徳保さんの主張が,ブロックレベルの要素はそれ単独で完結している必要はない,というものでしたら問題ありませんが,もしそうでないなら,句点と読点の用法をご確認いただいたほうがいいかも。

W3CのHTML4.01の仕様書に、ブロックレベルの要素はどれも,一つの完結した文として成り立っているものだといった記述は見当たらないようです。

平成15年9月11日

p要素の使い方について、DDTさんとsecurecatさんからご意見をいただいています。

まず、私の主張を再整理。

HTML4.01においてp要素は最小の節を明示する。
<!ELEMENT P - O (%inline;)*            -- paragraph -->

The P element represents a paragraph. It cannot contain block-level elements (including P itself).

HTML4.01の仕様書に、「ブロックレベル要素ごとに文章が完結すべき」との文言はない。

Certain HTML elements that may appear in BODY are said to be "block-level" while others are "inline" (also known as "text level"). The distinction is founded on several notions:

Content model
Generally, block-level elements may contain inline elements and other block-level elements. Generally, inline elements may contain only data and other inline elements. Inherent in this structural distinction is the idea that block elements create "larger" structures than inline elements.
Formatting
By default, block-level elements are formatted differently than inline elements. Generally, block-level elements begin on new lines, inline elements do not. For information about white space, line breaks, and block formatting, please consult the section on text.
Directionality
For technical reasons involving the [UNICODE] bidirectional text algorithm, block-level and inline elements differ in how they inherit directionality information. For details, see the section on inheritance of text direction.

Style sheets provide the means to specify the rendering of arbitrary elements, including whether an element is rendered as block or inline. In some cases, such as an inline style for list elements, this may be appropriate, but generally speaking, authors are discouraged from overriding the conventional interpretation of HTML elements in this way.

The alteration of the traditional presentation idioms for block level and inline elements also has an impact on the bidirectional text algorithm. See the section on the effect of style sheets on bidirectionality for more information.

ブロックレベル要素は、HTMLを考えない場合における「改行」で区切られる。
改行なし
パスカルは、「人間は考える葦である」といった。
<p>パスカルは、<q>人間は考える葦である</q>といった。</p>
このとき形式段落が最小のブロックレベル要素なので、「形式段落=p要素」となる。
改行あり
パスカルは、
「人間は考える葦である」
といった。
<p>パスカルは、</p>
<blockquote><p>人間は考える葦である</p></blockquote>
<p>といった。</p>
このとき形式段落は3つのブロックレベル要素からなるので、「形式段落≠p要素」である。
p要素の用法が最小節の明示に限定されているのは残念。

平成15年9月11日

p要素は最小の節(ブロックレベル要素)を明示する

なので,P要素としてマークアップされたparagraphに,それ以下のレベルで細分できるものがあってもデータ化できません。データ化する必要がないと判断されたのだから,データ化できなくて当然なのです。

私は仕様書を「改行」がブロックレベル要素の境目と解釈しましたから、形式段落が終了していなくとも、「改行」があればp要素は終了するといっているのです。形式段落=p要素としたければ、形式段落の中で「改行」しなければよいわけです。

ちなみに,P要素が明示するのは文節だとした場合,P要素は一つの文節で終わる短文(例えば,「誰だ!」といったようなもの)でなければ,必ず複数のP要素でもって一つの文を形成しなければならなくなります。広辞苑によると,今朝,朝顔が庭に咲きましたという文は4文節から成るそうです。少なくとも私は,そういう使い方をしているHTML文書を見たことはありません。

仕様書に文節云々という話は出てきません。形式段落が云々という話も出てきません。仕様書がブロックレベル要素の定義に自然言語の文法を持ち出さず、改行とか、ブロックレベル要素はブロックレベル要素を内容に持てるといった、直感的かつ曖昧な定義をしていることに私は注目したいのです。

マークアップ前のテキストをブロックレベル要素に切り分ける方法

表示方法によって文章の内容が変わるわけではない,って話しは先にも書きました[see 段落の表示]が,ブロックレベル要素とは何かを検討する上での材料の一つとしての提示と考えてよいでしょうか。

ブロックレベル要素、という考え方は、HTMLでマークアップするときにはじめて登場します。マークアップ前の文章を書く段階では、意識されないはずです。しかし、もともとテキストが持っている要素をマークアップにより明示していくものがHTMLであるならば、もとのテキストにそもそもブロックレベル要素とインライン要素の区別が存在するはずです。したがって私は、もとのテキストにおいて「改行」によって分けられた小節が、ブロックレベル要素であろう、といっているのです。

改行は形式段落の終了を意味しない

徳保さんは形式段落は単なる改行では終了しないとおっしゃいます。しかし,小学校では,段落(形式段落)は改行で表現する,って教えてますよね。日本の手書きの一般的な表現では,改行は形式段落だと思うンです。

会話文、あるいは文章中への図表や数式の挿入など、形式段落の中で改行されるケースは多々あります。日本語においても、「改行=形式段落の区切り」ではありません。私は小学校で、そう習いました。

例1
3(x+y)=2(2x+y) ……式(10)
式(10)の両辺を展開すると、
3x+3y=4x+2y ……式(11)
式(11)の両辺を整理して、
x=y ……式(12)
よってxとyが等しいことが示された。

ちょっとぎこちない日本語ですけれども、このような文章は、技術系の本にはよく出てきます。わかりやすいように読点で改行する例を示しましたが、句点で改行しても、そこで形式段落が切り替わっていると考える人はまずいないでしょう。形式段落が変わるから改行しているわけではなく、数式の前だから改行しているのだ、と解釈するのが妥当だからです。

W3Cはどのようにマークアップしているか

HTML4.01の仕様書そのものをみると、読点で終わるp要素こそ存在しないものの、話に区切りがついていないのにp要素が終了する例が頻出しています。

例2
<p>**を**すると次のようになるであろう。</p>
<p><img></p>

ここでimg要素はインライン要素なのだから、

例3
<p>**を**すると、<img>のようになるであろう。</p>

とすればp要素はひとつで足ります。また、

例4
<p>**を**すると、</p>
<p><img></p>
<p>のようになるであろう。</p>

というように、p要素が3つになってもおかしくはないでしょう。なお、例3と例4の違いは、マークアップ前の文章がどのように「改行」されているか(=どのようにブロックレベル要素が切り分けられているか)によっています。

例3のマークアップ前の状態
**を**すると、図版のようになるであろう。
例4のマークアップ前の状態
**を**すると、
図版
のようになるであろう。

形式段落

例2~4はすべて、ひとつの形式段落を様々にマークアップしたものとみなすのが妥当でしょう。図版が単独で形式段落となるなど、ふつうは考えられないことです。さらに、次の例をご覧下さい。

例5
3(x+y)=2(2x+y) ……式(10)
式(10)の両辺を展開すると、式(11)となる。
3x+3y=4x+2y ……式(11)
式(11)の両辺を整理して、式(12)を得る。
x=y ……式(12)
よってxとyが等しいことが示された。

この文章をHTML4.01仕様書風にマークアップすれば、

例6
<p>3(x+y)=2(2x+y) ……式(10)</p>
<p>式(10)の両辺を展開すると、式(11)となる。</p>
<p>3x+3y=4x+2y ……式(11)</p>
<p>式(11)の両辺を整理して、式(12)を得る。</p>
<p>x=y ……式(12)</p>
<p>よってxとyが等しいことが示された。</p>

となるのですが、これを6つの形式段落からなる文章と考える方は少数派なのではありませんか。

p要素が明示しているのは、やはり形式段落ではなく最小のブロックレベル要素でしょう。そして、そのブロックレベル要素の区切りは、マークアップ前の文章において「改行」される箇所を基準としているように見えます。

読点で終わるp要素

例1と例5はほぼ同じ内容の文章なのだから、W3Cが例5を例6のようにマークアップするのなら、例1を、

例7
<p>3(x+y)=2(2x+y) ……式(10)</p>
<p>式(10)の両辺を展開すると、</p>
<p>3x+3y=4x+2y ……式(11)</p>
<p>式(11)の両辺を整理して、</p>
<p>x=y ……式(12)</p>
<p>よってxとyが等しいことが示された。</p>

とマークアップしてもおかしくない……と思うかどうかが問題なんですよね。

ブロックレベル要素は文章として完結しているべき、なのか?

例8
一つ、人の世、生き血をすすり、
二つ、不埒な悪行三昧、
三つ、醜い浮世の鬼を、
退治してくれよう、桃太郎!
<ol>
<li>一つ、人の世、生き血をすすり、</li>
<li>二つ、不埒な悪行三昧、</li>
<li>三つ、醜い浮世の鬼を、</li>
</ol>
<p>退治してくれよう、桃太郎!</p>

例8のようなマークアップもOKだと私は思います。読点で終わる場合があるブロックレベル要素は、p要素だけではありません。

ここから類推したとき,ブロックレベルの要素について,P要素以外はそれ自体で完結するが,P要素だけはそれ自体では完結しない,若しくは,完結しなくても良い,とするのは不合理だと考えます。テキストレベルの要素と対比してブロックレベルの要素を定義する必然性がありませんから。

p要素以外のブロックレベル要素はみな文章が自己完結している、というDDTさんの前提条件は成立しません。だからDDTさんの主張の前半部は、私には納得できません。後半は既に反論した通りで、HTML4.01におけるブロックレベル要素の定義を「マークアップ前の文章において改行で区切られる節」とする私の解釈を否定するには、根拠が薄いと思います。

余談

ときどき、見出しが本文と文章的につながっているケースにも出くわしますが、これはまたちょっと違う問題のような気がします。

例9
<h3>友人に突然猫を預けられて</h3>
<p>正直、困ってしまった。じつは私、猫アレルギーなのです。</p>

p要素にブロックレベル要素を内包させたい理由

最小の節をp要素としてしまうと、形式段落を確実にマークアップすることができません。実際、HTML4.01仕様書は、形式段落をマークアップしていません(もちろんそれは英語の文書だからなのですが、日本語訳でも形式段落がちゃんとマークアップされていないことに注意すべき)。

もちろん、内容を読んでいけば形式段落の境目は理解できます。だから、なくてもいいといえばいいのです。とはいうものの、リストが様々なブロックレベル要素を子要素に持てるこのご時世に、形式段落や意味段落にあたる要素がないのは手落ちではないのか、と。

というか,これまではそういう表現をしようとしたとき,例えば一つの文の中に引用文を入れようとしたとき,徳保さんの主張では引用文の前でP要素が途切れ,BLOCKQUOTE要素が現れ,そのあとにP要素が新たに始まってよいことになります。具体的には次のとおり。

<p>hoge</p>
<blockquote>hogehoge</blockquote>
<p>hoge</p>

しかし,同じものをxHTML2.0でマークアップすると,P要素が途切れることがありません。

<p>hoge
<blockquote>hogehoge</blockquote>
hoge</p>

ん~、そうではなくてですね、

<p>
<p>hoge</p>
<blockquote>hogehoge</blockquote>
<p>hoge</p>
</p>

こうできたらいいな、と。私見を述べるなら(というか私見しか述べていないわけですが、まあ一応)、匿名ブロックは好きじゃないのです。だから、最小の節をしっかりp要素でマークアップしよう、といっているわけです。組み立てた理屈とは順番が違うのですが、発想の根本にあったのは、そういう気持ちなんですね。

ところで、p要素が、

という3つの意味を持つのはよろしくないということであれば、テキスト系に新しい要素が追加されてもいいと思う。

P要素そのものの性質が変わったわけではない(HTML4.01でもxHTML2.0でも"paragraph"をマークアップすることに変わらない)のに,マークアップ結果が変わるってのは,おかしいと思いますが。

いや、そうではありません。paragraphは「段落」「節」の2通りに訳せます。現在のp要素はなぜか「最小の節」だけを担当していますが、それを字義通りに「段落」も担当させるためには、ブロックレベル要素の内包を認めなければ不都合があるわけです。(注:この不都合から逆算して、W3Cは「最小の節=段落」と考えている、という意見もありえます。でもそうなると、日本語とは非常に相性が悪いことになるし、そもそも英語との親和性にも疑問符がつきます。ただ、なぜHTML2.0でbr要素が登場したのかということを考えるならば、W3Cが「最小の節=段落」と考えていたとしてもおかしくはないかもしれません。それでも、英文においても段落にリストや表が内包される例があり、やっぱり「最小の節=段落」説はヘンだと私は思いますが)

私の考えは次のとおり。そもそもP要素の中にブロックレベル要素を含むのは文法としておかしい。だからこれまでのHTMLではそういう仕様だった。しかし,言葉の乱れにより文法にそぐわない表現方法も増えたため,時代の流れには逆らえず,そういう表現もマークアップ出来るようにHTMLが進化した。今までの主張とも矛盾はないと思います。

やはり、前提条件から反論したい。日本語では、句点で終わって改行しても形式段落が終了するとは限りません。会話文は最も出現頻度が高い例ですが、他にも形式段落の中に箇条書きが内包されるケース、形式段落の途中で(一文の途中とはいっていないことに注意)表が挿入されるケース、引用文が挿入されるケースなどがあります。形式段落とは非常に柔軟かつ曖昧な単位であって、そもそもp要素の仕様とは定義が一致しません。p要素はリストも表も内包できないのですから。

当初より述べているように、p要素を形式段落を明示する要素とみなすことが根本的な誤りなのではないかと。p要素に科せられたギチギチの制約は、p要素が形式段落でないことを如実にあらわしています。だからp要素は最小の節を明示する要素と考える方が自然であり、とするとp要素は読点で終わっても問題ではないわけです。読点で改行される文章は、世の中にいくらでもあるわけですから。

余談

青空文庫を考えれば明らかなように、マークアップにどれほど悩むとしても、文章に手を入れることはできないというケースは想定されるのであって、基本的に文体はHTMLの仕様から超越しているべきだと私は思います。

Information