
[1]
[[MathML]] における[[空白]]の取り扱いについて。

* 仕様書

- [10] [CITE[MathML Fundamentals]] ([TIME[2010-10-21 05:51:46 +09:00]] 版) <http://www.w3.org/TR/2010/REC-MathML3-20101021/chapter2.html#fund.collapse>

* 定義

[4]
[[MathML]] における[DFN[[RUBY[[[空白]]] [くうはく] @en[whitespace]]]][[文字]]は、
[[XML]] の [CODE@en[[[S]]]] と同じで
- [CODE(char)@en[[[U+0009]]]] [CODE(charname)@en[[[HORIZONTAL TAB]]]]
- [CODE(char)@en[[[U+000A]]]] [CODE(charname)@en[[[LINE FEED]]]]
- [CODE(char)@en[[[U+000D]]]] [CODE(charname)@en[[[CARRIAGE RETURN]]]]
- [CODE(char)@en[[[U+0020]]]] [CODE(charname)@en[[[SPACE]]]]

... の4種類です [SRC[>>10]]。

;; [11] [[MathML]] 仕様書では [Q@en[white space]] ではなく [Q@en[whitespace]] と綴っています。

* 処理モデル

** 字句要素外の空白

[2]
[[字句要素]]の''外''にある[[空白]]は、無視されます。
[SRC@en[MathML1 2.3.5, MathML2 2.4.6, >>10]]

[14] 
[[字句要素]]外で[[空白]]''以外''の[[文字]]は認められていません。
[SRC@en[MathML1 2.3.5, MathML2 2.4.6, >>10]]

** 字句要素内の空白

[15] [[字句要素]]の''中''では [SRC@en[MathML1 2.3.5, MathML2 2.4.6, >>10]]、
- [[要素]]の最初と最後の[[空白]]は、除去されます。
- それ以外の[[空白]]列は、1つの [CODE(charname)@en[[[SPACE]]]] で置き換えられます。
- ただし、 [CODE(XMLe)@en[[[cs]]]] [[要素]]の場合を除きます [SRC[>>10]]。

* 歴史

= [8] [[MathML 1]]
-- [CSECTION@en[2.3.5 Collapsing Whitespace in Input]]
<IW:MathML1:"chapter2.html#sec2.3.5">
= [9] [[MathML 2]]
-- [CSECTION@en[2.4.6 Collapsing Whitespace in Input]]
<IW:MathML2:"chapter2#fund.collapse">

* 関連

** データとしての空白の表現

[16] [[字句要素]]の中で正規化されない[[空白]]を本当に表現したい時は、 [CODE(charname)@en[[[NBSP]]]]
など [[MathML]] でいう[[空白]]以外の[[空白]]文字を使う必要があります [SRC[>>10]]。

[17] [[字句要素]]外で[[空白]]を表現したいときは、 [CODE(charname)@en[[[NBSP]]]] 
だけが入った [CODE(XMLe)@en[[[mtext]]]] [[要素]]を使ったりするのでは''なく''、
[CODE(XMLe)@en[[[mspace]]]] [[要素]]を使う[RUBYB[べき]@en[should]]です [SRC[>>10]]。

** XML としての空白処理との関係

[12] [[MathML]] を [[XML文書]]として記述した場合、それを解釈する際には
[[XML]] で規定された[[空白]]の処理を行った結果が
[[XML]] [[処理器]]から [[MathML]] [[処理器]]に渡されます。
[[DTD]] を使って[[検証]]した場合はそれに基づく[[空白]]の処理が行われます。

;; [[XML//空白]]参照。

[13] [[MathML]] [[文書]]を [[XML Schema]] で[[妥当性検証]]し、 [[PSVI]]
を [[MathML]] [[処理器]]に渡す場合は、 [[XML]] 
としての[[空白]]の処理だけでなく、
[[XML Schema]] に基づく[[空白]]の処理も行われます。

[3]
[[MathML]] では [CODE(XMLa)@en[[[xml:space]]]]
[[属性]]は使われません。
[SRC@en[MathML1 2.3.5, MathML2 2.4.6]]
先述の [[MathML]] としての[[空白]]の正規化処理は [[XML]] としての処理の後で行われるので、
[CODE(XMLa)@en[[[xml:space]]]] の値が結果に反映されることはありません [SRC[>>10]]。

* メモ

[5]
[CODE(XMLe)@en[[[declare]]]] [[要素]]との一致は [[XML情報集合]]として比較するそうです
(<IW:MathML2:"chapter4.html#id.4.4.2.8.1">、 [[MathML 1]]
(<IW:MathML1:"chap4_4.html#sec4.4.2.8">) には規定なし)。

[Q@en[after XML space normalization]<http://www.w3.org/TR/2003/REC-MathML2-20031021/chapter4.html#id.4.4.2.8.1>]
とは書いてあるものの、 [[MathML]] としての[[空白]]の処理をした後とは書いてありませんが、よいのでしょうか?
([[名無しさん]])

[6]
仕様書にある
[PRE(XML example code)[
<cn type="rational"> 12342 <sep/> 2342342 </cn>
]PRE]

のような例は、 [CODE(XMLe)@en[[[sep]]]] 
の前後の[[空白]]が除去されることを想定していると思うのですが、どうなのでしょうか?
>>2 の規則だけでは除去されず、特別な規則もないようですが・・・。

;; 
[CODE(XMLe)@en[[[cn]]]] の[[内容]]は [[MathML]] で厳密には決められていなくて、著者と実装が割と自由にできるみたいですが。。。

([[名無しさん]])


[7]
[[要素]]の[[内容]]の[[空白]]に関する正規化は [[DOM]]
に反映されるようです。

;;
<IW:MathML2:"chapter8.html#dom-intro.intro">
