== 図形をまとめて扱う ==

いくつかの図形をまとめてグループとして扱ったり、図形に名前をつけ名前で図形を参照するための要素です。
 * group
 * symbol
 * use

----
=== グループ ===

いくつかの図形をまとめてグループとして扱うことができます。
グループをさらにグループの中に含むこともできます。

グループの記述には g 要素を使います。
 {{{
 <g fill="black">
   <g fill="red">
     <rect x="10" y="10" width="30" height="30" fill="blue" />
     <rect x="20" y="20" width="30" height="30" />
   </g>
   <rect x="30" y="30" width="40" height="40" />
 </g>
 }}}

この例では2つのグループがあり、一方のグループはもう1つのグループを含んでいます。
 . fill属性を外側のグループで指定することで、個々の図形での指定を省略しています。
 . 属性の値は継承されます。
 . 1つ目の長方形は青、2つ目の長方形は赤、3つ目の長方形は黒になります。

----
=== id 属性 ===

id属性を使って図形やグループには名前をつけることができます。
名前をつけておくと、ほかの場所で使うことができます。

長方形2つからなるグループに rei という名前をつけた例です。
 {{{
 <g id="rei">
     <rect x="10" y="10" width="30" height="30" />
     <rect x="20" y="20" width="30" height="30" />
 </g>
 }}}

----
=== use 要素 ===

名前をつけた図形やグループを使うには use 要素で記述します。
 {{{
 <use xlink:href="#rei" x="100" y="50" />
 }}}
これは rei という名前で定義された図形(グループ)を、位置(100,50)に表示せよという指示になります。
描画する座標(100,50)が、グループreiでの座標(0,0)に対応します。

名前は id 属性で定義されたものです。

参照の書きかたに注意してください。'''xlink:href="#名前"''' です。

例
 {{{
 <g id="g1" style="fill:blue; stroke:none;">
     <circle cx="50" cy="20" r="10" />
     <circle cx="50" cy="50" r="20" />
 </g>
 <use xlink:href="#g1" x="100" y="0" />
 }}}
大小の円を重ねた図形を g要素でグループ化しています。
名前を g1 と付けています。
色はg要素で指定し、個々のcircle要素には記述していません。

use要素でg1を参照し、x方向に100ずらした位置に描画します。

同じ形の図形が g の箇所と use の箇所の2回描画されます。

----
=== defs内に記述する ===

<defs> ... </defs> の内部に書いた要素は、定義だけが行われ、その時点では描画は行われません。
図形の定義だけを行ってその時点では描画をしないで、あとで use で使うことができます。

<defs> ... </defs>はSVGデータの中に1つしか書けませんでした。
したがって、通常のSVGデータはつぎのような構造になります。
{{{
<svg ... ...>
    <title>タイトル</title>
    <defs>
        スタイルの定義
        図形の定義
        ...
    </defs>
    図形の記述
    ...
</svg>
}}}
先ほどの例の g の部分を defs 内に移動し
{{{
<defs>
 <g id="g1" style="fill:blue; stroke:none;">
        <circle cx="50" cy="20" r="10" />
        <circle cx="50" cy="50" r="20" />
     </g>
</defs>
<use xlink:href="#g1" x="100" y="0" />
}}}
とすると、描画されるのは use で指定したものだけになります。

----
=== use 要素に style を記述する ===

use 要素に style を記述することもできます。
下の例では、use要素でstyleを記述し、色を変えて描画しています。
g要素で定義された図形のうち、styleの指定されていない2つのcircleの色はuseで指定したものになります。
3つのcircleのうち3つ目のものは定義のときにstyleが指定されており、useで指定された色ではなく、circleで指定された色になります。
{{{
<defs>
 <g id="g1">
        <circle cx="50" cy="20" r="10" />
        <circle cx="50" cy="50" r="20" />
        <circle cx="50" cy="50" r="5" style="fill:none; stroke:blue;"/>
     </g>
</defs>
<use xlink:href="#g1" x="100" y="0" style="fill:#f80; stroke:none;"/>
<use xlink:href="#g1" x="200" y="0" style="fill:#8ff; stroke:none;" />
}}}

----
=== symbol要素 ===

g の代わりに symbol を用いてグループを作ることもできます。
違いは次の2点です。

1)symbol で定義したグループは(すぐには)描画されない。

 . defs内に書かなくても、定義だけが行われ描画されません。
 . defs内に書いても同じです。

2)symbol には viewBox を指定することができる。
 {{{
 <symbol id="rei" viewBox="-10 -10 20 20">
   図形の記述
 </symbol>
 
 <use xlink:href="#rei" x="50" y="50" width="100" height="100" />
 }}}
のように用います。
viewBoxとwidth heightの対応はsvg要素の場合と同じです。