[1]
[[HTML]] で採用されている[DFN[[RUBYB[表モデル] @en[table model]]]]について。
[2]
[[HTML]] の[[表]]には、[DFN[単純表モデル]]と[DFN[複雑表モデル]]の2種類があります。
いずれも、[[表]]、すなわち[[二次元配列]]状に整理されたデータを記述する基本的能力を備えていますが、
複雑表モデルでは[[行]]と[[列]]をそれぞれ[[群]]化できます。
[[HTML 4]] は、複雑表モデルを採用しています。
[[XHTML Basic]] は、単純表モデルを採用しています。
;;
[[XHTML m12n]] では単純表用モジュールと複雑表用モジュールの両方が用意されています。
[3] '''[[HTML]] [[表]]モデルの構成要素'''
,名前 ,要素型名 ,単純表 ,複雑表 ,説明
,[[表]] ,[CODE(HTMLe)@en[[[table]]]] ,○ ,○[[二次元配列]]全体
,[[表題]] ,[CODE(HTMLe)@en[[[caption]]]] ,○ ,○ ,[[表]]の[[見出し]] ([[表]]に1つ以下)
,[[行]] ,[CODE(HTMLe)@en[[[tr]]]] ,○ ,○ ,
,[[行群]] ([[頭部]]) ,[CODE(HTMLe)@en[[[thead]]]] ,× ,○ ,[[見出し]]とみなせる[[行]]の[[群]] ([[表]]に1つ以下)
,[[行群]] ([[本体]]) ,[CODE(HTMLe)@en[[[tbody]]]] ,× (明示できない) ,○ ,[[本体]]とみなせる[[行]]の[[群]] ([[表]]に1つ以上)
,[[行群]] ([[脚部]]) ,[CODE(HTMLe)@en[[[tfoot]]]] ,× ,○ ,[[尾部]]とみなせる[[行]]の[[群]] ([[表]]に1つ以下)
,[[列]] ,[CODE(HTMLe)@en[[[col]]]] ,× (明示できない) ,○ ,
,[[列群]] ,[CODE(HTMLe)@en[[[colgroup]]]] ,× ,○ ,[[列]]の[[群]]
,[[こま]] ([[見出し]]) ,[CODE(HTMLe)@en[[[th]]]] ,○ ,○ ,[[行]]と[[列]]で指定される[[見出し]]
,[[こま]] ([[本体]]) ,[CODE(HTMLe)@en[[[td]]]] ,○ ,○ ,[[行]]と[[列]]で指定されるデータ ([[本体]])
[[#comment]]
** 設計について
[25] HTML 表模型の設計に関する解説が HTML 4 B.5.1 にあります。
;; [CSECTION@en[B.5 Notes on tables]]
それによれば、 HTML 表模型は、
- 次のものの研究から発展しています。
-- SGML 表模型
-- [RUBY[文書処理器] [ワープロ]]での表の扱い
-- 雑誌、書籍、その他紙媒体での様々な表配置技術
- 単純な表は単純に、必要なら複雑な表も扱えるように設計されました。
-- 常用の文章編集器で HTML の表をマークできます。
-- [[学習曲線]]が緩くなります。
- [[こま]]の連結や揃えなどの表現特性のこま群への関連付けは他の文書書式からの変換や
[[WYSIWTG]] 編集器での作成と相性が良いよう考慮しています。
[26] '''動的再書式付け''' [SRC[HTML 4 B.5.1.1]]。
HTML 表模型では、表の大きさや[[フォント]]などについて著者が制御しません。
ですから、列幅を絶対[[画素]]単位指定に依存するのは危険です。
よって、表は窓やフォントの大きさに合わせて動的に大きさを変更できなければなりません。
著者は列の相対幅のヒントを提供できますが、
利用者エージェントはこまの内容で一番幅の広い要素をレンダリングできる広さを確保するべきです。
著者の指定を上書きする時には、各列の相対幅が極端に変わることは避けるべきです。
[27] '''漸次表示''' [SRC[HTML 4 B.5.1.2]]。
表が大きな時やネットワーク接続が遅い時は、表を徐々に表示するのが利用者的にはよろしいです。
利用者エージェントは表のすべてのデータを受信する前に表示開始できるべきです。
著者は、漸次表示のためのヒントとして、列の数や表・各列の幅を指定できます。
[WEAK[(表の幅は既定値が [CODE(HTML)[100%]] で、列の幅の既定値は均分した値です。いずれも [CODE(HTMLe)[[[table]]]] 要素や [CODE(HTMLe)[[[col]]]] 要素の [CODE(HTMLa)[[[width]]]] 属性で上書きできます。)]]
列の数は、最初の行が到着するのを待てば良いと提案した人もいましたが、
最初の行の内容が多ければ時間がかかります。ですから、
漸次表示のためには著者が列数を明示する必要があります。
著者は漸次表示モードにするか、こま内容にあわせて幅を決定するモード
(2パス自動幅決定モード) にするかも知らせる必要があります。
前者は [CODE(HTMLe)[col]] 要素や [CODE(HTMLe)[[[colgroup]]]] 要素で列数を明示します。
後者は1パス目で UA が列数を決定します。
[28] '''構造と表現''' [SRC[HTML 4 B.5.1.3]]。
[[Stricter]] 的にはこま内の文章の揃え位置やこま間の境界線はレンダリングの問題で、
構造の話ではありません。ですが、このような特徴は (ある応用から別の応用へと)
非常に可搬ですから、構造情報とまとめておくと便利です。 HTML
表模型はほとんどのレンダリング情報をスタイル・シートに任せていますが、
必ず使わないといけないわけではありません。
現在の [[DTP]] ソフトウェアは表のレンダリングを極めて多様に制御できますが、
HTML でそれをやると [[RTF]] や [[MIF]] のようにでかくなってしまうので非現実的です。
HTML はそうせずに、よく使われる線種から著者が選ぶ能力程度を提供しています。
それ以上の制御はスタイル・シートで行えます。
開発の過程で表罫パターン指定方法が色々検討されました。
辺の加減算ができるようにすると算法が比較的複雑になります。
[WEAK[(例えば、すべての表の要素に [CODE(HTMLa)[[[frame]]]] や [CODE(HTMLa)[[[rules]]]] を持たせると、あるこまのある辺の罫線の決定に24段階程度も必要になります。)]]
それだけしても需要を完全に満たすことはできませんから、
単純で直感的でほとんどの目的に十分な程度に抑えてあります。
より複雑な方法を標準化する際には更に実験が必要です。
[29] '''行群・列群''' [SRC[HTML 4 B.5.1.4]]。
HTML では、 [[CALS]] 表模型に倣い、表の列を頭・体・足に分類できます。
こうすることでレンダリング情報の表現が簡単になりますし、
頁境界をまたぐ表で頭や足を反復させられますし、
体だけ scroll 可能にすることもできます。 [CODE(HTMLe)[[[tfoot]]]] は
[CODE(HTMLe)[[[thead]]]] の前に置くので、
表全体を処理するのを待たずレンダリングできます。
[30] '''アクセス可能性''' [SRC[HTML 4 B.5.1.5]]。
HTML 表模型は、こまを名札付けできますから、
高品質な文章を生成できます。データベースや表計算との輸出入の自動化にも使えます。
[[#comment]]
*** HTML 表モデルの限界
[4]
'''非正方形的連結'''
[[HTML]] の[[表モデル]]は、1つの[[こま]]に連結する場合、
連結[[行]]数を [CODE(HTMLa)@en[[[rowspan]]]] [[属性]]、
連結[[列]]数を [CODE(HTMLa)@en[[[colspan]]]] [[属性]]で指定しますが、
このために
[PRE(example aafig)[
+-----+-----+-----+
| and | 0 | 1 |
+-----+-----+-----+
| 0 | 0 |
+-----+ +-----+
| 1 | | 1 |
+-----+-----+-----+
]PRE]
のような[[表]]を表すことはできません。
;; [[枠線]]の表示を変えればこのように''見える''表を作ることはできますが、
あくまでそう''見える''に過ぎません。
[5]
'''入れ子の群'''
[[行群]]や[[列群]]が入れ子になった関係を表すことができません。
例えば、
[PRE(example aafig)[
--------------------
中部 東海 静岡
愛知
岐阜
三重
--------------
北陸 富山
石川
福井
--------------------
近畿 滋賀
京都
奈良
和歌山
大阪
兵庫
--------------------
]PRE]
のような構造を ([CODE(HTMLe)@en[[[tbody]]]] を入れ子にするなどして)
記述することはできません。
;; 一応 [[HTML 4]] 的には [CODE(HTMLe)@en[[[axis]]]]
[[属性]]が用意されてはいますが・・・。
[6]
'''こまの細分'''
[[こま]]内に更に[[表]]の一部と考えられる構造が存在し得ますが、
[[HTML]] の[[表モデル]]ではそれを記述できません。
例えば、[[行]]と[[列]]の[[見出し]]に対する[[見出し]][[こま]]
(次例の左上の[[こま]]) のような表現は極めてよく見られますが、
[[HTML]] では表せません。
[PRE(example aafig)[
+---+----+----+----+
|\年| | | |
| \ | 01 | 02 | 03 |
|市\| | | |
+---+----+----+----+
|津 | 32 | 42 | 42 |
+---+----+----+----+
|呉 | 55 | 32 | 32 |
+---+----+----+----+
]PRE]
[PRE(example aafig)[
+---+----+----+----+
| | 1 | 2 | 3 |
+---+----+----+----+
| A | 3/ | 5/ | 2/ |
| |/ 3|/ 8|/ 10|
+---+----+----+----+
| B | 5/ | 1/ | 9/ |
| |/ 5|/ 6|/ 15|
+---+----+----+----+
]PRE]
その回の得点と累計点を並べたこのような[[表]]も、 [[HTML]]
では表せません。
;; [CODE(HTMLe)@en[[[td]]]] 内に適当な[[要素型]]の[[要素]]を使って記述することもできますが、
この例の場合[[こま]]内の構造も含めて[[表]]の構造であると考えた方が自然ですから、
そのことを記述できる方法がある方が好ましいと思われます。
[7]
'''頭・脚的列群'''
[[行群]]には頭・体・足の別があるのに、[[列群]]は一種類しかありません。
[[表]]は [WEAK[(少なくてもこの点では)]]
本来[[行]]方向と[[列]]方向で対称的なはずですが、 [[HTML]]
ではその区別を記述できません。
[8]
'''表題以外の付加情報'''
[CODE(HTMLe)@en[[[table]]]] [[要素]]内には、
狭義の[[表]]の他に[[表題]] ([CODE(HTMLe)@en[[[caption]]]])
を含めることができますが、その他の物は [[HTML]]
の[[内容モデル]]では含められません。
例えば[[表題]]と共に短い説明が加えられていたり、
[[表]]のデータや項目に関する補足説明が配置されていたりすることがありますが、
[[HTML]] ではこれを明確に記述することができません。
;; [CODE(HTMLe)@en[[[table]]]] [[要素]]の外に記述することはもちろんできますが、
[[表題]]が [CODE(HTMLe)@en[[[table]]]] に含まれるのに、
[[表題]]以外の付属情報が含められないのは、
現在の仕様の制約以上の理由がありません。
[34]
[CITE@en[HTML tables: Why not column based tables in addition to row based tables?]] ([[tenacious-techhunter@comcast.net]] 著, [CODE[2007-10-02 07:53:55 +09:00]] 版)
([[名無しさん]])
[[#comment]]
* 歴史
[21]
,1993年3月28日 , ,仕様案 ,おそらく最初の提案
,1993年6月24日 , ,仕様案 ,HTML+ DTD
,1993年7月13日 , ,仕様案 ,HTML+ DTD (この頃、ブロック水準要素がこま内容に認められる)
,1993年9月10日 , ,仕様案 ,HTML+ ([CODE(HTMLe)[tbl]] から [CODE(HTMLe)[table]] に改名)
,1993年9月 , ,実装 ,(この頃、 NCSA (Mosaic) や SoftQuad (HoTMetaL PRO) で実装実験)
,1993年11月8日 ,単純表 ,仕様案 ,HTML+ Discussion Document
,1994年1月5日 ,単純表 ,仕様案 ,HTML+ DTD (この頃、 [CODE(HTMLe)[tr]] が包含子に)
,1994年12月20日 ,単純表 ,実装 ,[[NCSA Mosaic]] 2.0 Alpha 8 [SRC[>>23]]
,1995年3月28日 ,単純表 ,仕様案 ,[[HTML 3.0]] [[I-D]] 00
,1995年4月 ,単純表 ,実装 ,[[NN]] 1.1
,1995年7月7日 ,複雑表 ,仕様案 ,html-tables I-D 00 (後の RFC 1942)
,1995年8月 ,単純表 ,実装 ,とりあえず実装した [[WinIE]] 1.0
,1995年10月 ,単純表 ,実装 ,[[WinIE 2.0]]b 本格実装
,1996年1月23日 ,複雑表 ,仕様案 ,WD-tables [CITE[The HTML3 Table Model]] (後の RFC 1942)
,1996年5月5日 ,単純表 ,仕様案 ,[[HTML 3.2]] Draft
,1996年5月 ,複雑表 ,実装 ,[[WinIE 3.0]]a1
,1996年3月 ,複雑表 ,仕様 ,[[RFC 1942]] [CITE[HTML Tables]]
,1996年12月 ,単純表 ,実装 ,[[Opera]] 2.1
,1997年1月14日 ,単純表 ,仕様 ,HTML 3.2 勧告 (最終版)
,1997年12月 ,複雑表 ,仕様 ,[[HTML 4.0]] [ABBR[FE] [第1版]] 勧告
,1998年7月20日 ,単純表 ,実装 ,[[w3m]] の最初の表実装
, ,複雑表 ,実装 ,[[Mozilla]] ([[Gecko]])
,2000年1月 ,複雑表 ,実装 ,Opera 4.0
,2001年4月10日 ,複雑表・単純表 ,仕様 ,[[XHTML m12n]] 1.0 [ABBR[FE] [第1版]] 勧告
,@@ ?? ,複雑表 ,仕様 ,[[HTML5]] で表系要素が規定される
,@@ ?? ,複雑表 ,仕様 ,[[HTML5]] 見出しこま算法が改訂される
,@@ ?? ,複雑表 ,仕様 ,[[HTML5]] 見出しこま算法が改訂される
,2009年2月 ,複雑表 ,仕様 ,[[HTML5]] で表系要素のレンダリングが規定される
[39] 参考:
** HTML 表モデルの成立
[23] [CITE[NCSA Mosaic History]]
[7] [CODE(HTMLe)[table]] を最初に実装したのは [[NN]] だと思ってる人は多いけど、
実はそうじゃないんだなぁ。
;; 確かに普及させたのは [[NN]] ですが。
[22] [[www-talk]] では、1993年3月に [[HTML]]
に[[表]]機能を追加することが提案されています。
;;
[CITE@en[EMail Msg <199303280705.AA25536@kauri.vuw.ac.nz>]]
[[Dave Raggett]] は [[LaTeX]] や [[tbl]] (なに?) や [[Microsoft Word]]
を検討しつつ、 L[SUP[A]]T[SUB[E]]X 染みた[[表]]モデルを提案しています。
;;
[CITE@en[EMail Msg <9303311205.AA22020@manuel.hpl.hp.com>]]
その後半年にわたる議論の末、 [[CALS]]・[[ICADD]]
風の[[表]]モデルが採用されました。
[24] [[NCSA Mosaic]] 2.0 で[[表]]がちゃんと実装されているとしたら、
[[WinIE 1.0]] の酷い実装ぶりは何なのかということになりますが、
[[NCSA Mosaic]] 2.0 の[[表]]の実装はどのような感じなのでしょうか?
[WEAK[あるいはその期間の他の [[mosaic]] variant はどうなのでしょう?]]
[31]
[CITE[Chapter 2]] ([CODE[1998-05-20 00:22:16 +09:00]] 版)
([[名無しさん]])
[32]
[CITE[HTML: Table Deployment Strategy]] ([CODE[1995-10-18 14:13:35 +09:00]] 版)
([[名無しさん]])
[33]
>>32
>
:Toward Graceful Deployment of Tables in HTML March 1995, Unpublished:A strategy for gracefully introducing tables into the web using HTTP format negotiation. (revised Oct 1995)
;; [CITE[HTML Specs, Drafts, and Reports]] ([CODE[2000-06-20 03:02:20 +09:00]] 版)
**
@@ ・・・
** HTML5
[40] [[HTML5]] では [[HTML]]・[[HTML DOM]] の様々な機能の[[意味論]]的・[[処理モデル]]的明確化がはかられていますが、
[[HTML表モデル]]も例外ではありません。これまでおおよそ自明と思われたのか十分明確に規定されていなかった[RUBYB[表の形成]@en[form a table]]
([[表]]に含まれる[[行]]や[[列]]や、[[こま]]のそれらへの所属などの確定) が[[算法]]の形で厳密に定義されたり、
[[見出しこま]]の適用対象を[[発見論]]的方法も取り入れつつやはり[[算法]]として定義したりしています。
[41] また、[[HTML4]] までに導入されたものの十分な運用・実装実績のない機能や、もっぱら[[表]]の見た目に関する機能は削除されています。
前者の例としては [CODE(HTMLa)@en[[[abbr]]]] [[属性]]や [CODE(XMLa)@en[[[axis]]]] [[属性]]、
後者の例としては [CODE(HTMLa)@en[[[align]]]] [[属性]]や [CODE(XMLa)@en[[[border]]]]
[[属性]]があります。ただし後者は過去の[[文書]]との互換性のため、 [[Webブラウザー]]がどのように[[レンダリング]]するのが好ましいかの規定が
[[HTML5]] に含まれています。
* 流用例
[38] [[DocBook]] ではいくつかの[[表モデル]]が採用されていますが、その1つとして
[[HTML表モデル]]も用いることができます。
* 関連
[36] [[CSS]] は [[HTML]] の表 (の[[レンダリング]]) [[モデル]]に強く影響を受けた[[表モデル]]を規定しています。
[[HTML]] の[[要素]]に対応する [CODE(CSS)@en[[[display]]:]] [[属性値]]として
[CODE(CSS)@en[[[table]]]]、[CODE(CSS)@en[[[table-row]]]]、[CODE(CSS)@en[[[table-cell]]]]
などが用意されています。
[37] [[OOXML]] は [[HTML]] の影響を受けた[[表モデル]]を採用しています。ただし、
[[要素名]]や要素の構造など様々な点が大きく異なっており、直接の互換性はまったくありません。
* メモ
[35]
[CITE[Re: several messages about tables and related subjects]] ([[Ian Hickson ]] 著, [TIME[2008-03-23 19:29:56 +09:00]] 版)
([[名無しさん]])