GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/elisp/SVG-Images.html ・ emacs-doc.conao3.com

42.17.6 SVG画像

SVG (Scalable Vector Graphics) は、画像を指定するための XML 形式です。 SVG 画像は、以下の追加の画像記述子プロパティをサポートしています。

:foreground foreground

foreground が nil 以外の場合、CSS の ‘currentcolor’ 値として使用される色を指定する文字列である必要があります。値が nil の場合は、現在のフェイスの前景色がデフォルトとなります。

:background background

background が nil 以外の場合、色を指定する文字列である必要があり、画像が透過に対応している場合はその色が画像の背景色として使用されます。値が nil の場合は、現在のフェイスの背景色がデフォルトとなります。

:css css

css が nil でない場合は、画像生成時に使用されるデフォルトの CSS を上書きするための CSS を指定する文字列である必要があります。

SVGライブラリ

EmacsのビルドでSVGサポートが有効になっている場合は、svg.elライブラリの以下の関数を使用して、これらの画像を作成・操作できます。

関数: svg-create width height &rest args

指定した寸法で、新しい空のSVG画像を作成します。args は引数リストであり、以下を指定できます:

:stroke-width

作成されるすべての線のデフォルト幅(ピクセル単位)。

:stroke

作成されるすべての線のデフォルトの線色。

この関数は、SVG画像を指定するLispのデータ構造であるSVGオブジェクトを返し、以下のすべての関数はその構造を対象とします。以下の関数における引数svgは、このようなSVGオブジェクトを指定します。

関数: svg-gradient svg id type stops

svg に識別子 id を指定してグラデーションを作成します。type はグラデーションの種類を指定し、linear または radial のいずれかとなります。stops はパーセント値と色のペアのリストです。

以下では、始点の赤から、25%地点の緑、そして終点の青へと変化する線形グラデーションを作成します。

(svg-gradient svg "gradient1" 'linear
              '((0 . "red") (25 . "green") (100 . "blue")))

作成されたグラデーション(SVGオブジェクトに挿入されたもの)は、後で図形を作成するすべての関数で利用できます。

以下の関数はすべて、各種属性をデフォルト値から変更するキーワード引数のリストを任意で受け取ります。有効な属性は以下の通りです。

:stroke-width

描画される線や、塗りつぶし図形の輪郭の幅(ピクセル単位)。

:stroke-color

描画された線の色、および塗りつぶし図形の輪郭線。

:fill-color

塗りつぶし図形に使用される色。

:id

形状の特定。

:gradient

指定された場合は、以前に定義された勾配オブジェクトの識別子である必要があります。

:clip-path

クリップパスの識別子。

関数: svg-rectangle svg x y width height &rest args

svg に、左上隅が位置 x/y にあり、サイズが width/height である矩形を追加する。

(svg-rectangle svg 100 100 500 500 :gradient "gradient1")
関数: svg-circle svg x y radius &rest args

svgに、中心がx/yで半径がradiusの円を加える。

関数: svg-ellipse svg x y x-radius y-radius &rest args

svg に、中心が x/y にあり、水平半径が x-radius、垂直半径が y-radius である楕円を追加する。

関数: svg-line svg x1 y1 x2 y2 &rest args

svg に、x1/y1 から始まり x2/y2 まで延びる行を追加してください。

関数: svg-polyline svg points &rest args

svg に、X/Y座標のペアのリストである points を通る複数セグメントの線(別名「ポリライン」)を追加します。

(svg-polyline svg '((200 . 100) (500 . 450) (80 . 100))
              :stroke-color "green")
関数: svg-polygon svg points &rest args

svgにポリゴンを追加します。ここでpointsは、ポリゴンの外周を記述するX/Y座標のペアのリストです。

(svg-polygon svg '((100 . 100) (200 . 150) (150 . 90))
             :stroke-color "blue" :fill-color "red")
関数: svg-path svg commands &rest args

commandsに従って、図形の輪郭をsvgに追加します。SVG Path Commandsを参照してください。

デフォルトでは、座標は絶対座標となります。直前の位置、または――初期状態では――原点を基準とした相対座標を使用するには、属性 :relative に t を設定してください。この属性は、関数全体または個々のコマンドに対して指定できます。関数に対して指定した場合、すべてのコマンドでデフォルトとして相対座標が使用されます。個別のコマンドで絶対座標を使用するには、:relative に nil を設定してください。

(svg-path svg
	  '((moveto ((100 . 100)))
	    (lineto ((200 . 0) (0 . 200) (-200 . 0)))
	    (lineto ((100 . 100)) :relative nil))
	  :stroke-color "blue"
	  :fill-color "lightblue"
	  :relative t)
関数: svg-text svg text &rest args

指定された text を svg に追加します。

