短縮参照

2003-11-08 現在、修正中です。

目次

1. 短縮参照とは

SGML には、マーク付けを簡易化するための方法の一つとして短縮参照という機構が用意されている。

短縮参照というのは、一般実体参照を拡張した機構である。例えば、一般実体参照を用いると という文字列を &address; と表現することで済ませたりできるが、短縮参照では、これをさらに @ という一文字で表現したりすることが可能になる。

一般的な実体参照・文字参照は"&;"や"%;"、"&#;"といった参照区切り子実体名括って表す。これに対し、短縮参照では特定の要素中の任意の文字列を(区切り子・実体名を併せた)実体参照と見做すことができる。

# 正確には、任意の文字列を短縮参照区切り子と見做せるということである。短縮参照区切り子ひとつで特定の実体を参照できる。

例えば、head要素中に出現する全ての"a"を"&"に拡張(展開)するような定義が可能になる。

2. 簡単な例(短縮参照を用いた ruby 要素の定義例)

XHTML 1.1 のruby要素は以下のように記述するよう定義されている。

例1: XHTML 1.1 のruby要素のマークアップ例
<ruby><rb>ルビベース</rb><rp>(</rp><rt>ルビテキスト</rt><rp>)</rp></ruby>

XHTMLの性格上仕方のないことだが、これはやや冗長な感のするマークアップである。しかし、SGMLでは短縮参照とタグ省略を用いると、同じようなマークアップを以下のように記述することができる。

例2: 短縮参照を用いたruby要素のマークアップ例
<ruby>ルビベース(ルビテキスト)</ruby>

これは、パーサに解釈されると、以下のようなマークアップに拡張(展開)される。

例3: パーサが例2を拡張した場合の例
<ruby><rb>ルビベース</rb><rt>ルビテキスト</rt></ruby>

この場合、DTDではruby要素付近に於いて以下のような定義がなされている(一部簡略にした)。

例4: 例3の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)>

3. SHORTREF 宣言(短縮参照マッピング宣言)

以下、例4の定義について解説する。

まず、<!SHORTREFで始まるSHORTREF宣言(短縮参照マッピング宣言)について。これは通常以下のような形式で宣言される。

例5: SHORTREF宣言の例
<!SHORTREF マップ名
           短縮参照区切り子 置換テキストの実体名
           短縮参照区切り子 置換テキストの実体名
           …>

この宣言は、(一意な)マップ名で指定されるマップが有効な範囲で短縮参照区切り子が置換テキストの実体に置換されることを示す。

例4の定義の場合、ruby-mapマップが有効な範囲では、全ての "(" は "&rts;" に、")" は "&rte;" に置換される。

&rts;、&rte;の実体はそれぞれrt要素の開始タグ("<rt>")と終了タグ("</rt>")である(注記)。従って、ruby-mapマップが有効な範囲では見做(みな)すという記述はパーサによって即座に見做<rt>みな</rt>すというマークアップに拡張(展開)される。

マップが有効な範囲では(対で用いられているか否かに関わらず)丸括弧は全てrtタグと見做されてしまうので、注意が必要である。マップが有効な範囲に於いて丸括弧を本来の意味で使用したい場合には、実体参照を用いて見做す&#40;「看做す」とも書く&#41;のようにする必要がある。

4. USEMAP 宣言(短縮参照使用宣言)

次に、<!USEMAPで始まるUSEMAP宣言(短縮参照使用宣言)について。

これは通常、<!USEMAP 短縮参照マップ名 マップを使用する要素名>という形式で記述される。この宣言は、マップを使用する要素名で指定した要素内で、短縮参照マップ名で指定される短縮参照マップを使用することを示す。この宣言によって、指定された要素内では短縮参照マップが有効になる。

例4(<!USEMAP ruby-map ruby>)の場合、ruby要素内ではruby-mapで示される短縮参照マップを使用するという意味になる。この結果前述のように、ruby要素内で用いられる丸括弧 "(" ")" は全て短縮参照区切り子と見做され、<rt></rt>に拡張される。

5. 短縮参照を用いる利点

短縮参照の利点には、記述が単純であり、マークアップに使用する字数を減らせること、視覚的であることなどがある。しかし筆者が最も面白く感じるのは、上手く定義すれば他の(メタ)言語の記述法をそのままマークアップとして解釈できるという点である。

上に示した例でも、「ルビを直接表現できない環境では括弧の中に読み仮名を示す」という日本語の習慣をそのままマークアップと見做せるようになっている。これは(後方)互換の点から見ても非常に優れていると思う。

このように記述法によって意味構造が示される場面は非常に多い。自然言語でも、句点 "。" は文の終端を示すし、鉤括弧 "「" "」" は引用文を示す。短縮参照を用いれば、これらの記述をそのままマークアップとして変換できる訳である。

もう一つ、極めて一般的な例として、数学の表記法をマークアップとして定義することが考えられる。これは HTML 3.0 に於いてmath要素として定義されようとしたが、惜しいことに結局規格自体が完成しなかった。

このmath要素については、別途解説頁を設ける予定である。興味のある方はそちらも参照して貰いたい。

6. HTML での使用例 (ISO-HTML に於ける水平タブの扱い)

math要素が定義されていた HTML 3.0 はさておき、他の正式な HTMLでは、短縮参照が使用されているものは殆どない。著者が具体例として知っているのは、ISO-HTML での水平タブに関する定義くらいである。

以下、ISO-HTML の DTD から抜粋した。

例6: 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要素になる。従って、本来この箇所は以下のように記述されてあるべきだろう。

例7: ISO-HTML中での短縮参照の定義を書き直した例
<!ENTITY   nontab  " " >
<!SHORTREF tabmap  "&#TAB;" nontab >

<![ %Preparation; [
<!USEMAP   tabmap  Pre-HTML >
]]>

<![ %NoPreparation; [
<!USEMAP   tabmap  HTML >
]]>

この文書のステータス

URI
http://www.satoshii.org/markup/sgml/shortref
初版
2001-11-07
最終更新
2003-11-23
著者
石川哲志
Copyright © 2001, 2003 Satoshi ISHIKAWA, All Rights Reserved.