2003-11-08 現在、修正中です。
SGML には、マーク付けを簡易化するための方法の一つとして短縮参照という機構が用意されている。
短縮参照というのは、一般実体参照を拡張した機構である。例えば、一般実体参照を用いると という文字列を
&address;
と表現することで済ませたりできるが、短縮参照では、これをさらに @
という一文字で表現したりすることが可能になる。
一般的な実体参照・文字参照は"&;"や"%;"、"&#;"といった参照区切り子で実体名括って表す。これに対し、短縮参照では特定の要素中の任意の文字列を(区切り子・実体名を併せた)実体参照と見做すことができる。
# 正確には、任意の文字列を短縮参照区切り子と見做せるということである。短縮参照区切り子ひとつで特定の実体を参照できる。
例えば、head要素中に出現する全ての"a"を"&"に拡張(展開)するような定義が可能になる。
XHTML 1.1 のruby要素は以下のように記述するよう定義されている。
<ruby><rb>ルビベース</rb><rp>(</rp><rt>ルビテキスト</rt><rp>)</rp></ruby>
XHTMLの性格上仕方のないことだが、これはやや冗長な感のするマークアップである。しかし、SGMLでは短縮参照とタグ省略を用いると、同じようなマークアップを以下のように記述することができる。
<ruby>ルビベース(ルビテキスト)</ruby>
これは、パーサに解釈されると、以下のようなマークアップに拡張(展開)される。
<ruby><rb>ルビベース</rb><rt>ルビテキスト</rt></ruby>
この場合、DTDではruby要素付近に於いて以下のような定義がなされている(一部簡略にした)。
<!ENTITY rts STARTTAG "rt">
<!ENTITY rte ENDTAG "rt">
<!SHORTREF ruby-map "(" rts
")" rte>
<!USEMAP ruby-map ruby>
<!ELEMENT ruby - - (rb,rt)>
<!ELEMENT rb o o (#PCDATA)>
<!ELEMENT rt - - (#PCDATA)>
以下、例4の定義について解説する。
まず、<!SHORTREF
で始まるSHORTREF宣言(短縮参照マッピング宣言)について。これは通常以下のような形式で宣言される。
<!SHORTREF マップ名
短縮参照区切り子 置換テキストの実体名
短縮参照区切り子 置換テキストの実体名
…>
この宣言は、(一意な)マップ名で指定されるマップが有効な範囲で短縮参照区切り子が置換テキストの実体に置換されることを示す。
例4の定義の場合、ruby-map
マップが有効な範囲では、全ての "(" は "&rts;" に、")" は "&rte;" に置換される。
&rts;、&rte;の実体はそれぞれrt要素の開始タグ("<rt>")と終了タグ("</rt>")である(注記)。従って、ruby-map
マップが有効な範囲では見做(みな)す
という記述はパーサによって即座に見做<rt>みな</rt>す
というマークアップに拡張(展開)される。
マップが有効な範囲では(対で用いられているか否かに関わらず)丸括弧は全てrtタグと見做されてしまうので、注意が必要である。マップが有効な範囲に於いて丸括弧を本来の意味で使用したい場合には、実体参照を用いて見做す(「看做す」とも書く)
のようにする必要がある。
次に、<!USEMAP
で始まるUSEMAP宣言(短縮参照使用宣言)について。
これは通常、<!USEMAP 短縮参照マップ名 マップを使用する要素名>
という形式で記述される。この宣言は、マップを使用する要素名
で指定した要素内で、短縮参照マップ名
で指定される短縮参照マップを使用することを示す。この宣言によって、指定された要素内では短縮参照マップが有効になる。
例4(<!USEMAP ruby-map ruby>
)の場合、ruby要素内ではruby-mapで示される短縮参照マップを使用する
という意味になる。この結果前述のように、ruby要素内で用いられる丸括弧 "(" ")" は全て短縮参照区切り子と見做され、<rt>
と</rt>
に拡張される。
短縮参照の利点には、記述が単純であり、マークアップに使用する字数を減らせること、視覚的であることなどがある。しかし筆者が最も面白く感じるのは、上手く定義すれば他の(メタ)言語の記述法をそのままマークアップとして解釈できるという点である。
上に示した例でも、「ルビを直接表現できない環境では括弧の中に読み仮名を示す」という日本語の習慣をそのままマークアップと見做せるようになっている。これは(後方)互換の点から見ても非常に優れていると思う。
このように記述法によって意味構造が示される場面は非常に多い。自然言語でも、句点 "。" は文の終端を示すし、鉤括弧 "「" "」" は引用文を示す。短縮参照を用いれば、これらの記述をそのままマークアップとして変換できる訳である。
もう一つ、極めて一般的な例として、数学の表記法をマークアップとして定義することが考えられる。これは HTML 3.0 に於いてmath要素として定義されようとしたが、惜しいことに結局規格自体が完成しなかった。
このmath要素については、別途解説頁を設ける予定である。興味のある方はそちらも参照して貰いたい。
math要素が定義されていた HTML 3.0 はさておき、他の正式な HTMLでは、短縮参照が使用されているものは殆どない。著者が具体例として知っているのは、ISO-HTML での水平タブに関する定義くらいである。
以下、ISO-HTML の DTD から抜粋した。
<!-- SHORTREF mapping for the tab character --> <!-- Use of the tab character is deprecated. However, to facilitate the preparation of conforming documents by authors who use it, the tab character is tolerated and is mapped into a single space. --> <!ENTITY nontab " " > <!SHORTREF tabmap "&#TAB;" nontab > <!USEMAP tabmap HTML >
仕様書の方のDTDでは文字参照を用いていないので判り難いが、<!ENTITY nontab " " >
で実体として定義されている文字列は半角スペースであり、<!SHORTREF tabmap " " nontab >
で短縮参照区切り子として定義されている文字列は(上記と同じく)水平タブである(ソースをエディタなどで開けば分かるだろう)。つまりこれは、html要素内にある全ての水平タブを半角スペースに置換するという定義なのである。
この定義の意図は、註釈の付いている通り水平タブの使用は非推奨とするが、作者が水平タブを使用した場合には半角スペースに置換するよう配慮した
ということである。直接要素のマークアップに関係する定義ではないが、このようにHTMLでも短縮参照が用いられることはある。
因みに、恐らくこの定義は不完全で、多分Preparationのことを忘れている。%Preparation;
をINCLUDEに上書きした場合には、ルート要素はhtml要素ではなくpre-html要素になる。従って、本来この箇所は以下のように記述されてあるべきだろう。
<!ENTITY nontab " " >
<!SHORTREF tabmap "&#TAB;" nontab >
<![ %Preparation; [
<!USEMAP tabmap Pre-HTML >
]]>
<![ %NoPreparation; [
<!USEMAP tabmap HTML >
]]>