SVG で Web フォントのサポートが明示されたのは、それがずっと望まれていたからです。しかし画像のレンダリングには正しいフォントが重要であるため、SVG にフォントを定義する技術が追加されました。これは PostScript や OTF のような他のフォント形式と同じようなものを意図するのではなく、レンダリングエンジン向けにグリフ情報を埋め込む簡単な手段です。
SVG フォントを定義するための基盤は <font>
要素です。
フォントの定義
フォントに必要なすべての情報を得ることに、連携して関わる要素がいくつかあります。始めに (仕様書 で示されている) 宣言の例、その後に詳しい説明を示します。
<font id="Font1" horiz-adv-x="1000"> <font-face font-family="Super Sans" font-weight="bold" font-style="normal" units-per-em="1000" cap-height="600" x-height="400" ascent="700" descent="300" alphabetic="0" mathematical="350" ideographic="400" hanging="500"> <font-face-src> <font-face-name name="Super Sans Bold"/> </font-face-src> </font-face> <missing-glyph><path d="M0,0h200v200h-200z"/></missing-glyph> <glyph unicode="!" horiz-adv-x="300"><!-- Outline of exclam. pt. glyph --></glyph> <glyph unicode="@"><!-- Outline of @ glyph --></glyph> <!-- more glyphs --> </font>
まずは <font>
要素から始まります。これは id 要素を持っており、それは URI を通してフォントを参照する (後述) ために必要です。horiz-adv-x
属性は 1 つのグリフのパス定義に比べて、文字の幅を平均してどのくらい広げるかを定義します。値 1000
は、作業を行うにあたりほどよい値を設定します。また、基本的なグリフボックスのレイアウトをさらに定義するための付随的な属性がいくつかあります。
<font-face>
要素 CSS の @font-face
宣言と対になるものです。これはフォントウェイトやフォントスタイルの分類など、最終的なフォントの基本的なプロパティを定義します。前出の例で最も重要で、最初に定義するものは font-family
です。この値は、CSS や SVG の font-family
プロパティで参照することができます。font-weight
および font-style
属性は、同じ目的を持ちます。その後に続く属性は、フォントレンダリングエンジンへのレンダリング指示になります。例えば、グリフ全体の高さを表すのがアセンダです。
font-face
要素の子要素である <font-face-src>
要素は、CSS の @font-face
宣言の src
プロパティに対応します。子要素の <font-face-name>
や <font-face-uri>
を用いて、フォントの宣言で外部のソースを指し示すことができます。前出の例では、レンダラーの手元に "Super Sans Bold" という名前のローカルフォントが存在する場合は、そのフォントを用いるべきであることを示します。
<font-face-src>
の後に <missing-glyph>
要素があります。これはあるグリフがフォント内で見つからず、またフォールバックする仕組みもない場合に何を表示するべきかを定義します。またこの要素では、どのようにグリフを作成するかも示しています。単純にグラフィックの SVG コンテンツを内部に追加するのです。また、<filter>
、<a>
、あるいは <script>
といった、他の SVG 要素もここで用いることができます。ただし単純なグリフを作るなら、path 要素の場合と同じ働きである d
属性を追加することもできます。
実際のグリフは <glyph>
要素で定義します。ここで最も重要な属性は unicode
です。この属性は Unicode のコードポイントを定義して、その文字が glyph
要素で示すグリフで表現されます。lang
属性を指定した場合は、さらにグリフを特定の言語 (フォントを使用する側の xml:lang
で示されます) のみに限定することができます。繰り返しになりますがグリフを定義するために任意の SVG を用いることができ、またユーザエージェントが対応するすばらしいエフェクトを用いることもできます。
font
内で定義することができる要素がさらに 2 つあり、それは <hkern>
と <vkern>
です。それぞれの実体は少なくとも 2 つの文字を参照し、また k 属性はそれらの文字の間の距離をどれだけ縮めるかを定義します。初歩的な例は "A" と "V" であり、レンダラーは "AV" という文字列を、単独の文字が暗に定義する距離よりも間隔を狭くして配置します。
<hkern u1="A" u2="V" k="20" />
フォントの参照
これはとても単純です。これまで説明したようにフォントの宣言をひとまとめに収めた場合は、font-family
属性を用いるだけでよいのです。
<font> <font-face font-family="Super Sans" /> <!-- and so on --> </font> <text font-family="Super Sans">My text uses Super Sans</text>
ただし、どこでどのようにフォントを定義するかの自由のために、複数の方法を自由に組み合わせてもかまいません。
オプション: CSS @font-face の利用
リモートの (またはリモートでない) フォントの参照に @font-face を用いることができます。
<font id="Super_Sans"> <!-- and so on --> </font> <style type="text/css"> @font-face { font-family: "Super Sans"; src: url(#Super_Sans); } </style> <text font-family="Super Sans">My text uses Super Sans</text>
オプション: リモートフォントの参照
前に述べた font-face-uri で外部のフォントを参照することができ、高い再利用性を得ることができます。
<font> <font-face font-family="Super Sans"> <font-face-src> <font-face-uri xlink:href="fonts.svg#Super_Sans" /> </font-face-src> </font-face> </font>