(svg-text
 svg "This is a text"
 :font-size "40"
 :font-weight "bold"
 :stroke "black"
 :fill "white"
 :font-family "impact"
 :letter-spacing "4pt"
 :x 300
 :y 400
 :stroke-width 1)
関数: svg-embed svg image image-type datap &rest args

svg に埋め込み(ラスター)画像を追加します。datap が nil の場合は image をファイル名とし、それ以外の場合は画像データを生バイトとして含む文字列とします。image-type は MIME 画像タイプ(例:"image/jpeg")とします。

(svg-embed svg "~/rms.jpg" "image/jpeg" nil
           :width "100px" :height "100px"
           :x "50px" :y "75px")
関数: svg-embed-base-uri-image svg relative-filename &rest args

svg に、relative-filename に配置された埋め込み(ラスター)画像を追加します。relative-filename は、:base-uri SVG 画像プロパティの file-name-directory 内で検索されます。:base-uri は、作成する SVG 画像の(存在しない可能性のある)ファイル名を指定します。これにより、すべての埋め込みファイルは :base-uri ファイル名のディレクトリを基準として検索されます。:base-uri を省略した場合は、SVG 画像が読み込まれる元のファイル名が使用されます。:base-uri を使用すると、すべての処理が librsvg によって直接行われるため、svg-embed と比較して大容量画像の埋め込みパフォーマンスが向上します。

;; Embedding /tmp/subdir/rms.jpg and /tmp/another/rms.jpg
(svg-embed-base-uri-image svg "subdir/rms.jpg"
           :width "100px" :height "100px"
           :x "50px" :y "75px")
(svg-embed-base-uri-image svg "another/rms.jpg"
           :width "100px" :height "100px"
           :x "75px" :y "50px")
(svg-image svg :scale 1.0
           :base-uri "/tmp/dummy"
           :width 175 :height 175)
関数: svg-clip-path svg &rest args

svg にクリッピングパスを追加します。:clip-path プロパティを介してシェイプに適用した場合、そのシェイプのうちクリッピングパスの外側に位置する部分は描画されません。

(let ((clip-path (svg-clip-path svg :id "foo")))
  (svg-circle clip-path 200 200 175))
(svg-rectangle svg 50 50 300 300
               :fill-color "red"
               :clip-path "url(#foo)")
関数: svg-node svg tag &rest args

カスタムノード tag を svg に追加します。

(svg-node svg
          'rect
          :width 300 :height 200 :x 50 :y 100 :fill-color "green")
関数: svg-remove svg id

svgから識別子idの要素を削除してください。

関数: svg-image svg

最後に、svg-imageはSVGオブジェクトを引数として受け取り、insert-imageのような関数で使用可能な画像オブジェクトを返します。

円を含む画像を作成して挿入する完全な例を以下に示します。

(let ((svg (svg-create 400 400 :stroke-width 10)))
  (svg-gradient svg "gradient1" 'linear '((0 . "red") (100 . "blue")))
  (svg-circle svg 200 200 100 :gradient "gradient1"
                  :stroke-color "green")
  (insert-image (svg-image svg)))

SVG パスコマンド

SVGパスでは、直線、曲線、円弧、その他の基本図形を組み合わせることで、複雑な画像を作成できます。以下に説明する関数を使用すると、LispプログラムからSVGパスコマンドを呼び出すことができます。

コマンド: moveto points

ペンをpointsの最初の点に移動します。追加の点は線で結ばれます。pointsはX/Y座標ペアのリストです。後続のmovetoコマンドは、新しいサブパスの開始を表します。

(svg-path svg '((moveto ((200 . 100) (100 . 200) (0 . 100))))
          :fill "white" :stroke "black")
コマンド: closepath

現在のサブパスを始点に戻して終了します。接続線が引かれます。

(svg-path svg '((moveto ((200 . 100) (100 . 200) (0 . 100)))
                (closepath)
                (moveto ((75 . 125) (100 . 150) (125 . 125)))
                (closepath))
          :fill "red" :stroke "black")
コマンド: lineto points

現在の点から、X/Y座標のペアのリストであるpointsの最初の要素まで線を引きます。複数の点が指定されている場合は、ポリラインを描画します。

(svg-path svg '((moveto ((200 . 100)))
                (lineto ((100 . 200) (0 . 100))))
          :fill "yellow" :stroke "red")
コマンド: horizontal-lineto x-coordinates

現在の点から x-coordinates の最初の要素まで水平線を引きます。複数の座標を指定することも可能ですが、通常はあまり意味がありません。

(svg-path svg '((moveto ((100 . 200)))
                (horizontal-lineto (300)))
          :stroke "green")
コマンド: vertical-lineto y-coordinates

縦線を引く。

(svg-path svg '((moveto ((200 . 100)))
                (vertical-lineto (300)))
          :stroke "green")
コマンド: curveto coordinate-sets

coordinate-sets の最初の要素を使用して、現在の点から3次ベジェ曲線を描画します。座標セットが複数ある場合は、ポリベジェ曲線を描画します。各座標セットは (x1 y1 x2 y2 x y) 形式のリストであり、(x, y) が曲線の終点となります。(x1, y1) と (x2, y2) は、それぞれ始点と終点の制御点です。

(svg-path svg '((moveto ((100 . 100)))
                (curveto ((200 100 100 200 200 200)
                          (300 200 0 100 100 100))))
          :fill "transparent" :stroke "red")
コマンド: smooth-curveto coordinate-sets

coordinate-sets の最初の要素を用いて、現在の点から3次ベジェ曲線を描画します。座標セットが複数ある場合は、ポリベジェ曲線を描画します。各座標セットは (x2 y2 x y) 形式のリストであり、(x, y) が曲線の終点、(x2, y2) が対応する制御点となります。直前のコマンドが curveto または smooth-curveto であった場合、最初の制御点は、現在の点を基準としたそのコマンドの2番目の制御点の鏡像となります。それ以外の場合、最初の制御点は現在の点と一致します。

(svg-path svg '((moveto ((100 . 100)))
                (curveto ((200 100 100 200 200 200)))
                (smooth-curveto ((0 100 100 100))))
          :fill "transparent" :stroke "blue")
コマンド: quadratic-bezier-curveto coordinate-sets

coordinate-sets の最初の要素を使用して、現在の点から2次ベジェ曲線を描画します。座標セットが複数ある場合は、ポリベジェ曲線を描画します。各座標セットは (x1 y1 x y) 形式のリストであり、(x, y) が曲線の終点、(x1, y1) が制御点となります。

(svg-path svg '((moveto ((200 . 100)))
                (quadratic-bezier-curveto ((300 100 300 200)))
                (quadratic-bezier-curveto ((300 300 200 300)))
                (quadratic-bezier-curveto ((100 300 100 200)))
                (quadratic-bezier-curveto ((100 100 200 100))))
          :fill "transparent" :stroke "pink")
コマンド: smooth-quadratic-bezier-curveto coordinate-sets

coordinate-sets の最初の要素を用いて、現在の点から2次ベジェ曲線を描画します。座標セットが複数ある場合は、ポリベジェ曲線を描画します。各座標セットは (x y) 形式のリストであり、(x, y) が曲線の終点となります。制御点は、直前のコマンドが quadratic-bezier-curveto または smooth-quadratic-bezier-curveto であった場合、現在の点を基準としたその制御点の鏡像となります。それ以外の場合、制御点は現在の点と一致します。

(svg-path svg '((moveto ((200 . 100)))
                (quadratic-bezier-curveto ((300 100 300 200)))
                (smooth-quadratic-bezier-curveto ((200 300)))
                (smooth-quadratic-bezier-curveto ((100 200)))
                (smooth-quadratic-bezier-curveto ((200 100))))
          :fill "transparent" :stroke "lightblue")
コマンド: elliptical-arc coordinate-sets

coordinate-sets の最初の要素を使用して、現在の点から楕円弧を描画します。座標セットが複数ある場合は、一連の楕円弧を描画します。各座標セットは (rx ry x y) 形式のリストであり、(x, y) が楕円の終点、(rx, ry) がその半径となります。リストには属性を追加できます:

:x-axis-rotation

楕円のx軸が、現在の座標系のx軸に対して回転した角度(度)。

:large-arc

t に設定すると、180度以上のアークスイープを描画します。それ以外の場合は、180度以下のアークスイープを描画します。

:sweep

t に設定すると、正の角度方向に弧を描画します。それ以外の場合は、負の角度方向に描画します。

(svg-path svg '((moveto ((200 . 250)))
                (elliptical-arc ((75 75 200 350))))
          :fill "transparent" :stroke "red")
(svg-path svg '((moveto ((200 . 250)))
                (elliptical-arc ((75 75 200 350 :large-arc t))))
          :fill "transparent" :stroke "green")
(svg-path svg '((moveto ((200 . 250)))
                (elliptical-arc ((75 75 200 350 :sweep t))))
          :fill "transparent" :stroke "blue")
(svg-path svg '((moveto ((200 . 250)))
                (elliptical-arc ((75 75 200 350 :large-arc t
                                     :sweep t))))
          :fill "transparent" :stroke "gray")
(svg-path svg '((moveto ((160 . 100)))
                (elliptical-arc ((40 100 80 0)))
                (elliptical-arc ((40 100 -40 -70
                                     :x-axis-rotation -120)))
                (elliptical-arc ((40 100 -40 70
                                     :x-axis-rotation -240))))
          :stroke "pink" :fill "lightblue"
          :relative t)