emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/sketch-mode 4a4e2ba 33/38: Implement import/snippet fun


From: ELPA Syncer
Subject: [elpa] externals/sketch-mode 4a4e2ba 33/38: Implement import/snippet functionality
Date: Wed, 15 Sep 2021 16:57:39 -0400 (EDT)

branch: externals/sketch-mode
commit 4a4e2ba1c791937cfa1107d52497887126a14977
Author: Daniel Nicolai <dalanicolai@gmail.com>
Commit: Daniel Nicolai <dalanicolai@gmail.com>

    Implement import/snippet functionality
---
 README.org                           |    9 +-
 sketch-mode.el                       |  376 ++++++---
 snippet-files/circuit_components.svg | 1417 ++++++++++++++++++++++++++++++++++
 3 files changed, 1701 insertions(+), 101 deletions(-)

diff --git a/README.org b/README.org
index 2dddf7f..43bc237 100644
--- a/README.org
+++ b/README.org
@@ -75,9 +75,10 @@
   Add the following lines to =dotspacemacs-additional-packages=
   
 #+begin_src emacs-lisp :tangle yes
-     (sketch-mode :location (recipe
-                        :fetcher github
-                        :repo "dalanicolai/sketch-mode"))
+  (sketch-mode :location (recipe
+                     :fetcher github
+                     :repo "dalanicolai/sketch-mode"
+                     :files ("*.el" "snippet-files")))
 #+end_src
 
   Subsequently load the packages by adding the following line to 
=dotspacemacs/user-config=
@@ -93,8 +94,6 @@
   package, the usage is more or less self explanatory, it is wise to take note
   of the following comments:
 
-  - the undo/redo functionality is really basic, and does not work for all 
actions
-    (e.g. does not work yet when removing object or cropping images).
   - to remove an object (without using undo), you should toggle labels by
     pressing =l=, and then to remove an object enter its label after pressing
     =R=.
diff --git a/sketch-mode.el b/sketch-mode.el
index 418377a..9c7ca45 100644
--- a/sketch-mode.el
+++ b/sketch-mode.el
@@ -1,13 +1,12 @@
-;; sketch-mode.el --- Quickly create svg sketches using keyboard and mouse -*- 
lexical-binding: t; -*-
+;;; sketch-mode.el --- Quickly create svg sketches using keyboard and mouse 
-*- lexical-binding: t; -*-
 
 ;; Copyright (C) 2021  Free Software Foundation, Inc.
 
-
 ;; Author: D.L. Nicolai <dalanicolai@gmail.com>
 ;; Created: 17 Jul 2021
 ;; Version: 0
 
-;; Keywords: multimedia 
+;; Keywords: multimedia
 ;; URL: https://github.com/dalanicolai/sketch-mode
 
 ;; This file is not part of GNU Emacs.
@@ -42,6 +41,9 @@
 
 ;; TODO add functionality to customize markers
 
+;; TODO Add options to hide transient suffixes (e.g. commands are trivial and 
could be hidden to get more drawing space.
+;; unfortunately transient levels (de)activate instead of hide/show suffixes)
+
 ;; TODO enable defining global svg settings (object properties)
 
 ;; TODO maybe transform relevant transient argument (strings) to variables
@@ -73,6 +75,7 @@
 ;;; Code:
 (require 'svg)
 (require 'transient)
+(require 'seq)
 
 (defgroup sketch nil
   "Configure default sketch (object) properties."
@@ -107,8 +110,12 @@ default: (800 . 600)."
   "Default grid line separation distance (integer)."
   :type 'integer)
 
+(defcustom sketch-label-size 15
+  "Size of object labels."
+  :type 'integer)
+
 (defcustom sketch-default-shape 'line
-  "Default object type for `sketch-interactively.'"
+  "Default object type for `sketch-interactively'."
   :type '(choice
                (const :tag "Line" 'line)
                (const :tag "Rectangle" 'rectangle)
@@ -121,21 +128,21 @@ If non-nil then snap to grid."
   :type 'boolean)
 
 (defcustom sketch-include-start-marker nil
-  "Start marker type"
+  "Start marker type."
   :type '(choice
                (const :tag "No marker" nil)
                (const :tag "Arrow" 'arrow)
           (const :tag "Dot" 'dot)))
 
 (defcustom sketch-include-mid-marker nil
-  "Mid marker type"
+  "Mid marker type."
   :type '(choice
                (const :tag "No marker" nil)
                (const :tag "Arrow" 'arrow)
           (const :tag "Dot" 'dot)))
 
 (defcustom sketch-include-end-marker nil
-  "End marker type"
+  "End marker type."
   :type '(choice
                (const :tag "No marker" nil)
                (const :tag "Arrow" 'arrow)
@@ -187,7 +194,7 @@ STOPS is a list of percentage/color pairs."
 (defun sketch-group (id &rest args)
   (apply #'svg-group
          :id id
-         :transform "translate(0 0)"
+         :transform "translate(0,0)"
          args))
 
 (define-minor-mode sketch-mode
@@ -200,7 +207,9 @@ transient."
     ;; ([sketch drag-mouse-1] . sketch-interactively)
     ;; ([C-S-drag-mouse-1] . sketch-interactively)
     (,(kbd "C-c C-s") . sketch-transient))
-  (undo-tree-mode))
+  (if (boundp 'undo-tree-mode)
+      (undo-tree-mode)
+    (buffer-enable-undo)))
 
 (defun sketch-mapcons (fn &rest cons-cells)
   "Apply FN to list of car's and cdr's of CONS-CELLS.
@@ -247,7 +256,9 @@ VEC should be a cons or a list containing only number 
elements."
 (defvar-local show-layers '(0))
 
 (defun sketch--create-canvas (width height &optional grid-parameter)
-  "Create canvas for drawing svg using the mouse."
+  "Create canvas of size WIDTH x HEIGHT for drawing svg.
+Optionally set a custom GRID-PARAMETER (default is value of
+`sketch-default-grid-parameter')."
   (let ((width width)
         (height height))
     (setq svg-canvas (svg-create width height :stroke "gray"))
@@ -290,7 +301,7 @@ VEC should be a cons or a list containing only number 
elements."
 ;;;###autoload
 (defun sketch (arg)
   "Initialize or switch to (new) SVG image.
-With prefix argument, create sketch using default (customizable)
+With prefix ARG, create sketch using default (customizable)
 values"
   (interactive "P")
   (let ((buffer (get-buffer "*sketch*")))
@@ -325,9 +336,9 @@ values"
       (car choices))))
 
 (cl-defmethod transient-infix-value ((obj sketch-variable:choices))
-  "Return the value of OBJ's `value' slot if not nil,
-     else return value of OBJ's `default' slot if not nil,
-     else return nil"
+  "Return the value of OBJ's `value' slot if non-nil,
+else return value of OBJ's `default' slot if non-nil,
+else return nil"
   (let ((default (oref obj default)))
     (if-let ((value (oref obj value)))
         (concat (oref obj argument) value)
@@ -458,8 +469,9 @@ values"
    [([sketch drag-mouse-1] "Draw object"  sketch-interactively-1)
     ([sketch mouse-1] "Draw text"  sketch-text-interactively)
     ([sketch C-S-drag-mouse-1] "Crop image" sketch-crop)]
-   [("T" "Transfrom object" sketch-modify-object)
-    ("r" "Remove object" sketch-remove-object)]
+   [("t" "Transform object" sketch-modify-object)
+    ("r" "Remove object" sketch-remove-object)
+    ("i" "Import object" sketch-import)]
     [("u" "Undo" sketch-undo)
     ("U" "Redo" sketch-redo)]
    [("d" "Show definition" sketch-show-definition)
@@ -518,10 +530,10 @@ values"
   ;; (let ((variable (oref obj variable)))
   (oset obj value value)
   (setq sketch-show-labels value)
-  (magit-refresh)
-  (sketch-redraw)
-  (unless (or value transient--prefix)
-    (message "Unset %s" variable)))
+  (auto-revert-buffers)
+  (sketch-redraw))
+  ;; (unless (or value transient--prefix)
+  ;;   (message "Unset %s" variable)))
 
 (transient-define-infix sketch-cycle-labels ()
   :description "Show labels"
@@ -547,23 +559,35 @@ values"
                                :x (+ (dom-attr node 'x) 2)
                                :y (+ (dom-attr node 'y)
                                      (- (dom-attr node 'height) 2))
-                               :font-size 20
+                               :font-size sketch-label-size
                                :stroke "red"
                                :fill "red"))
               ('line (svg-text svg-labels
                                (dom-attr node 'id)
                                :x (dom-attr node 'x1)
                                :y (dom-attr node 'y1)
-                               :font-size 20
+                               :font-size sketch-label-size
                                :stroke "red"
                                :fill "red"))
               ((or 'circle 'ellipse) (svg-text svg-labels
                                                (dom-attr node 'id)
                                                :x (dom-attr node 'cx)
                                                :y (dom-attr node 'cy)
-                                               :font-size 20
+                                               :font-size sketch-label-size
                                                :stroke "red"
-                                               :fill "red"))))
+                                               :fill "red"))
+              ('g (let ((s (dom-attr node
+                                     'transform)))
+                    (string-match "translate\(\\([0-9]*\\)[, ]*\\([0-9]*\\)" s)
+                    (let ((x (match-string 1 s))
+                          (y (match-string 2 s)))
+                      (svg-text svg-labels
+                                (dom-attr node 'id)
+                                :x x
+                                :y y
+                                :font-size sketch-label-size
+                                :stroke "red"
+                                :fill "red"))))))
         nodes)
     svg-labels))
 
@@ -591,7 +615,8 @@ values"
                            ("line" "l")
                            ("rectangle" "r")
                            ("circle" "c")
-                           ("ellipse" "e"))))
+                           ("ellipse" "e")
+                           ("group" "g"))))
          (idx 0)
          (label (concat prefix (number-to-string idx)))
          (labels (sketch-labels-list)))
@@ -658,7 +683,7 @@ values"
     ;;     (if-let (buf (get-buffer"*sketch-root*"))
     ;;         (sketch-update-lisp-window sketch-root buf)
     ;;       (sketch-update-lisp-window lisp lisp-buffer))))
-    (setq sketch-root (append (subseq sketch-root 0 2) (list (nth (car 
show-layers) sketch-layers-list))))
+    (setq sketch-root (append (seq-subseq sketch-root 0 2) (list (nth (car 
show-layers) sketch-layers-list))))
     (dolist (layer (cdr show-layers))
       (setq sketch-root (append sketch-root (list (nth layer 
sketch-layers-list)))))
     (setq sketch-svg (append svg-canvas
@@ -680,6 +705,7 @@ values"
                                                                                
     (cddr coords)))))))))
                   (prin1-to-string sketch-root))))
 
+
 (transient-define-suffix sketch-interactively-1 (event)
   (interactive "@e")
   (let* ((args (when transient-current-prefix (transient-args 
'sketch-transient)))
@@ -728,6 +754,42 @@ values"
                                           (sketch-labels-list)))
   (sketch-redraw))
 
+(transient-define-suffix sketch-insert-snippet (event)
+  (interactive "@e")
+  (let ((coords (posn-object-x-y (event-start event)))
+        (node (oref transient-current-prefix value))
+        (label (sketch-create-label "group")))
+    (dom-set-attribute node
+                       'transform
+                       (format "translate(%s,%s)" (car coords) (cdr coords)))
+    (dom-set-attribute node
+                       'id
+                       label)
+    (dom-append-child (nth active-layer sketch-layers-list) node)
+    (sketch-redraw)
+    (sketch-modify-object label)))
+
+(transient-define-prefix sketch-import (svg-file)
+  [([sketch mouse-1] "Insert snippet"  sketch-insert-snippet)]
+  (interactive (list (let ((default-directory (concat
+                                               (file-name-directory 
(locate-library "sketch-mode"))
+                                               "snippet-files/")))
+                       (read-file-name "Import (object) from file: "))))
+  (let* ((dom (sketch-snippet-get-dom svg-file))
+         (has-groups (dom-by-tag dom 'g)))
+    (when has-groups (sketch-snippets-add-labels dom))
+    (let* ((idx (when has-groups (read-number "Number of object for import: 
")))
+           (snippet (if (dom-by-tag dom 'g)
+                        (dom-elements dom 'id (number-to-string idx))
+                      (list (dom-append-child
+                             (sketch-group (sketch-create-label "group"))
+                             (car (dom-children dom)))))))
+      (sketch-redraw)
+      (transient-setup 'sketch-import nil nil :value (car snippet)))))
+
+;; (transient-define-suffix sketch-import-object (svg-file)
+;;   (interactive "fImport object from file: ")
+
 (define-minor-mode sketch-lisp-mode
   "Minor mode for svg lisp buffers."
   :lighter "sketch"
@@ -769,21 +831,31 @@ values"
 
 ;; (defvar sketch-undo-redo nil)
 
-(transient-define-suffix sketch-undo ()
-  (interactive)
-  (undo-tree-undo)
+(transient-define-suffix sketch-undo (&optional count)
+  (interactive "*p")
+  (cond ((fboundp 'evil-undo)
+         (evil-undo count))
+        ((fboundp 'undo-tree-undo)
+         (undo-tree-undo))
+        (t (undo)))
   (setq sketch-root (read (buffer-string)))
-  (setq sketch-layers-list (dom-elements sketch-root 'id "layer")))
+  (setq sketch-layers-list (dom-elements sketch-root 'id "layer"))
+  (unless sketch-layers-list (sketch-add-layer)))
   ;; (let ((sketch-reverse (nreverse sketch-root)))
   ;;   (push (pop sketch-reverse) sketch-undo-redo)
   ;;   (setq sketch-root (nreverse sketch-reverse)))
   ;; (sketch-redraw))
 
-(transient-define-suffix sketch-redo ()
-  (interactive)
-  (undo-tree-redo)
+(transient-define-suffix sketch-redo (count)
+  (interactive "*p")
+  (cond ((fboundp 'evil-undo)
+         (evil-redo count))
+        ((fboundp 'undo-tree-redo)
+         (undo-tree-redo))
+        (t (user-error "This command requires `undo-tree' or `evil' to be 
available")))
   (setq sketch-root (read (buffer-string)))
-  (setq sketch-layers-list (dom-elements sketch-root 'id "layer")))
+  (setq sketch-layers-list (dom-elements sketch-root 'id "layer"))
+  (unless sketch-layers-list (sketch-add-layer)))
   ;; (let ((sketch-reverse (nreverse sketch-root)))
   ;;   (push (pop sketch-undo-redo) sketch-reverse)
   ;;   (setq sketch-root (nreverse sketch-reverse)))
@@ -813,7 +885,7 @@ values"
                              ;;               (if sketch-include-end-marker
                              ;;                   "url(#arrow)"
                              ;;                 "none"))))
-    (apply #'svg-text sketch-root text :x (car coords) :y (cdr coords) 
object-props))
+    (apply #'svg-text (nth active-layer sketch-layers-list) text :x (car 
coords) :y (cdr coords) object-props))
     (sketch-redraw))
 
 (transient-define-infix sketch-select-font ()
@@ -914,7 +986,7 @@ that should be added to the image. Initial value: (0)"
     (setq svg-canvas (svg-create new-width new-height :stroke "gray"))
     (svg-marker svg-canvas "arrow" 8 8 "black" t)
     (svg-rectangle svg-canvas 0 0 new-width new-height :fill "white")
-    (setq sketch-root (svg-translate "root" (car start-coords) (cdr 
start-coords)))
+    (setq sketch-root (sketch--svg-translate (car start-coords) (cdr 
start-coords)))
     (sketch-redraw)))
 
 (defun sketch-image (svg &rest props)
@@ -941,40 +1013,147 @@ PROPS is passed on to `create-image' as its PROPS list."
     (cl-incf (alist-get coord props) amount))
   (sketch-redraw object-def buffer))
 
+(defun sketch-parse-transform-value (value)
+  (let ((transforms (mapcar (lambda (val)
+                              (split-string val "[(,)]" t))
+                            (split-string value))))
+    (mapcar (lambda (x)
+              (cons (intern (car x)) (mapcar (lambda (val)
+                                      (string-to-number val))
+                                    (cdr x))))
+            transforms)))
+
+(defun sketch-format-transfrom-value (value)
+  (string-join (mapcar (lambda (x) (concat (symbol-name (car x))
+                                           "("
+                                           (number-to-string (cadr x))
+                                           (if-let (y (caddr x))
+                                               (concat "," (number-to-string 
y)))
+                                           ")"))
+                       value)
+               " "))
+
+(defun sketch-group-translate (buffer object-def direction &optional fast)
+  (let ((transform (sketch-parse-transform-value
+                (dom-attr object-def
+                          'transform)))
+        (amount (if fast
+                  10
+                1)))
+    (pcase direction
+      ('up (cl-decf (cadr (alist-get 'translate transform)) amount))
+      ('down (cl-incf (cadr (alist-get 'translate transform)) amount)))
+    (dom-set-attribute object-def
+                       'transform
+                       (sketch-format-transfrom-value transform))
+    (sketch-redraw object-def buffer)))
+
+(defun sketch-group-scale (buffer object-def direction &optional fast)
+  (let ((transform (sketch-parse-transform-value
+                    (dom-attr object-def
+                              'transform)))
+        (amount (if fast
+                    1
+                  0.1)))
+    (unless (alist-get 'scale transform)
+      (push '(scale 1) transform))
+    (pcase direction
+      ('up (cl-incf (car (alist-get 'scale transform)) amount))
+      ('down (cl-decf (car (alist-get 'scale transform)) amount)))
+    (dom-set-attribute object-def
+                       'transform
+                       (sketch-format-transfrom-value transform))
+    (sketch-redraw object-def buffer)))
+
+(transient-define-suffix sketch-group-scale-up (args)
+  (interactive (list (oref transient-current-prefix value)))
+  (let* ((object (transient-arg-value "--object=" args))
+         (buffer (transient-arg-value "--buffer=" args))
+         (object-def (dom-by-id sketch-svg (format "^%s$" object))))
+    (sketch-group-scale buffer (car object-def) 'up)))
+
+(transient-define-suffix sketch-group-scale-up-fast (args)
+  (interactive (list (oref transient-current-prefix value)))
+  (let* ((object (transient-arg-value "--object=" args))
+         (buffer (transient-arg-value "--buffer=" args))
+         (object-def (dom-by-id sketch-svg (format "^%s$" object))))
+    (sketch-group-scale buffer (car object-def) 'up t)))
+
+(transient-define-suffix sketch-group-scale-down (args)
+  (interactive (list (oref transient-current-prefix value)))
+  (let* ((object (transient-arg-value "--object=" args))
+         (buffer (transient-arg-value "--buffer=" args))
+         (object-def (dom-by-id sketch-svg (format "^%s$" object))))
+    (sketch-group-scale buffer (car object-def) 'down)))
+
+(transient-define-suffix sketch-group-scale-down-fast (args)
+  (interactive (list (oref transient-current-prefix value)))
+  (let* ((object (transient-arg-value "--object=" args))
+         (buffer (transient-arg-value "--buffer=" args))
+         (object-def (dom-by-id sketch-svg (format "^%s$" object))))
+    (sketch-group-scale buffer (car object-def) 'down t)))
+
+
 ;; TODO 'refactor' subsequent suffixes (e.g. create general function/macro)
 (transient-define-suffix sketch-translate-down (args)
-  (interactive (list (oref transient-current-prefix :value)))
+  (interactive (list (oref transient-current-prefix value)))
   (let* ((object (transient-arg-value "--object=" args))
          (buffer (transient-arg-value "--buffer=" args))
          (object-def (dom-by-id sketch-svg (format "^%s$" object)))
          (props (cadar object-def)))
-    (sketch-translate-object buffer object-def props '(y1 y2) 1)))
+    (if (eq (caar object-def) 'g)
+        (sketch-group-translate buffer (car object-def) 'down)
+    (sketch-translate-object buffer
+                             object-def
+                             props
+                             '(y1 y2) 1))))
 
 (transient-define-suffix sketch-translate-fast-down (args)
-  (interactive (list (oref transient-current-prefix :value)))
+  (interactive (list (oref transient-current-prefix value)))
   (let* ((object (transient-arg-value "--object=" args))
          (buffer (transient-arg-value "--buffer=" args))
          (object-def (dom-by-id sketch-svg (format "^%s$" object)))
          (props (cadar object-def)))
-    (sketch-translate-object buffer object-def props '(y1 y2) 10)))
+    (if (eq (caar object-def) 'g)
+        (sketch-group-translate buffer (car object-def) 'down t)
+    (sketch-translate-object buffer
+                             object-def
+                             props
+                             (pcase (caar object-def)
+                               ('line '(y1 y2)))
+                             10))))
 
 (transient-define-suffix sketch-translate-up (args)
-  (interactive (list (oref transient-current-prefix :value)))
+  (interactive (list (oref transient-current-prefix value)))
   (let* ((object (transient-arg-value "--object=" args))
          (buffer (transient-arg-value "--buffer=" args))
          (object-def (dom-by-id sketch-svg (format "^%s$" object)))
          (props (cadar object-def)))
-    (sketch-translate-object buffer object-def props '(y1 y2) -1)))
+    (if (eq (caar object-def) 'g)
+        (sketch-group-translate buffer (car object-def) 'up)
+    (sketch-translate-object buffer
+                             object-def
+                             props
+                             (pcase (caar object-def)
+                               ('line '(y1 y2)))
+                             -1))))
 
 (transient-define-suffix sketch-translate-fast-up (args)
-  (interactive (list (oref transient-current-prefix :value)))
+  (interactive (list (oref transient-current-prefix value)))
   (let* ((object (transient-arg-value "--object=" args))
          (buffer (transient-arg-value "--buffer=" args))
          (object-def (dom-by-id sketch-svg (format "^%s$" object)))
          (props (cadar object-def)))
-    (sketch-translate-object buffer object-def props '(y1 y2) -10)))
-
-(transient-define-prefix sketch-modify-object ()
+    (if (eq (caar object-def) 'g)
+        (sketch-group-translate buffer (car object-def) 'up t)
+    (sketch-translate-object buffer
+                             object-def
+                             props
+                             (pcase (caar object-def)
+                               ('line '(y1 y2)))
+                             -10))))
+
+(transient-define-prefix sketch-modify-object (&optional group)
   "Set object properties."
   :transient-suffix 'transient--do-call
   ["Properties"
@@ -982,12 +1161,16 @@ PROPS is passed on to `create-image' as its PROPS list."
   [[("<down>" "down" sketch-translate-down)
    ("<up>" "up" sketch-translate-up)]
    [("S-<down>" "fast down" sketch-translate-fast-down)
-    ("S-<up>" "fast up" sketch-translate-fast-up)]]
+    ("S-<up>" "fast up" sketch-translate-fast-up)]
+   [("u" "scale up" sketch-group-scale-up)
+    ("d" "scale up" sketch-group-scale-down)]]
   [("l" sketch-cycle-labels)
    ("q" "Quit" transient-quit-one)]
   (interactive)
-  (let* ((object (completing-read "Transform element with id: "
-                                 (sketch-labels-list)))
+  (let* ((object (if group
+                     group
+                   (completing-read "Transform element with id: "
+                                    (sketch-labels-list))))
          (buffer (get-buffer-create (format "*sketch-object-%s*" object))))
     (display-buffer buffer '(display-buffer-in-side-window . ((side . right) 
(window-width . 70))))
     (pp (cadar (dom-by-id sketch-svg (format "^%s$" object))) buffer)
@@ -1004,61 +1187,62 @@ PROPS is passed on to `create-image' as its PROPS list."
     (with-current-buffer buffer
       (erase-buffer)
       (pp lisp (current-buffer))
-      (end-of-buffer)))
+      (goto-char (point-max))))
 
 ;;; import/snippets
 
+(defun sketch-snippet-get-dom (svg-file)
+  (interactive "fCreate dom from file: ")
+  (with-temp-buffer "svg"
+                    (insert-file-contents-literally svg-file)
+                    (xml-remove-comments (point-min) (point-max))
+                    (libxml-parse-xml-region (point-min) (point-max))))
+
 (defun sketch-snippets-add-ids (dom)
   (let ((idx 0))
     (dolist (n (dom-by-tag dom 'g))
       (dom-set-attribute n 'id (number-to-string idx))
       (setq idx (1+ idx)))))
 
-(defun sketch-snippets-add-labels (svg-file)
+(defun sketch-snippets-add-labels (dom)
   (interactive "f")
-  (let (dom)
-    (with-temp-buffer "svg"
-                      (insert-file-contents-literally svg-file)
-                      (xml-remove-comments (point-min) (point-max))
-                      (setq dom (libxml-parse-xml-region (point-min) 
(point-max)))
-                      (sketch-snippets-add-ids dom))
-    (mapc (lambda (n)
-            (let* ((s (dom-attr n 'transform))
-                   (coords (when s
-                             (split-string
-                              (string-trim
-                               s
-                               "translate(" ")")
-                              ","))))
-              (svg-text dom
-                        (dom-attr n 'id)
-                        :x (car coords)
-                        :y (cadr coords)
-                        :font-size 10
-                        :stroke "red"
-                        :fill "red")))
-          (cdr (dom-by-tag dom 'g)))
-    (unless sketch-mode
-      (user-error "Not in sketch-mode buffer"))
-    ;; (save-current-buffer
-      ;; (when lisp-buffer
-      ;;   (sketch-update-lisp-window lisp lisp-buffer))
-      ;; (let ((lisp-window (or (get-buffer-window "*sketch-root*")
-      ;;                        (get-buffer-window lisp-buffer))))
-      ;;   (unless (string= (buffer-name (window-buffer lisp-window)) 
"*sketch*")
-      ;;     (if-let (buf (get-buffer"*sketch-root*"))
-      ;;         (sketch-update-lisp-window sketch-root buf)
-      ;;       (sketch-update-lisp-window lisp lisp-buffer))))
-      ;; (setq sketch-root (append (subseq sketch-root 0 2) (list (nth (car 
show-layers) svg-layers))))
-      ;; (dolist (layer (cdr show-layers))
-      ;;   (setq sketch-root (append sketch-root (list (nth layer 
svg-layers)))))
-      ;; (setq sketch-svg (append svg-canvas
-      ;;                          (when sketch-show-grid (list sketch-grid))
-      ;;                          (when sketch-show-labels (list 
(sketch-labels)))
-      ;;                          (list sketch-root)))
-    (erase-buffer) ;; a (not exact) alternative is to use (kill-backward-chars 
1)
-    (insert-image (svg-image dom))
-    (print dom)))
-
- (provide 'sketch-mode)
+  (sketch-snippets-add-ids dom)
+  (mapc (lambda (n)
+          (let* ((s (dom-attr n 'transform))
+                 (coords (when s
+                           (split-string
+                            (string-trim
+                             s
+                             "translate(" ")")
+                            ","))))
+            (svg-text dom
+                      (dom-attr n 'id)
+                      :x (car coords)
+                      :y (cadr coords)
+                      :font-size 10
+                      :stroke "red"
+                      :fill "red")))
+        (cdr (dom-by-tag dom 'g)))
+  (unless sketch-mode
+    (user-error "Not in sketch-mode buffer"))
+  ;; (save-current-buffer
+  ;; (when lisp-buffer
+  ;;   (sketch-update-lisp-window lisp lisp-buffer))
+  ;; (let ((lisp-window (or (get-buffer-window "*sketch-root*")
+  ;;                        (get-buffer-window lisp-buffer))))
+  ;;   (unless (string= (buffer-name (window-buffer lisp-window)) "*sketch*")
+  ;;     (if-let (buf (get-buffer"*sketch-root*"))
+  ;;         (sketch-update-lisp-window sketch-root buf)
+  ;;       (sketch-update-lisp-window lisp lisp-buffer))))
+  ;; (setq sketch-root (append (seq-subseq sketch-root 0 2) (list (nth (car 
show-layers) svg-layers))))
+  ;; (dolist (layer (cdr show-layers))
+  ;;   (setq sketch-root (append sketch-root (list (nth layer svg-layers)))))
+  ;; (setq sketch-svg (append svg-canvas
+  ;;                          (when sketch-show-grid (list sketch-grid))
+  ;;                          (when sketch-show-labels (list (sketch-labels)))
+  ;;                          (list sketch-root)))
+  (erase-buffer) ;; a (not exact) alternative is to use (kill-backward-chars 1)
+  (insert-image (svg-image dom)))
+
+(provide 'sketch-mode)
 ;;; sketch-mode.el ends here
diff --git a/snippet-files/circuit_components.svg 
b/snippet-files/circuit_components.svg
new file mode 100644
index 0000000..5065cf5
--- /dev/null
+++ b/snippet-files/circuit_components.svg
@@ -0,0 +1,1417 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- created using Vector Blocks (http://bretmulvey.com/VectorBlocks) -->
+<svg xmlns="http://www.w3.org/2000/svg"; width="1400" height="2560">
+    <g stroke="#000" stroke-width="2">
+        <path d="m 1200.8104133605957,1098.3416372085921 16,0"/>
+        <path d="m 720.8104133605957,1178.3416372085921 16,0"/>
+        <path d="m 720.8104133605957,1162.3416372085921 16,0"/>
+        <path d="m 144.8104133605957,250.34163720859215 16,0"/>
+    </g>
+    <g transform="translate(0.8104133605957031 2.3416372085921466)" 
style="font-family: Sans-Serif" stroke-width="2" stroke="#000" fill="none">
+        <text stroke="none" fill="#000" x="40" y="48" style="font-size: 
16pt;text-anchor: start;font-weight: normal;">Vector Blocks Component 
Gallery</text>
+        <text stroke="none" fill="#000" x="40" y="78" style="font-size: 
12pt;text-anchor: start;font-weight: normal;">From Vector Blocks browser-based 
circuit schematic editor at http://bretmulvey.com/VectorBlocks</text>
+        <text stroke="none" fill="#000" x="40" y="108" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">License: Creative Commons 
Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) </text>
+        <text stroke="none" fill="#000" x="40" y="124" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Schematics created using these 
components or derivates, or created using the Vector Blocks application,</text>
+        <text stroke="none" fill="#000" x="40" y="140" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">do not require attribution. 
Schematic drawing applications that incorporate these components as part of 
a</text>
+        <text stroke="none" fill="#000" x="40" y="156" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">graphics library require 
attribution as follows: "Some schematic symbols are derived from Vector Blocks 
at</text>
+        <text stroke="none" fill="#000" x="40" y="172" style="font-size: 
8pt;text-anchor: start;font-weight: 
normal;">http://bretmulvey.com/VectorBlocks";</text>
+        <text stroke="none" fill="#000" x="200" y="252" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Simple wire</text>
+        <g transform="translate(112, 240)">
+            <path d="m 8,16 0,-8 8,0"/>
+        </g>
+        <g transform="translate(80, 240)">
+            <path d="m 8,0 0,16"/>
+            <path d="m 8,8 8,0"/>
+            <circle fill="#000" stroke="none" cy="8" cx="8" r="3"/>
+        </g>
+        <g transform="translate(48, 240)">
+            <path d="m 0,8 16,0"/>
+            <path d="m 8,0 0,16"/>
+            <circle fill="#000" stroke="none" cy="8" cx="8" r="3"/>
+        </g>
+        <g transform="translate(48, 272)">
+            <path d="m 0,8 16,0"/>
+            <path d="m 8,0 0,6"/>
+            <path d="m 8,16 0,-6"/>
+        </g>
+        <g transform="translate(112, 272)">
+            <path d="m 0,8 8,0 32,32 8,0"/>
+            <path d="m 0,40 8,0 14,-14"/>
+            <path d="m 48,8 -8,0 -14,14"/>
+        </g>
+        <g transform="translate(112, 336)">
+            <path d="m 0,8 8,0 32,32 0,8"/>
+            <path d="m 0,40 8,0 14,-14"/>
+            <path d="m 40,0 0,8 -14,14"/>
+        </g>
+        <text stroke="none" fill="#000" x="200" y="284" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Cross-overs</text>
+        <g fill="none" stroke-dasharray="1 2 2 2 2 2 2 2 1" 
transform="translate(144, 400)">
+            <path d="m 0,8 16,0"/>
+        </g>
+        <g fill="none" stroke-dasharray="1 2 2 2 2 2 2 2 1" 
transform="translate(112, 400)">
+            <path d="m 8,16 0,-8 8,0"/>
+        </g>
+        <text stroke="none" fill="#000" x="200" y="412" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Dotted wire</text>
+        <g transform="translate(144, 432) matrix(-1, 0, 0, -1, 16, 16)">
+            <path d="m 0,8 16,0"/>
+            <path stroke-dasharray="2" d="m 7,0 10,0"/>
+            <path stroke-dasharray="2" d="m 7,16 10,0"/>
+            <ellipse ry="8" rx="4" cy="8" cx="8"/>
+        </g>
+        <g transform="translate(112, 432)">
+            <path d="m 0,8 16,0"/>
+            <path stroke-dasharray="2" d="m -1,0 18,0"/>
+            <path stroke-dasharray="2" d="m -1,16 18,0"/>
+        </g>
+        <g fill="#000" transform="translate(80, 432)">
+            <path d="m 0,8 16,0"/>
+            <path stroke-dasharray="2" d="m -1,0 18,0"/>
+            <path stroke-dasharray="2" d="m -1,16 18,0"/>
+            <circle cy="16" cx="8" r="2"/>
+            <path d="m 8,16 0,16"/>
+        </g>
+        <text stroke="none" fill="#000" x="200" y="444" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Shielded wire</text>
+        <g transform="translate(144, 480)">
+            <path d="m 16,8 -2,0"/>
+            <path stroke-linejoin="bevel" d="m 7,2 8,6 -8,6"/>
+        </g>
+        <g transform="translate(128, 480)">
+            <path d="m 0,8 8,0"/>
+            <path d="m 1,2 8,6 -8,6"/>
+        </g>
+        <g transform="translate(80, 480)">
+            <path d="m 16,8 -1,0"/>
+            <path d="m 10,2 a 6.3,6.3 0 0 1 0,12"/>
+        </g>
+        <g transform="translate(64, 480)">
+            <path d="m 0,8 5,0"/>
+            <circle fill="#FFF" cy="8" cx="8" r="3"/>
+        </g>
+        <g transform="translate(144, 512) matrix(-1, 0, 0, -1, 16, 16)">
+            <path d="m 0,8 6,0"/>
+            <path d="m 6,0 a 8,8 0 0 0 0,8 a 8,8 0 0 1 0,8"/>
+        </g>
+        <g transform="translate(128, 512)">
+            <path d="m 0,8 6,0"/>
+            <path d="m 6,0 a 8,8 0 0 0 0,8 a 8,8 0 0 1 0,8"/>
+        </g>
+        <g fill="#FFF" transform="translate(80, 512)">
+            <path d="m 0,8 5,0"/>
+            <rect y="5" x="5" height="6" width="6"/>
+        </g>
+        <g fill="#000" transform="translate(48, 512)">
+            <path d="m 0,8 5,0"/>
+            <rect y="5" x="5" height="6" width="6"/>
+        </g>
+        <text stroke="none" fill="#000" x="200" y="492" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Termination points</text>
+        <g transform="translate(112, 544)">
+            <path d="m 0,8 12,0 2,4 4,-8 4,8 4,-8 4,8 4,-8 2,4 12,0"/>
+        </g>
+        <text stroke="none" fill="#000" x="200" y="556" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Resistor</text>
+        <g transform="translate(48, 544)">
+            <path d="m 0,8 48,0"/>
+            <rect fill="#FFF" y="4" x="12" height="8" width="24"/>
+        </g>
+        <g transform="translate(112, 576)">
+            <path d="m 0,8 12,0 2,4 4,-8 4,8 4,-8 4,8 4,-8 2,4 12,0"/>
+            <path d="m 15,17 19,-19"/>
+            <path d="m 29,-3 6,6 2,-8" fill="#000" stroke="none"/>
+        </g>
+        <g transform="translate(48, 576)">
+            <path d="m 0,8 48,0"/>
+            <rect fill="#FFF" y="4" x="12" height="8" width="24"/>
+            <path d="m 15,17 19,-19"/>
+            <path d="m 29,-3 6,6 2,-8" fill="#000" stroke="none"/>
+        </g>
+        <g transform="translate(112, 608)">
+            <path d="m 0,8 12,0 2,4 4,-8 4,8 4,-8 4,8 4,-8 2,4 12,0"/>
+            <path d="m 19,-2 4.5,-9"/>
+            <path fill="#000" stroke="none" d="m 18,0 0,-7.5 6,3 z"/>
+            <path d="m 27,-2 4.5,-9"/>
+            <path fill="#000" stroke="none" d="m 26,0 0,-7.5 6,3 z"/>
+        </g>
+        <g transform="translate(48, 608)">
+            <path d="m 0,8 48,0"/>
+            <rect fill="#FFF" y="4" x="12" height="8" width="24"/>
+            <path d="m 19,-2 4.5,-9"/>
+            <path fill="#000" stroke="none" d="m 18,0 0,-7.5 6,3 z"/>
+            <path d="m 27,-2 4.5,-9"/>
+            <path fill="#000" stroke="none" d="m 26,0 0,-7.5 6,3 z"/>
+        </g>
+        <g transform="translate(112, 640)">
+            <path d="m 0,8 12,0 2,4 4,-8 4,8 4,-8 4,8 4,-8 2,4 12,0"/>
+            <path d="m 7,17 8,0 19,-19"/>
+        </g>
+        <g transform="translate(48, 640)">
+            <path d="m 0,8 48,0"/>
+            <rect fill="#FFF" y="4" x="12" height="8" width="24"/>
+            <path d="m 7,17 8,0 19,-19"/>
+        </g>
+        <g transform="translate(112, 672)">
+            <path d="m 0,8 12,0 2,4 4,-8 4,8 4,-8 4,8 4,-8 2,4 12,0"/>
+            <path d="m 24,32 0,-12"/>
+            <path fill="#000" stroke="none" d="m 24,13 4,8 -8,0 z"/>
+        </g>
+        <g transform="translate(48, 672)">
+            <path d="m 0,8 48,0"/>
+            <rect fill="#FFF" y="4" x="12" height="8" width="24"/>
+            <path d="m 24,32 0,-12"/>
+            <path fill="#000" stroke="none" d="m 24,13 4,8 -8,0 z"/>
+        </g>
+        <text stroke="none" fill="#000" x="200" y="588" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Variable resistor</text>
+        <text stroke="none" fill="#000" x="200" y="620" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Photoresistor</text>
+        <text stroke="none" fill="#000" x="200" y="652" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Thermistor</text>
+        <text stroke="none" fill="#000" x="200" y="684" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Potentiometer</text>
+        <g transform="translate(112, 720)">
+            <path d="m 0,8 21,0"/>
+            <path d="m 21,0 0,16"/>
+            <path d="m 27,0 0,16"/>
+            <path d="m 27,8 21,0"/>
+        </g>
+        <g transform="translate(48, 720)">
+            <path d="m 0,8 20,0"/>
+            <path stroke-width="6" d="m 19,-2 0,20"/>
+            <path stroke-width="6" d="m 29,-2 0,20"/>
+            <path d="m 48,8 -20,0"/>
+        </g>
+        <g transform="translate(112, 752)">
+            <path d="m 0,8 22,0"/>
+            <path d="m 21,0 a 20,20 0 0 1 0,16"/>
+            <path d="m 27,0 0,16"/>
+            <path d="m 48,8 -21,0"/>
+            <path d="m 32,-2 8,0"/>
+            <path d="m 36,-6 0,8"/>
+        </g>
+        <g transform="translate(48, 752)">
+            <path d="m 0,8 17,0"/>
+            <rect height="18" width="4" y="-1" x="27" fill="#FFF"/>
+            <path stroke-width="6" d="m 19,-2 0,20"/>
+            <path d="m 48,8 -17,0"/>
+            <path d="m 34,-2 8,0"/>
+            <path d="m 38,-6 0,8"/>
+        </g>
+        <g transform="translate(112, 784)">
+            <path d="m 0,8 21,0"/>
+            <path d="m 21,0 0,16"/>
+            <path d="m 27,0 0,16"/>
+            <path d="m 48,8 -21,0"/>
+            <path d="m 15,17 19,-19"/>
+            <path d="m 29,-3 6,6 2,-8" fill="#000" stroke="none"/>
+        </g>
+        <g transform="translate(48, 784)">
+            <path d="m 0,8 20,0"/>
+            <path stroke-width="6" d="m 19,-2 0,20"/>
+            <path stroke-width="6" d="m 29,-2 0,20"/>
+            <path d="m 48,8 -20,0"/>
+            <path d="m 12,20 24,-24"/>
+            <path d="m 31,-5 6,6 2,-8" fill="#000" stroke="none"/>
+        </g>
+        <g transform="translate(112, 816)">
+            <path d="m 0,8 48,0"/>
+            <circle fill="#FFF" cy="8" cx="8" r="3"/>
+            <circle fill="#FFF" cy="8" cx="40" r="3"/>
+            <path d="m 16,4 16,0"/>
+            <path d="m 16,12 16,0"/>
+            <path d="m 24,12 0,20"/>
+        </g>
+        <text stroke="none" fill="#000" x="200" y="732" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Capacitor, unpolarized</text>
+        <text stroke="none" fill="#000" x="200" y="764" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Polarized capacitor</text>
+        <text stroke="none" fill="#000" x="200" y="796" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Variable capacitor</text>
+        <text stroke="none" fill="#000" x="200" y="828" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Feed-through capacitor</text>
+        <g transform="translate(112, 864)">
+            <path d="m 0,8 8,0 a 3,4 0 0 1 8,0 a 3,4 0 0 1 8,0 a 3,4 0 0 1 8,0 
a 3,4 0 0 1 8,0 l 8,0"/>
+        </g>
+        <g transform="translate(48, 864)">
+            <path d="m 8,16 0,-8 a 3,4 0 0 1 8,0 a 3,4 0 0 1 8,0 a 3,4 0 0 1 
8,0 a 3,4 0 0 1 8,0 l 0,8"/>
+        </g>
+        <g transform="translate(112, 896)">
+            <path d="m 0,8 8,0 a 3,4 0 0 1 8,0 a 3,4 0 0 1 8,0 a 3,4 0 0 1 8,0 
a 3,4 0 0 1 8,0 l 8,0"/>
+            <path d="m 12,20 24,-24"/>
+            <path d="m 31,-5 6,6 2,-8" fill="#000" stroke="none"/>
+        </g>
+        <g transform="translate(112, 928)">
+            <path d="m 0,8 8,0 a 3,4 0 0 1 8,0 a 3,4 0 0 1 8,0 a 3,4 0 0 1 8,0 
a 3,4 0 0 1 8,0 l 8,0"/>
+            <path d="m 24,8 0,8"/>
+        </g>
+        <g transform="translate(48, 928)">
+            <path d="m 0,8 8,0 a 3,4 0 0 1 8,0 a 3,4 0 0 1 8,0 a 3,4 0 0 1 8,0 
a 3,4 0 0 1 8,0 l 0,8"/>
+        </g>
+        <g transform="translate(80, 960)">
+            <path d="m 8,16 0,-8 a 3,4 0 0 1 8,0 a 3,4 0 0 1 8,0 a 3,4 0 0 1 
8,0 a 3,4 0 0 1 8,0 a 3,4 0 0 1 8,0 a 3,4 0 0 1 8,0 a 3,4 0 0 1 8,0 a 3,4 0 0 1 
8,0 l 0,8"/>
+        </g>
+        <g transform="translate(128, 992)">
+            <path d="m 8,5 16,0"/>
+            <path d="m 8,11 16,0"/>
+        </g>
+        <g fill="none" stroke-dasharray="0 2 4 4 4 2" 
transform="translate(128, 1024)">
+            <path d="m 8,5 16,0"/>
+            <path d="m 8,11 16,0"/>
+        </g>
+        <g fill="#000" stroke="none" transform="translate(144, 1056)">
+            <circle cy="0" cx="16" r="3"/>
+        </g>
+        <text stroke="none" fill="#000" x="200" y="876" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Inductor</text>
+        <text stroke="none" fill="#000" x="200" y="908" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Variable inductor</text>
+        <text stroke="none" fill="#000" x="200" y="940" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Tapped inductor</text>
+        <text stroke="none" fill="#000" x="200" y="972" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Longer-winding inductor</text>
+        <text stroke="none" fill="#000" x="200" y="1004" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Iron core</text>
+        <text stroke="none" fill="#000" x="200" y="1036" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Ferrite core</text>
+        <text stroke="none" fill="#000" x="200" y="1068" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Polarity dot</text>
+        <g fill="#000" transform="translate(112, 1088)">
+            <path d="m 0,8 48,0"/>
+            <path d="m 31,8 -13,-6 0,12 13,-6"/>
+            <path d="m 32,0 0,16"/>
+        </g>
+        <g fill="#000" transform="translate(112, 1120)">
+            <path d="m 0,8 48,0"/>
+            <path d="m 31,8 -13,-6 0,12 13,-6"/>
+            <path d="m 32,0 0,16"/>
+            <path d="m 19,-1 4.5,-9"/>
+            <path stroke="none" d="m 24.5,-12 0,7.5 -6,-3 z"/>
+            <path d="m 27,1 4.5,-9"/>
+            <path stroke="none" d="m 32.5,-10 0,7.5 -6,-3 z"/>
+        </g>
+        <g fill="#000" transform="translate(112, 1152)">
+            <path d="m 0,8 48,0"/>
+            <path d="m 31,8 -13,-6 0,12 13,-6"/>
+            <path d="m 32,0 0,16"/>
+            <path d="m 20,-3 4.5,-9"/>
+            <path stroke="none" d="m 19,-1 0,-7.5 6,3 z"/>
+            <path d="m 28,-2 4.5,-9"/>
+            <path stroke="none" d="m 27,0 0,-7.5 6,3 z"/>
+        </g>
+        <g fill="#000" transform="translate(112, 1184)">
+            <path d="m 0,8 48,0"/>
+            <path d="m 31,8 -13,-6 0,12 13,-6"/>
+            <path fill="none" d="m 36,-2 -4.5,2 1,16 -4.5,2"/>
+        </g>
+        <g fill="#000" transform="translate(112, 1216)">
+            <path d="m 0,8 48,0"/>
+            <path d="m 31,8 -13,-6 0,12 13,-6"/>
+            <path fill="none" d="m 35.5,0 a 2,2 0 0 0 -4,0"/>
+            <path stroke-linecap="round" d="m 31.5,0 1,16"/>
+            <path fill="none" d="m 32.5,16 a 2,2 0 0 1 -4,0"/>
+        </g>
+        <g fill="#000" transform="translate(112, 1248)">
+            <path d="m 0,8 48,0"/>
+            <path d="m 31,8 -13,-6 0,12 13,-6"/>
+            <path fill="none" d="m 28,0 4,0 0,16 -4,0"/>
+        </g>
+        <g fill="#000" transform="translate(112, 1280)">
+            <path d="m 0,8 32,0"/>
+            <path d="m 36,8 12,0"/>
+            <path d="m 31,8 -13,-6 0,12 13,-6"/>
+            <path d="m 32,0 0,16"/>
+            <path d="m 36,0 0,16"/>
+        </g>
+        <g fill="#000" transform="translate(112, 1312)">
+            <path d="m 0,8 48,0"/>
+            <path d="m 31,8 -13,-6 0,12 13,-6"/>
+            <path d="m 32,0 0,16"/>
+            <path d="m 36,0 0,16"/>
+        </g>
+        <g fill="#FFF" transform="translate(48, 1088)">
+            <path d="m 0,8 48,0"/>
+            <path d="m 31,8 -13,-6 0,12 13,-6"/>
+            <path d="m 32,0 0,16"/>
+        </g>
+        <g fill="#FFF" transform="translate(48, 1120)">
+            <path d="m 0,8 48,0"/>
+            <path d="m 31,8 -13,-6 0,12 13,-6"/>
+            <path d="m 32,0 0,16"/>
+            <path d="m 19,-1 4.5,-9"/>
+            <path fill="#000" stroke="none" d="m 24.5,-12 0,7.5 -6,-3 z"/>
+            <path d="m 27,1 4.5,-9"/>
+            <path fill="#000" stroke="none" d="m 32.5,-10 0,7.5 -6,-3 z"/>
+        </g>
+        <g fill="#FFF" transform="translate(48, 1152)">
+            <path d="m 0,8 48,0"/>
+            <path d="m 31,8 -13,-6 0,12 13,-6"/>
+            <path d="m 32,0 0,16"/>
+            <path d="m 20,-3 4.5,-9"/>
+            <path fill="#000" stroke="none" d="m 19,-1 0,-7.5 6,3 z"/>
+            <path d="m 28,-2 4.5,-9"/>
+            <path fill="#000" stroke="none" d="m 27,0 0,-7.5 6,3 z"/>
+        </g>
+        <g fill="#FFF" transform="translate(48, 1184)">
+            <path d="m 0,8 48,0"/>
+            <path d="m 31,8 -13,-6 0,12 13,-6"/>
+            <path fill="none" d="m 36,-2 -4.5,2 1,16 -4.5,2"/>
+        </g>
+        <g fill="#FFF" transform="translate(48, 1216)">
+            <path d="m 0,8 48,0"/>
+            <path d="m 31,8 -13,-6 0,12 13,-6"/>
+            <path fill="none" d="m 35.5,0 a 2,2 0 0 0 -4,0"/>
+            <path stroke-linecap="round" d="m 31.5,0 1,16"/>
+            <path fill="none" d="m 32.5,16 a 2,2 0 0 1 -4,0"/>
+        </g>
+        <g fill="#FFF" transform="translate(48, 1248)">
+            <path d="m 0,8 48,0"/>
+            <path d="m 31,8 -13,-6 0,12 13,-6"/>
+            <path fill="none" d="m 28,0 4,0 0,16 -4,0"/>
+        </g>
+        <g fill="#FFF" transform="translate(48, 1280)">
+            <path d="m 0,8 32,0"/>
+            <path d="m 36,8 12,0"/>
+            <path d="m 31,8 -13,-6 0,12 13,-6"/>
+            <path d="m 32,0 0,16"/>
+            <path d="m 36,0 0,16"/>
+        </g>
+        <g fill="#FFF" transform="translate(48, 1312)">
+            <path d="m 0,8 48,0"/>
+            <path d="m 31,8 -13,-6 0,12 13,-6"/>
+            <path d="m 32,0 0,16"/>
+            <path d="m 36,0 0,16"/>
+        </g>
+        <text stroke="none" fill="#000" x="200" y="1100" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Diode</text>
+        <text stroke="none" fill="#000" x="200" y="1132" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Light-emitted diode (LED)</text>
+        <text stroke="none" fill="#000" x="200" y="1164" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Photodiode</text>
+        <text stroke="none" fill="#000" x="200" y="1196" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Zener diode</text>
+        <text stroke="none" fill="#000" x="200" y="1228" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Schottky diode</text>
+        <text stroke="none" fill="#000" x="200" y="1260" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Tunnel diode</text>
+        <text stroke="none" fill="#000" x="200" y="1292" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Varicap</text>
+        <text stroke="none" fill="#000" x="200" y="1324" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Pin diode</text>
+        <g transform="translate(112, 1360)">
+            <path d="m 0,8 48,0"/>
+            <path fill="#000" d="m 31,8 -13,-6 0,12 13,-6"/>
+            <path d="m 32,0 0,16"/>
+            <path d="m 32,8 8,-6 0,-18"/>
+        </g>
+        <g transform="translate(112, 1408)">
+            <path d="m 0,8 16,0"/>
+            <path d="m 48,8 -16,0"/>
+            <path fill="#000" d="m 30,2 -14,-7 0,14 z"/>
+            <path fill="#000" d="m 18,14 14,-7 0,14 z"/>
+            <path d="m 32,-8 0,32"/>
+            <path d="m 16,-8 0,32"/>
+            <path d="m 32,2 8,-6 0,-12"/>
+        </g>
+        <g transform="translate(112, 1456)">
+            <path d="m 0,8 16,0"/>
+            <path d="m 48,8 -16,0"/>
+            <path fill="#000" d="m 30,2 -14,-7 0,14 z"/>
+            <path fill="#000" d="m 18,14 14,-7 0,14 z"/>
+            <path d="m 32,-8 0,32"/>
+            <path d="m 16,-8 0,32"/>
+        </g>
+        <g transform="translate(48, 1360)">
+            <path d="m 0,8 48,0"/>
+            <path fill="#FFF" d="m 31,8 -13,-6 0,12 13,-6"/>
+            <path d="m 32,0 0,16"/>
+            <path d="m 32,8 8,-6 0,-18"/>
+        </g>
+        <g transform="translate(48, 1408)">
+            <path d="m 0,8 16,0"/>
+            <path d="m 48,8 -16,0"/>
+            <path fill="#FFF" d="m 30,2 -14,-7 0,14 z"/>
+            <path fill="#FFF" d="m 18,14 14,-7 0,14 z"/>
+            <path d="m 32,-8 0,32"/>
+            <path d="m 16,-8 0,32"/>
+            <path d="m 32,2 8,-6 0,-12"/>
+        </g>
+        <g transform="translate(48, 1456)">
+            <path d="m 0,8 16,0"/>
+            <path d="m 48,8 -16,0"/>
+            <path fill="#FFF" d="m 30,2 -14,-7 0,14 z"/>
+            <path fill="#FFF" d="m 18,14 14,-7 0,14 z"/>
+            <path d="m 32,-8 0,32"/>
+            <path d="m 16,-8 0,32"/>
+        </g>
+        <text stroke="none" fill="#000" x="200" y="1372" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Silicon-controlled rectifier 
(SCR)</text>
+        <text stroke="none" fill="#000" x="200" y="1420" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Triode for alternating current 
(TRIAC)</text>
+        <text stroke="none" fill="#000" x="200" y="1468" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Diode for alternating current 
(DIAC)</text>
+        <g transform="translate(144, 1504)">
+            <path d="m 8,0 0,4"/>
+            <path d="m 0,4 16,0"/>
+            <path d="m 2,8 12,0"/>
+            <path d="m 4,12 8,0"/>
+        </g>
+        <text stroke="none" fill="#000" x="200" y="1516" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Earth ground</text>
+        <g transform="translate(144, 1536)">
+            <path d="m 8,0 0,4"/>
+            <path d="m -3.5,12 4,-8 16,0 -4,8"/>
+            <path d="m 4.5,12 4,-8"/>
+        </g>
+        <g fill="#FFF" transform="translate(144, 1568)">
+            <path d="m 8,0 0,4"/>
+            <path d="m 3,4 10,0 -5,10 z"/>
+        </g>
+        <g transform="translate(144, 1600)">
+            <path d="m 8,0 0,8"/>
+            <path d="m 0,8 16,0"/>
+        </g>
+        <text stroke="none" fill="#000" x="200" y="1548" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Chassis ground</text>
+        <text stroke="none" fill="#000" x="200" y="1580" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Signal ground</text>
+        <text stroke="none" fill="#000" x="200" y="1612" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Arbitrary ground</text>
+        <g transform="translate(144, 1632)">
+            <path d="m 0,8 5,0"/>
+            <path d="m 5,2 0,12"/>
+            <path d="m 11,-4 0,24"/>
+            <path d="m 11,8 5,0"/>
+        </g>
+        <g transform="translate(112, 1664)">
+            <path d="m 0,8 15,0"/>
+            <path d="m 15,2 0,12"/>
+            <path d="m 21,-4 0,24"/>
+            <path d="m 27,2 0,12"/>
+            <path d="m 33,-4 0,24"/>
+            <path d="m 33,8 15,0"/>
+        </g>
+        <g transform="translate(112, 1696)">
+            <circle fill="#FFF" stroke-width="4" cy="24" cx="24" r="20"/>
+            <path d="m 0,24 4,0"/>
+            <path d="m 48,24 -4,0"/>
+            <path d="m 30,24 8,0"/>
+            <path d="m 34,20 0,8"/>
+            <path d="m 10,24 8,0"/>
+        </g>
+        <g transform="translate(112, 1760)">
+            <circle fill="#FFF" stroke-width="4" cy="24" cx="24" r="20"/>
+            <path d="m 0,24 4,0"/>
+            <path d="m 48,24 -4,0"/>
+            <path d="m 10,24 a 8,8 0 0 1 14,0 a 8,8 0 0 0 14,0"/>
+        </g>
+        <g transform="translate(112, 1824)">
+            <circle fill="#FFF" stroke-width="4" cy="24" cx="24" r="20"/>
+            <path d="m 0,24 4,0"/>
+            <path d="m 48,24 -4,0"/>
+            <path stroke-width="4" d="m 34,24 -22,0"/>
+            <path fill="#000" stroke="none" d="m 38,24 -10,-5 0,10 10,-5"/>
+        </g>
+        <g transform="translate(112, 1888)">
+            <polygon fill="#FFF" points="4,24 24,9 44,24 24,39 4,24"/>
+            <path d="m 0,24 4,0"/>
+            <path d="m 48,24 -4,0"/>
+            <path d="m 30,24 8,0"/>
+            <path d="m 34,20 0,8"/>
+            <path d="m 10,24 8,0"/>
+        </g>
+        <g transform="translate(112, 1936)">
+            <polygon fill="#FFF" points="4,24 24,9 44,24 24,39 4,24"/>
+            <path d="m 0,24 4,0"/>
+            <path d="m 48,24 -4,0"/>
+            <path stroke-width="4" d="m 34,24 -22,0"/>
+            <path fill="#000" stroke="none" d="m 38,24 -10,-5 0,10 10,-5"/>
+        </g>
+        <text stroke="none" fill="#000" x="200" y="1644" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Cell</text>
+        <text stroke="none" fill="#000" x="200" y="1676" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Battery</text>
+        <text stroke="none" fill="#000" x="200" y="1724" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">DC voltage source</text>
+        <text stroke="none" fill="#000" x="200" y="1788" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">AC voltage source</text>
+        <text stroke="none" fill="#000" x="200" y="1852" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Current source</text>
+        <text stroke="none" fill="#000" x="200" y="1916" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Dependent voltage source</text>
+        <text stroke="none" fill="#000" x="200" y="1964" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Dependent current source</text>
+        <g fill="#FFF" transform="translate(112, 2000)">
+            <path d="m 0,8 12,0"/>
+            <path d="m 48,8 -12,0"/>
+            <circle cy="8" cx="12" r="3"/>
+            <circle cy="8" cx="36" r="3"/>
+            <path d="m 8,-2 32,0"/>
+            <path d="m 24,-2 0,-10"/>
+        </g>
+        <g fill="#FFF" transform="translate(112, 2048)">
+            <path d="m 0,8 12,0"/>
+            <path d="m 48,8 -12,0"/>
+            <circle cy="8" cx="12" r="3"/>
+            <circle cy="8" cx="36" r="3"/>
+            <path d="m 8,13 32,0"/>
+            <path d="m 24,13 0,-10"/>
+        </g>
+        <g fill="#FFF" transform="translate(112, 2096)">
+            <path d="m 0,8 12,0"/>
+            <path d="m 48,8 -12,0"/>
+            <path d="m 12,8 24.36,-10.57"/>
+            <circle cy="8" cx="12" r="3"/>
+            <circle cy="8" cx="36" r="3"/>
+        </g>
+        <g fill="#FFF" transform="translate(112, 2144)">
+            <path d="m 0,8 12,0"/>
+            <path d="m 48,8 -12,0"/>
+            <path d="m 12,8 26,-5.4"/>
+            <circle cy="8" cx="12" r="3"/>
+            <circle cy="8" cx="36" r="3"/>
+        </g>
+        <g fill="#FFF" transform="translate(112, 2192)">
+            <path d="m 0,8 8,0"/>
+            <path d="m 48,8 -8,0"/>
+            <path d="m 24,8 18,-5.8"/>
+            <path d="m 24,8 0,8"/>
+            <circle cy="8" cx="8" r="3"/>
+            <circle cy="8" cx="24" r="3"/>
+            <circle cy="8" cx="40" r="3"/>
+        </g>
+        <g fill="#FFF" transform="translate(32, 2176)">
+            <path d="m 36,8 12,0"/>
+            <circle cy="8" cx="36" r="3"/>
+            <path d="m 36,40 12,0"/>
+            <circle cy="40" cx="36" r="3"/>
+            <path d="m 12,24 -12,0"/>
+            <path d="m 12,24 27,12"/>
+            <circle cy="24" cx="12" r="3"/>
+        </g>
+        <g transform="translate(112, 2240)">
+            <path d="m 12,24 15,0"/>
+            <path d="m 34.6,24 -8,-4 0,8" fill="#000" stroke="none"/>
+            <path d="m 32,8 8,0 0,-8"/>
+            <circle fill="#FFF" cy="8" cx="32" r="3"/>
+            <path d="m 32,40 8,0 0,8"/>
+            <circle fill="#FFF" cy="40" cx="32" r="3"/>
+            <path d="m 37.6,24 10.4,0"/>
+            <circle fill="#FFF" cy="24" cx="37.6" r="3"/>
+            <path d="m 12,24 -12,0"/>
+            <circle fill="#FFF" cy="24" cx="12" r="3"/>
+        </g>
+        <g transform="translate(112, 2320)">
+            <path d="m 12,24 10,0"/>
+            <path d="m 29.38,24 -8,-4 0,8" fill="#000" stroke="none"/>
+            <path d="m 12,24 -12,0"/>
+            <circle fill="#FFF" cy="24" cx="12" r="3"/>
+            <circle fill="#FFF" cy="3" cx="8" r="3"/>
+            <circle fill="#FFF" cy="45" cx="8" r="3"/>
+            <path d="M 25.63,40 40,40 40,48"/>
+            <circle fill="#FFF" cy="40.47" cx="25.63" r="3"/>
+            <path d="M 25.63,8 40,8 40,0"/>
+            <circle fill="#FFF" cy="7.53" cx="25.63" r="3"/>
+            <path d="M 33.38,24 48,24"/>
+            <circle fill="#FFF" cy="24" cx="33.38" r="3"/>
+        </g>
+        <g fill="#FFF" transform="translate(112, 2400)">
+            <circle cy="12" cx="8" r="3"/>
+            <circle cy="12" cx="24" r="3"/>
+            <circle cy="12" cx="40" r="3"/>
+            <rect y="2" x="4" height="6" width="24"/>
+        </g>
+        <text stroke="none" fill="#000" x="200" y="2108" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Single-pole, single-throw switch, 
open (SPST)</text>
+        <text stroke="none" fill="#000" x="200" y="2156" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Single-pole, single-throw switch, 
closed (SPST)</text>
+        <text stroke="none" fill="#000" x="200" y="2012" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Momentary switch, normally 
open</text>
+        <text stroke="none" fill="#000" x="200" y="2060" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Momentary switch, normally 
closed</text>
+        <text stroke="none" fill="#000" x="200" y="2204" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Single-pole, double-throw switches 
(SPDT)</text>
+        <text stroke="none" fill="#000" x="200" y="2268" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Three-way switch</text>
+        <text stroke="none" fill="#000" x="200" y="2348" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">5-way switch</text>
+        <text stroke="none" fill="#000" x="200" y="2412" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Sliding switch (SPDT)</text>
+        <g transform="translate(512, 240)">
+            <circle fill="white" cy="24" cx="29" r="23"/>
+            <line y2="38" y1="10" x2="23" x1="23" stroke-width="4"/>
+            <path d="m 0,24 23,0"/>
+            <path d="m 40,0 0,9 -18,9"/>
+            <path d="m 40,48 0,-9 -18,-9"/>
+            <path fill="#000" stroke="none" d="m 40,39 -6,-8 -4,8 10,0"/>
+        </g>
+        <g transform="translate(432, 240)">
+            <line y2="38" y1="10" x2="23" x1="23" stroke-width="4"/>
+            <path d="m 0,24 23,0"/>
+            <path d="m 40,0 0,9 -18,9"/>
+            <path d="m 40,48 0,-9 -18,-9"/>
+            <path fill="#000" stroke="none" d="m 40,39 -6,-8 -4,8 10,0"/>
+        </g>
+        <g transform="translate(512, 304) matrix(1, 0, 0, -1, 0, 48)">
+            <circle fill="white" cy="24" cx="29" r="23"/>
+            <line y2="38" y1="10" x2="23" x1="23" stroke-width="4"/>
+            <path d="m 0,24 23,0"/>
+            <path d="m 40,0 0,9 -18,9"/>
+            <path d="m 40,48 0,-9 -18,-9"/>
+            <path fill="#000" stroke="none" d="m 40,39 -6,-8 -4,8 10,0"/>
+        </g>
+        <g transform="translate(432, 304)">
+            <line y2="38" y1="10" x2="23" x1="23" stroke-width="4"/>
+            <path d="m 0,24 23,0"/>
+            <path d="m 40,0 0,9 -18,9"/>
+            <path d="m 40,48 0,-9 -18,-9"/>
+            <path fill="#000" stroke="none" d="m 26,16 6,-8 4,8 -10,0"/>
+        </g>
+        <text stroke="none" fill="#000" x="600" y="252" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">NPN transistor</text>
+        <text stroke="none" fill="#000" x="600" y="316" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">PNP transistor</text>
+        <g transform="translate(512, 368)">
+            <circle fill="#FFF" cy="24" cx="29" r="23"/>
+            <g stroke-width="3.6" stroke="#000" transform="translate(0, 
10.6667) scale(0.555556)">
+                <line y2="38" y1="10" x2="23" x1="23" stroke-width="4"/>
+                <path d="m 0,24 23,0"/>
+                <path d="m 72,9 -32,0 -18,9"/>
+                <path fill="#000" stroke="none" d="m 42,40 -9,-12 -6,12 15,0"/>
+                <line y2="54" y1="26" x2="55" x1="55" stroke-width="4"/>
+                <path d="m 22,30 20,10 13,0"/>
+                <path d="m 72,-19.2 0,44.2 -18,9"/>
+                <circle cy="9" cx="72" r="2.6"/>
+                <path d="m 72,67.2 0,-12.2 -18,-9"/>
+                <path fill="#000" stroke="none" d="m 74,56 -9,-12 -6,12 15,0"/>
+            </g>
+        </g>
+        <g stroke-width="3.6" stroke="#000" transform="translate(432, 368) 
translate(0, 10.6667) scale(0.555556)">
+            <line y2="38" y1="10" x2="23" x1="23" stroke-width="4"/>
+            <path d="m 0,24 23,0"/>
+            <path d="m 72,9 -32,0 -18,9"/>
+            <path fill="#000" stroke="none" d="m 42,40 -9,-12 -6,12 15,0"/>
+            <line y2="54" y1="26" x2="55" x1="55" stroke-width="4"/>
+            <path d="m 22,30 20,10 13,0"/>
+            <path d="m 72,-19.2 0,44.2 -18,9"/>
+            <circle cy="9" cx="72" r="2.6"/>
+            <path d="m 72,67.2 0,-12.2 -18,-9"/>
+            <path fill="#000" stroke="none" d="m 74,56 -9,-12 -6,12 15,0"/>
+        </g>
+        <g transform="translate(512, 432)">
+            <circle fill="#FFF" cy="24" cx="29" r="23"/>
+            <g stroke-width="3.6" stroke="#000" transform="translate(0, 
1.77778) scale(0.555556)">
+                <line y2="54" y1="26" x2="23" x1="23" stroke-width="4"/>
+                <path d="m 0,40 23,0"/>
+                <path d="m 55,24 -13,0 -20,10"/>
+                <path d="m 72,55 -32,0 -18,-9"/>
+                <circle cy="55" cx="72" r="2.6"/>
+                <path fill="#000" stroke="none" d="m 26,32 9,-12 6,12 -15,0"/>
+                <line y2="38" y1="10" x2="55" x1="55" stroke-width="4"/>
+                <path d="m 72,-3.2 0,12.2 -18,9"/>
+                <path d="m 72,83.2 0,-44.2 -18,-9"/>
+                <path fill="#000" stroke="none" d="m 58,16 9,-12 6,12 -15,0"/>
+            </g>
+        </g>
+        <g stroke-width="3.6" stroke="#000" transform="translate(432, 432) 
translate(0, 1.77778) scale(0.555556)">
+            <line y2="54" y1="26" x2="23" x1="23" stroke-width="4"/>
+            <path d="m 0,40 23,0"/>
+            <path d="m 55,24 -13,0 -20,10"/>
+            <path d="m 72,55 -32,0 -18,-9"/>
+            <circle cy="55" cx="72" r="2.6"/>
+            <path fill="#000" stroke="none" d="m 26,32 9,-12 6,12 -15,0"/>
+            <line y2="38" y1="10" x2="55" x1="55" stroke-width="4"/>
+            <path d="m 72,-3.2 0,12.2 -18,9"/>
+            <path d="m 72,83.2 0,-44.2 -18,-9"/>
+            <path fill="#000" stroke="none" d="m 58,16 9,-12 6,12 -15,0"/>
+        </g>
+        <text stroke="none" fill="#000" x="600" y="380" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">NPN Darlington pair</text>
+        <text stroke="none" fill="#000" x="600" y="444" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">PNP Darlington pair</text>
+        <g transform="translate(512, 496)">
+            <circle fill="white" cy="24" cx="29" r="23"/>
+            <path d="m 0,40 21,0 0,-33"/>
+            <path d="m 40,0 0,10 -13,0"/>
+            <path d="m 40,48 0,-10 -13,0"/>
+            <path d="m 40,38 0,-14 -13,0"/>
+            <path stroke-width="3" d="m 26.5,5 0,10"/>
+            <path stroke-width="3" d="m 26.5,19 0,10"/>
+            <path stroke-width="3" d="m 26.5,33 0,10"/>
+            <path fill="#000" stroke="none" d="m 29,24 8,4 0,-8 z"/>
+        </g>
+        <g transform="translate(432, 496)">
+            <path d="m 0,40 21,0 0,-33"/>
+            <path d="m 40,0 0,10 -13,0"/>
+            <path d="m 40,48 0,-10 -13,0"/>
+            <path d="m 40,38 0,-14 -13,0"/>
+            <path stroke-width="3" d="m 26.5,5 0,10"/>
+            <path stroke-width="3" d="m 26.5,19 0,10"/>
+            <path stroke-width="3" d="m 26.5,33 0,10"/>
+            <path fill="#000" stroke="none" d="m 29,24 8,4 0,-8 z"/>
+        </g>
+        <g transform="translate(512, 560)">
+            <circle fill="white" cy="24" cx="29" r="23"/>
+            <path d="m 0,8 21,0 0,34"/>
+            <path d="m 40,0 0,10 -13,0"/>
+            <path d="m 40,48 0,-10 -13,0"/>
+            <path d="m 40,10 0,14 -13,0"/>
+            <path stroke-width="3" d="m 26.5,5 0,10"/>
+            <path stroke-width="3" d="m 26.5,19 0,10"/>
+            <path stroke-width="3" d="m 26.5,33 0,10"/>
+            <path fill="#000" stroke="none" d="m 40,24 -8,4 0,-8 z"/>
+        </g>
+        <g transform="translate(432, 560)">
+            <path d="m 0,8 21,0 0,34"/>
+            <path d="m 40,0 0,10 -13,0"/>
+            <path d="m 40,48 0,-10 -13,0"/>
+            <path d="m 40,10 0,14 -13,0"/>
+            <path stroke-width="3" d="m 26.5,5 0,10"/>
+            <path stroke-width="3" d="m 26.5,19 0,10"/>
+            <path stroke-width="3" d="m 26.5,33 0,10"/>
+            <path fill="#000" stroke="none" d="m 40,24 -8,4 0,-8 z"/>
+        </g>
+        <text stroke="none" fill="#000" x="600" y="508" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Enhancement-mode N-MOSFET</text>
+        <text stroke="none" fill="#000" x="600" y="572" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Enhancement-mode P-MOSFET</text>
+        <g transform="translate(512, 624)">
+            <circle fill="white" cy="24" cx="29" r="23"/>
+            <path d="m 0,40 21,0 0,-33"/>
+            <path d="m 40,0 0,10 -13,0"/>
+            <path d="m 40,48 0,-10 -13,0"/>
+            <path d="m 40,38 0,-14 -13,0"/>
+            <path stroke-width="3" d="m 26.5,5 0,38"/>
+            <path fill="#000" stroke="none" d="m 29,24 8,4 0,-8 z"/>
+        </g>
+        <g transform="translate(432, 624)">
+            <path d="m 0,40 21,0 0,-33"/>
+            <path d="m 40,0 0,10 -13,0"/>
+            <path d="m 40,48 0,-10 -13,0"/>
+            <path d="m 40,38 0,-14 -13,0"/>
+            <path stroke-width="3" d="m 26.5,5 0,38"/>
+            <path fill="#000" stroke="none" d="m 29,24 8,4 0,-8 z"/>
+        </g>
+        <g transform="translate(512, 688)">
+            <circle fill="white" cy="24" cx="29" r="23"/>
+            <path d="m 0,8 21,0 0,34"/>
+            <path d="m 40,0 0,10 -13,0"/>
+            <path d="m 40,48 0,-10 -13,0"/>
+            <path d="m 40,10 0,14 -13,0"/>
+            <path stroke-width="3" d="m 26.5,5 0,38"/>
+            <path fill="#000" stroke="none" d="m 40,24 -8,4 0,-8 z"/>
+        </g>
+        <g transform="translate(432, 688)">
+            <path d="m 0,8 21,0 0,34"/>
+            <path d="m 40,0 0,10 -13,0"/>
+            <path d="m 40,48 0,-10 -13,0"/>
+            <path d="m 40,10 0,14 -13,0"/>
+            <path stroke-width="3" d="m 26.5,5 0,38"/>
+            <path fill="#000" stroke="none" d="m 40,24 -8,4 0,-8 z"/>
+        </g>
+        <text stroke="none" fill="#000" x="600" y="700" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Depletion-mode P-MOSFET</text>
+        <text stroke="none" fill="#000" x="600" y="636" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Depletion-mode N-MOSFET</text>
+        <g transform="translate(512, 752)">
+            <circle fill="white" cy="24" cx="29" r="23"/>
+            <path d="m 0,24 26,0"/>
+            <path d="m 40,0 0,14 -13,0"/>
+            <path d="m 40,48 0,-14 -13,0"/>
+            <path stroke-width="3" d="m 26.5,9 0,30"/>
+            <path fill="#000" stroke="none" d="m 22,24 -8,4 0,-8 z"/>
+        </g>
+        <g transform="translate(432, 752)">
+            <path d="m 0,24 26,0"/>
+            <path d="m 40,0 0,14 -13,0"/>
+            <path d="m 40,48 0,-14 -13,0"/>
+            <path stroke-width="3" d="m 26.5,9 0,30"/>
+            <path fill="#000" stroke="none" d="m 22,24 -8,4 0,-8 z"/>
+        </g>
+        <g transform="translate(512, 816)">
+            <circle fill="white" cy="24" cx="29" r="23"/>
+            <path d="m 0,24 26,0"/>
+            <path d="m 40,0 0,14 -13,0"/>
+            <path d="m 40,48 0,-14 -13,0"/>
+            <path stroke-width="3" d="m 26.5,9 0,30"/>
+            <path fill="#000" stroke="none" d="m 12,24 8,4 0,-8 z"/>
+        </g>
+        <g transform="translate(432, 816)">
+            <path d="m 0,24 26,0"/>
+            <path d="m 40,0 0,14 -13,0"/>
+            <path d="m 40,48 0,-14 -13,0"/>
+            <path stroke-width="3" d="m 26.5,9 0,30"/>
+            <path fill="#000" stroke="none" d="m 12,24 8,4 0,-8 z"/>
+        </g>
+        <text stroke="none" fill="#000" x="600" y="764" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">N-JFET</text>
+        <text stroke="none" fill="#000" x="600" y="828" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">P-JFET</text>
+        <g transform="translate(480, 880)">
+            <path fill="#FFF" d="m 8,8 0,64 64,-32 z"/>
+            <path d="m 13,56 8,0"/>
+            <path d="m 17,52 0,8"/>
+            <path d="m 13,24 8,0"/>
+            <path d="m 0,24 8,0"/>
+            <path d="m 0,56 8,0"/>
+            <path d="m 72,40 8,0"/>
+        </g>
+        <g transform="translate(480, 960)">
+            <path fill="#FFF" d="m 8,8 0,64 64,-32 z"/>
+            <path d="m 0,24 8,0"/>
+            <path d="m 0,56 8,0"/>
+            <path d="m 72,40 8,0"/>
+        </g>
+        <g fill="#FFF" transform="translate(528, 1040)">
+            <path d="m 32,24 -31,-15 0,30 z"/>
+        </g>
+        <g fill="#FFF" transform="translate(512, 1104)">
+            <path d="m 0,1 24,0 a 23,23 0 0 1 0,46 l -24,0 z"/>
+        </g>
+        <g fill="#FFF" transform="translate(512, 1168)">
+            <path d="m -3.5,1 19.5,0 a 40,46 0 0 1 32,23 a 40,46 0 0 1 -32,23 
l -19.5,0 a 40,40 0 0 0 0,-46 z"/>
+        </g>
+        <g fill="#FFF" transform="translate(512, 1232)">
+            <path fill="none" d="m -3.5,1 a 40,40 0 0 1 0,46"/>
+            <path d="m 2.5,1 13.5,0 a 40,46 0 0 1 32,23 a 40,46 0 0 1 -32,23 l 
-13.5,0 a 40,40 0 0 0 0,-46 z"/>
+        </g>
+        <g transform="translate(544, 1328)">
+            <path d="m 3,12 8,0 4,-8"/>
+            <path d="m 19,4 -8,0 -4,8"/>
+        </g>
+        <text stroke="none" fill="#000" x="600" y="1308" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Negation of digital input or 
output</text>
+        <text stroke="none" fill="#000" x="600" y="1340" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Schmitt trigger</text>
+        <g fill="#FFF" transform="translate(544, 1296) matrix(-1, 0, 0, -1, 
16, 16)">
+            <path d="m 0,8 16,0"/>
+            <circle cy="8" cx="13" r="3"/>
+        </g>
+        <g fill="#FFF" transform="translate(496, 1296)">
+            <path d="m 0,8 16,0"/>
+            <circle cy="8" cx="13" r="3"/>
+        </g>
+        <g fill="#FFF" transform="translate(736, 1136)">
+            <path d="m 0,1 24,0 a 23,23 0 0 1 0,46 l -24,0 z"/>
+        </g>
+        <g fill="#FFF" transform="translate(784, 1152) matrix(-1, 0, 0, -1, 
16, 16)">
+            <path d="m 0,8 16,0"/>
+            <circle cy="8" cx="13" r="3"/>
+        </g>
+        <g fill="#FFF" transform="translate(720, 1136)">
+            <path d="m 0,8 16,0"/>
+            <circle cy="8" cx="13" r="3"/>
+        </g>
+        <text stroke="none" fill="#000" x="760" y="1132" style="font-size: 
8pt;text-anchor: middle;font-weight: normal;">Example</text>
+        <g transform="translate(512, 1376)">
+            <rect fill="#FFF" height="16" width="48" y="0" x="0"/>
+            <path d="m 8,32 0,-24 c 1.6,-17 4.8,-17 6.4,0 c 1.6,17 4.8,17 
6.4,0 c 1.6,-17 4.8,-17 6.4,0 c 1.6,17 4.8,17 6.4,0 c 1.6,-17 4.8,-17 6.4,0 l 
0,24"/>
+            <rect stroke="none" fill="#FFF" height="14" width="10" y="1" 
x="1"/>
+            <rect stroke="none" fill="#FFF" height="14" width="8" y="1" 
x="17"/>
+            <rect stroke="none" fill="#FFF" height="14" width="8" y="1" 
x="30"/>
+            <rect stroke="none" fill="#FFF" height="14" width="4" y="1" 
x="43"/>
+        </g>
+        <g transform="translate(512, 1424)">
+            <path d="m 0,8 8,0 0,8"/>
+            <path fill="#000" d="m 48,8 -15,0 2,3 2,-3"/>
+            <path fill="#000" d="m 48,24 -15,0 2,-3 2,3"/>
+            <path d="m 8,16 32,-3"/>
+            <circle fill="#FFF" cy="16" cx="8" r="3"/>
+        </g>
+        <text stroke="none" fill="#000" x="600" y="1388" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Solenoid or relay coil</text>
+        <text stroke="none" fill="#000" x="600" y="1436" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Relay contacts</text>
+        <g transform="translate(448, 1424)">
+            <path d="m 48,24 -8,0"/>
+            <path fill="#000" d="m 48,8 -35,0 2,3 2,-3"/>
+            <path fill="#000" d="m 48,40 -35,0 2,-3 2,3"/>
+            <path d="m 40,24 -29.8,-12.1"/>
+            <circle fill="#FFF" cy="24" cx="40" r="3"/>
+        </g>
+        <g fill="#FFF" transform="translate(512, 1472)">
+            <path d="m 0,24 48,0"/>
+            <circle cy="24" cx="24" r="16"/>
+            <path transform="rotate(45, 24, 24)" d="m 24,8 0,32"/>
+            <path transform="rotate(-45, 24, 24)" d="m 24,8 0,32"/>
+        </g>
+        <g fill="#FFF" transform="translate(512, 1520)">
+            <path d="m 0,24 48,0"/>
+            <circle cy="24" cx="24" r="16"/>
+            <path transform="rotate(45, 24, 24)" d="m 24,8 0,32"/>
+            <path transform="rotate(-45, 24, 24)" d="m 24,8 0,32"/>
+            <path d="m 24,4 0,-6"/>
+            <path transform="rotate(45, 24, 24)" d="m 24,4 0,-6"/>
+            <path transform="rotate(-45, 24, 24)" d="m 24,4 0,-6"/>
+            <path d="m 24,44 0,6"/>
+            <path transform="rotate(45, 24, 24)" d="m 24,44 0,6"/>
+            <path transform="rotate(-45, 24, 24)" d="m 24,44 0,6"/>
+        </g>
+        <g fill="#FFF" transform="translate(512, 1584)">
+            <path d="m 24,4 0,-6"/>
+            <path transform="rotate(45, 24, 24)" d="m 24,4 0,-6"/>
+            <path transform="rotate(-45, 24, 24)" d="m 24,4 0,-6"/>
+            <path d="m 24,44 0,6"/>
+            <path transform="rotate(45, 24, 24)" d="m 24,44 0,6"/>
+            <path transform="rotate(-45, 24, 24)" d="m 24,44 0,6"/>
+        </g>
+        <g fill="#FFF" transform="translate(512, 1648)">
+            <circle cy="24" cx="24" r="16"/>
+            <path d="m 0,24 16,0 a 8,8 0 0 1 16,0 l 16,0"/>
+        </g>
+        <g transform="translate(448, 1648)">
+            <circle fill="#FFF" cy="24" cx="24" r="16"/>
+            <path fill="none" d="m 0,24 16,0 c 5,0 10,-4 10,-8 q 0,-4 
-2.1,-4"/>
+            <path fill="none" d="m 48,24 -16,0 c -5,0 -10,-4 -10,-8 q 0,-4 
2.1,-4"/>
+        </g>
+        <g fill="#FFF" transform="translate(512, 1712)">
+            <circle cy="24" cx="24" r="16"/>
+            <path d="m 0,24 16,0"/>
+            <path d="m 16,16 0,16"/>
+            <path d="m 48,24 -16,0"/>
+            <path d="m 32,16 0,16"/>
+        </g>
+        <g fill="#FFF" transform="translate(448, 1712)">
+            <circle cy="24" cx="24" r="16"/>
+            <circle fill="#000" stroke="none" cy="30" cx="15" r="2.5"/>
+            <path d="m 0,24 20,0"/>
+            <path d="m 20,16 0,16"/>
+            <path d="m 48,24 -20,0"/>
+            <path d="m 28,16 0,16"/>
+        </g>
+        <g fill="#FFF" transform="translate(384, 1712)">
+            <circle cy="24" cx="24" r="16"/>
+            <path d="m 0,24 16,0"/>
+            <path d="m 48,24 -16,0"/>
+            <path d="m 20,16 a 8.94,8.94 0 0 0 0,16 z"/>
+            <path d="m 28,16 a 8.94,8.94 0 0 1 0,16 z"/>
+        </g>
+        <g fill="#FFF" transform="translate(480, 1744)">
+            <circle cy="24" cx="24" r="16"/>
+            <path d="m 0,24 16,0"/>
+            <path d="m 48,24 -16,0"/>
+            <path d="m 12,20 0,8"/>
+            <path d="m 36,20 0,8"/>
+            <circle cy="24" cx="16" r="3"/>
+            <circle cy="24" cx="32" r="3"/>
+            <circle fill="#000" stroke="none" cy="34" cx="24" r="2.5"/>
+        </g>
+        <g fill="#FFF" transform="translate(416, 1744)">
+            <circle cy="24" cx="24" r="16"/>
+            <path d="m 0,24 16,0"/>
+            <path d="m 48,24 -16,0"/>
+            <circle cy="24" cx="16" r="3"/>
+            <circle cy="24" cx="32" r="3"/>
+            <circle fill="#000" stroke="none" cy="34" cx="24" r="2.5"/>
+        </g>
+        <text stroke="none" fill="#000" x="600" y="1740" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Neon lamps</text>
+        <text stroke="none" fill="#000" x="600" y="1676" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Incandescent lamps</text>
+        <text stroke="none" fill="#000" x="600" y="1612" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Lamp light</text>
+        <text stroke="none" fill="#000" x="600" y="924" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Operational amplifier or 
comparator</text>
+        <text stroke="none" fill="#000" x="600" y="1004" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Amplifier</text>
+        <text stroke="none" fill="#000" x="600" y="1068" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Digital buffer, or part of NOT 
gate symbol</text>
+        <text stroke="none" fill="#000" x="600" y="1132" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">AND gate</text>
+        <text stroke="none" fill="#000" x="600" y="1196" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">OR gate</text>
+        <text stroke="none" fill="#000" x="600" y="1260" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">XOR gate</text>
+        <text stroke="none" fill="#000" x="600" y="1500" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Lamp, unlit</text>
+        <text stroke="none" fill="#000" x="600" y="1548" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Lamp, lit</text>
+        <g fill="#FFF" transform="translate(480, 1824)">
+            <circle stroke-width="3" r="40" cy="40" cx="40"/>
+            <path d="m 40,0 0,16"/>
+            <path stroke-width="4" d="m 24,16 32,0"/>
+        </g>
+        <g transform="translate(496, 1856)">
+            <path d="m 24,80 0,-4 a 18,18 0 0 1 32,0 l 0,4"/>
+        </g>
+        <g transform="translate(496, 1888)">
+            <path stroke-width="3" d="m 22,70 a 23,23 0 0 1 36,0"/>
+            <path d="m 0,72 20,0 3,-3"/>
+        </g>
+        <g transform="translate(496, 1968)">
+            <path stroke-dasharray="4" stroke-width="3" d="m 18,48 48,0"/>
+            <path d="m 0,40 9,0 0,8 9,0"/>
+        </g>
+        <g transform="translate(496, 2000)">
+            <path stroke-dasharray="4" stroke-width="3" d="m 18,40 48,0"/>
+            <path d="m 0,40 18,0"/>
+        </g>
+        <g transform="translate(496, 2016)">
+            <path stroke-dasharray="4" stroke-width="3" d="m 18,48 48,0"/>
+            <path d="m 0,56 9,0 0,-8 9,0"/>
+        </g>
+        <g transform="translate(528, 2064)">
+            <path stroke-width="1" d="m 18,24 -6,0 a 36,36 0 0 0 12,44"/>
+            <circle fill="#000" stroke="none" r="2.5" cy="68" cx="24"/>
+        </g>
+        <text stroke="none" fill="#000" x="600" y="1868" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Vacuum tube and anode</text>
+        <text stroke="none" fill="#000" x="600" y="1932" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Heating element</text>
+        <text stroke="none" fill="#000" x="600" y="2044" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Grid elements</text>
+        <text stroke="none" fill="#000" x="600" y="2108" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Supressor grid internal cathode 
connection</text>
+        <g fill="#FFF" transform="translate(720, 1920)">
+            <circle stroke-width="3" r="40" cy="40" cx="40"/>
+            <path d="m 40,0 0,16"/>
+            <path stroke-width="4" d="m 24,16 32,0"/>
+        </g>
+        <g transform="translate(720, 1920) matrix(-1, 0, 0, 1, 80, 0)">
+            <path stroke-width="3" d="m 22,70 a 23,23 0 0 1 36,0"/>
+            <path d="m 0,72 20,0 3,-3"/>
+        </g>
+        <g transform="translate(720, 1920) matrix(-1, 0, 0, 1, 80, 0)">
+            <path stroke-dasharray="4" stroke-width="3" d="m 18,40 48,0"/>
+            <path d="m 0,40 18,0"/>
+        </g>
+        <g transform="translate(720, 1920) matrix(-1, 0, 0, 1, 80, 0)">
+            <path stroke-dasharray="4" stroke-width="3" d="m 18,24 48,0"/>
+            <path d="m 0,24 18,0"/>
+        </g>
+        <text stroke="none" fill="#000" x="760" y="1900" style="font-size: 
8pt;text-anchor: middle;font-weight: normal;">Example</text>
+        <g transform="translate(480, 2160)">
+            <g fill="#FFF">
+                <circle stroke-width="3" r="40" cy="40" cx="40"/>
+                <path d="m 40,0 0,16"/>
+                <path stroke-width="4" d="m 24,16 32,0"/>
+            </g>
+            <g>
+                <path d="m 24,80 0,-4 a 18,18 0 0 1 32,0 l 0,4"/>
+            </g>
+            <g>
+                <path stroke-width="3" d="m 22,70 a 23,23 0 0 1 36,0"/>
+                <path d="m 8,80 0,-6 10,0 5,-5"/>
+            </g>
+        </g>
+        <g transform="translate(480, 2256)">
+            <g fill="#FFF">
+                <circle stroke-width="3" r="40" cy="40" cx="40"/>
+                <path d="m 40,0 0,16"/>
+                <path stroke-width="4" d="m 24,16 32,0"/>
+            </g>
+            <g>
+                <path d="m 24,80 0,-4 a 18,18 0 0 1 32,0 l 0,4"/>
+            </g>
+            <g>
+                <path stroke-width="3" d="m 22,70 a 23,23 0 0 1 36,0"/>
+                <path d="m 8,80 0,-6 10,0 5,-5"/>
+            </g>
+            <g transform="matrix(-1, 0, 0, 1, 80, 0)">
+                <path stroke-dasharray="4" stroke-width="3" d="m 18,40 48,0"/>
+                <path d="m 0,40 18,0"/>
+            </g>
+        </g>
+        <g transform="translate(480, 2352)">
+            <g fill="#FFF">
+                <circle stroke-width="3" r="40" cy="40" cx="40"/>
+                <path d="m 40,0 0,16"/>
+                <path stroke-width="4" d="m 24,16 32,0"/>
+            </g>
+            <g>
+                <path d="m 24,80 0,-4 a 18,18 0 0 1 32,0 l 0,4"/>
+            </g>
+            <g>
+                <path stroke-width="3" d="m 22,70 a 23,23 0 0 1 36,0"/>
+                <path d="m 8,80 0,-6 10,0 5,-5"/>
+            </g>
+            <g>
+                <path stroke-dasharray="4" stroke-width="3" d="m 18,48 48,0"/>
+                <path d="m 0,40 9,0 0,8 9,0"/>
+            </g>
+            <g transform="matrix(-1, 0, 0, 1, 80, 0)">
+                <path stroke-dasharray="4" stroke-width="3" d="m 18,32 48,0"/>
+                <path d="m 0,40 9,0 0,-8 9,0"/>
+            </g>
+        </g>
+        <g transform="translate(480, 2448)">
+            <g fill="#FFF">
+                <circle stroke-width="3" r="40" cy="40" cx="40"/>
+                <path d="m 40,0 0,16"/>
+                <path stroke-width="4" d="m 24,16 32,0"/>
+            </g>
+            <g>
+                <path d="m 24,80 0,-4 a 18,18 0 0 1 32,0 l 0,4"/>
+            </g>
+            <g>
+                <path stroke-width="3" d="m 22,70 a 23,23 0 0 1 36,0"/>
+                <path d="m 8,80 0,-6 10,0 5,-5"/>
+            </g>
+            <g>
+                <path stroke-dasharray="4" stroke-width="3" d="m 18,56 48,0"/>
+                <path d="m 0,56 18,0"/>
+            </g>
+            <g transform="matrix(-1, 0, 0, 1, 80, 0)">
+                <path stroke-dasharray="4" stroke-width="3" d="m 18,40 48,0"/>
+                <path d="m 0,40 18,0"/>
+            </g>
+            <g>
+                <path stroke-dasharray="4" stroke-width="3" d="m 18,24 48,0"/>
+                <path d="m 0,24 18,0"/>
+            </g>
+            <g transform="matrix(-1, 0, 0, 1, 80, 0)">
+                <path stroke-width="1" d="m 18,24 -6,0 a 36,36 0 0 0 12,44"/>
+                <circle fill="#000" stroke="none" r="2.5" cy="68" cx="24"/>
+            </g>
+        </g>
+        <text stroke="none" fill="#000" x="824" y="1948" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Triode, heater omitted</text>
+        <text stroke="none" fill="#000" x="824" y="1964" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">All contacts on the right</text>
+        <g transform="translate(496, 1904)">
+            <path stroke-width="3" d="m 22,70 a 23,23 0 0 1 36,0"/>
+            <path d="m 8,80 0,-6 10,0 5,-5"/>
+        </g>
+        <text stroke="none" fill="#000" x="600" y="1964" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Cathode</text>
+        <text stroke="none" fill="#000" x="600" y="2204" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Diode</text>
+        <text stroke="none" fill="#000" x="600" y="2300" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Triode</text>
+        <text stroke="none" fill="#000" x="600" y="2396" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Tetrode</text>
+        <text stroke="none" fill="#000" x="600" y="2492" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Pentode</text>
+        <g fill="#FFF" transform="translate(688, 2160)">
+            <path stroke-width="3" d="m 40,0 80,0 a 40,40 0 0 1 0,80 l -80,0 a 
40,40 0 0 1 0,-80"/>
+            <path d="m 40,0 0,16"/>
+            <path stroke-width="4" d="m 24,16 32,0"/>
+            <path d="m 120,0 0,16"/>
+            <path stroke-width="4" d="m 104,16 32,0"/>
+        </g>
+        <g fill="#FFF" transform="translate(736, 2288)">
+            <path d="m 0,40 a 40,40 0 0 1 80,0 l 0,32 a 40,40 0 0 1 -80,0 l 
0,-32"/>
+            <path d="m 40,0 0,16"/>
+            <path stroke-width="4" d="m 24,16 32,0"/>
+        </g>
+        <text stroke="none" fill="#000" x="696" y="2140" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Double-anode tube</text>
+        <text stroke="none" fill="#000" x="696" y="2284" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Long tube style</text>
+        <g transform="translate(896, 240)">
+            <rect fill="#FFF" height="32" width="8" y="8" x="0"/>
+            <path d="m 0,40 64,0"/>
+            <path d="m 12,8 6,6 6,-6 40,0"/>
+            <circle fill="#000" stroke="none" cy="8" cx="64" r="3"/>
+            <circle fill="#000" stroke="none" cy="40" cx="64" r="3"/>
+        </g>
+        <g transform="translate(896, 304)">
+            <rect fill="#FFF" height="32" width="8" y="8" x="0"/>
+            <path d="m 0,40 64,0"/>
+            <path d="m 12,8 6,6 6,-6 40,0"/>
+            <path d="m 24,24 6,-6 6,6 28,0"/>
+            <circle fill="#000" stroke="none" cy="8" cx="64" r="3"/>
+            <circle fill="#000" stroke="none" cy="24" cx="64" r="3"/>
+            <circle fill="#000" stroke="none" cy="40" cx="64" r="3"/>
+        </g>
+        <g transform="translate(896, 368)">
+            <rect fill="#FFF" height="32" width="8" y="8" x="0"/>
+            <path d="m 0,40 64,0"/>
+            <path d="m 12,8 6,6 6,-6 40,0"/>
+            <path d="m 30,16 0,8 34,0"/>
+            <path fill="#000" stroke="none" d="m 30,9 4,8 -8,0 z"/>
+            <circle fill="#000" stroke="none" cy="8" cx="64" r="3"/>
+            <circle fill="#000" stroke="none" cy="24" cx="64" r="3"/>
+            <circle fill="#000" stroke="none" cy="40" cx="64" r="3"/>
+        </g>
+        <g transform="translate(896, 432)">
+            <rect fill="#FFF" height="64" width="8" y="8" x="0"/>
+            <path d="m 0,72 64,0"/>
+            <path d="m 12,8 6,6 6,-6 40,0"/>
+            <path d="m 24,56 6,-6 6,6 28,0"/>
+            <path d="m 30,16 0,8 34,0"/>
+            <path fill="#000" stroke="none" d="m 30,9 4,8 -8,0 z"/>
+            <path d="m 46,48 0,-8 18,0"/>
+            <path fill="#000" stroke="none" d="m 46,55 4,-8 -8,0 z"/>
+            <circle fill="#000" stroke="none" cy="8" cx="64" r="3"/>
+            <circle fill="#000" stroke="none" cy="24" cx="64" r="3"/>
+            <circle fill="#000" stroke="none" cy="40" cx="64" r="3"/>
+            <circle fill="#000" stroke="none" cy="56" cx="64" r="3"/>
+            <circle fill="#000" stroke="none" cy="72" cx="64" r="3"/>
+        </g>
+        <g transform="translate(912, 528)">
+            <circle r="8" cy="24" cx="24"/>
+            <circle r="16" cy="24" cx="24"/>
+            <path d="m 32,24 16,0"/>
+            <circle fill="#000" stroke="none" r="3" cy="24" cx="32"/>
+            <path d="m 24,40 0,8"/>
+            <circle fill="#000" stroke="none" r="3" cy="40" cx="24"/>
+        </g>
+        <g transform="translate(848, 528)">
+            <circle r="8" cy="24" cx="24"/>
+            <circle r="16" cy="24" cx="24"/>
+            <path d="m 32,24 16,0"/>
+            <circle fill="#000" stroke="none" r="3" cy="24" cx="32"/>
+            <path d="m 8,24 -8,0"/>
+            <circle fill="#000" stroke="none" r="3" cy="24" cx="8"/>
+        </g>
+        <text stroke="none" fill="#000" x="1000" y="268" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Phone jack, 2-conductor</text>
+        <text stroke="none" fill="#000" x="1000" y="332" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Phone jack, 3-conductor</text>
+        <text stroke="none" fill="#000" x="1000" y="396" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Phone jack with NC 
connection</text>
+        <text stroke="none" fill="#000" x="1000" y="476" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Phone jack, 3-conductor, with NC 
connections</text>
+        <text stroke="none" fill="#000" x="1000" y="556" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Phono jacks</text>
+        <g fill="#FFF" transform="translate(912, 608)">
+            <path d="m 0,8 17,0"/>
+            <path d="m 48,8 -17,0"/>
+            <path d="m 17,1 0,14"/>
+            <path d="m 31,1 0,14"/>
+            <rect height="16" width="6" y="0" x="21"/>
+        </g>
+        <g fill="#FFF" transform="translate(928, 640)">
+            <path d="m 2,0 16,16 0,16 -16,16 z"/>
+            <path d="m 18,16 12,0 0,16 -12,0 z"/>
+            <path d="m 24,16 0,-16"/>
+            <path d="m 24,32 0,16"/>
+        </g>
+        <g transform="translate(912, 720)">
+            <path d="m 0,8 8,0 a 18,18 0 1 1 32,0 l 8,0"/>
+            <circle fill="#FFF" cy="8" cx="8" r="5"/>
+            <circle fill="#FFF" cy="8" cx="40" r="5"/>
+        </g>
+        <g fill="#FFF" transform="translate(912, 752)">
+            <path d="m 0,24 48,0"/>
+            <circle stroke-width="3" cy="24" cx="24" r="16"/>
+        </g>
+        <g fill="#FFF" transform="translate(912, 800)">
+            <path d="m 0,24 48,0"/>
+            <rect height="12" width="8" y="18" x="4"/>
+            <rect height="12" width="8" y="18" x="36"/>
+            <circle cy="24" cx="24" r="16"/>
+        </g>
+        <g transform="translate(912, 864)">
+            <path d="m 24,0 0,32"/>
+            <path d="m 0,0 48,0 -24,24 z"/>
+        </g>
+        <g transform="translate(928, 912) matrix(0, 1, -1, 0, 32, 0)">
+            <path d="m 24,0 0,32"/>
+            <path d="m 0,0 48,0 -24,24 z"/>
+        </g>
+        <g transform="translate(912, 976)">
+            <path d="m 0,8 8,0 a 10,10 0 0 1 16,0 a 10,10 0 0 0 16,0 l 8,0"/>
+            <circle fill="#FFF" cy="8" cx="8" r="3"/>
+            <circle fill="#FFF" cy="8" cx="40" r="3"/>
+        </g>
+        <g fill="#FFF" transform="translate(848, 976)">
+            <rect height="8" width="24" y="4" x="12"/>
+            <path d="m 0,8 48,0"/>
+        </g>
+        <g transform="translate(912, 1008)">
+            <path d="m 0,8 16,0"/>
+            <path d="m 48,8 -16,0"/>
+            <path d="m 12,4 a 16,16 0 0 1 24,0"/>
+        </g>
+        <text stroke="none" fill="#000" x="1000" y="620" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Crystal</text>
+        <text stroke="none" fill="#000" x="1000" y="668" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Speaker</text>
+        <text stroke="none" fill="#000" x="1000" y="716" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Headphones</text>
+        <text stroke="none" fill="#000" x="1000" y="780" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Generic two-terminal</text>
+        <text stroke="none" fill="#000" x="1000" y="828" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Motor</text>
+        <text stroke="none" fill="#000" x="1000" y="876" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Antenna</text>
+        <text stroke="none" fill="#000" x="1000" y="940" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">RF probe</text>
+        <text stroke="none" fill="#000" x="1000" y="988" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Fuse</text>
+        <text stroke="none" fill="#000" x="1000" y="1020" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Circuit breaker</text>
+        <g transform="translate(944, 1056)">
+            <path d="m -1,8 4,0 a 6,6 0 0 0 10,0 l 4,0"/>
+        </g>
+        <g fill="#FFF" transform="translate(944, 1088)">
+            <path d="m 8,3 -5,0 a 2,2 0 0 0 -2,2 l 0,6 a 2,2 0 0 0 2,2 l 5,0"/>
+            <path d="m 8,0 0,16"/>
+        </g>
+        <text stroke="none" fill="#000" x="1000" y="1068" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Integrated circuit pin 1 
mark</text>
+        <text stroke="none" fill="#000" x="1000" y="1100" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Integrated circuit pin</text>
+        <g transform="translate(1200, 1040)">
+            <path d="m -1,8 4,0 a 6,6 0 0 0 10,0 l 4,0"/>
+        </g>
+        <g fill="#FFF" transform="translate(1184, 1056)">
+            <path d="m 8,3 -5,0 a 2,2 0 0 0 -2,2 l 0,6 a 2,2 0 0 0 2,2 l 5,0"/>
+            <path d="m 8,0 0,16"/>
+        </g>
+        <g fill="#FFF" transform="translate(1184, 1072)">
+            <path d="m 8,3 -5,0 a 2,2 0 0 0 -2,2 l 0,6 a 2,2 0 0 0 2,2 l 5,0"/>
+            <path d="m 8,0 0,16"/>
+        </g>
+        <g fill="#FFF" transform="translate(1216, 1056) matrix(-1, 0, 0, -1, 
16, 16)">
+            <path d="m 8,3 -5,0 a 2,2 0 0 0 -2,2 l 0,6 a 2,2 0 0 0 2,2 l 5,0"/>
+            <path d="m 8,0 0,16"/>
+        </g>
+        <g fill="#FFF" transform="translate(1216, 1072) matrix(-1, 0, 0, -1, 
16, 16)">
+            <path d="m 8,3 -5,0 a 2,2 0 0 0 -2,2 l 0,6 a 2,2 0 0 0 2,2 l 5,0"/>
+            <path d="m 8,0 0,16"/>
+        </g>
+        <g transform="translate(1184, 1040)">
+            <path d="m 8,16 0,-8 8,0"/>
+        </g>
+        <g transform="translate(1216, 1040) matrix(0, 1, -1, 0, 16, 0)">
+            <path d="m 8,16 0,-8 8,0"/>
+        </g>
+        <g transform="translate(1184, 1088) matrix(0, -1, 1, 0, 0, 16)">
+            <path d="m 8,16 0,-8 8,0"/>
+        </g>
+        <g transform="translate(1216, 1088) matrix(-1, 0, 0, -1, 16, 16)">
+            <path d="m 8,16 0,-8 8,0"/>
+        </g>
+        <text stroke="none" fill="#000" x="1208" y="1116" style="font-size: 
8pt;text-anchor: middle;font-weight: normal;">Example</text>
+        <g transform="translate(944, 1136)">
+            <path d="m -1,0 18,0"/>
+        </g>
+        <g transform="translate(928, 1136)">
+            <path d="m -1,0 18,0"/>
+        </g>
+        <g transform="translate(912, 1136)">
+            <path d="m -1,0 18,0"/>
+        </g>
+        <g transform="translate(896, 1136)">
+            <path d="m -1,0 18,0"/>
+        </g>
+        <g stroke-dasharray="2 2" transform="translate(944, 1152)">
+            <path d="m -1,0 18,0"/>
+        </g>
+        <g stroke-dasharray="2 2" transform="translate(928, 1152)">
+            <path d="m -1,0 18,0"/>
+        </g>
+        <g stroke-dasharray="2 2" transform="translate(912, 1152)">
+            <path d="m -1,0 18,0"/>
+        </g>
+        <g stroke-dasharray="2 2" transform="translate(896, 1152)">
+            <path d="m -1,0 18,0"/>
+        </g>
+        <g stroke-dasharray="3 4 4 4 3" transform="translate(944, 1168)">
+            <path d="m -1,0 18,0"/>
+        </g>
+        <g stroke-dasharray="3 4 4 4 3" transform="translate(928, 1168)">
+            <path d="m -1,0 18,0"/>
+        </g>
+        <g stroke-dasharray="3 4 4 4 3" transform="translate(912, 1168)">
+            <path d="m -1,0 18,0"/>
+        </g>
+        <g stroke-dasharray="3 4 4 4 3" transform="translate(896, 1168)">
+            <path d="m -1,0 18,0"/>
+        </g>
+        <g stroke-dasharray="5 8 5" transform="translate(944, 1184)">
+            <path d="m -1,0 18,0"/>
+        </g>
+        <g stroke-dasharray="5 8 5" transform="translate(928, 1184)">
+            <path d="m -1,0 18,0"/>
+        </g>
+        <g stroke-dasharray="5 8 5" transform="translate(912, 1184)">
+            <path d="m -1,0 18,0"/>
+        </g>
+        <g stroke-dasharray="5 8 5" transform="translate(896, 1184)">
+            <path d="m -1,0 18,0"/>
+        </g>
+        <g stroke-dasharray="5 3 2 3 5" transform="translate(944, 1200)">
+            <path d="m -1,0 18,0"/>
+        </g>
+        <g stroke-dasharray="5 3 2 3 5" transform="translate(928, 1200)">
+            <path d="m -1,0 18,0"/>
+        </g>
+        <g stroke-dasharray="5 3 2 3 5" transform="translate(912, 1200)">
+            <path d="m -1,0 18,0"/>
+        </g>
+        <g stroke-dasharray="5 3 2 3 5" transform="translate(896, 1200)">
+            <path d="m -1,0 18,0"/>
+        </g>
+        <g stroke-width="1" stroke="#000" transform="translate(944, 1216)">
+            <path d="m -0.5,0 17,0"/>
+        </g>
+        <g stroke-width="1" stroke="#000" transform="translate(928, 1216)">
+            <path d="m -0.5,0 17,0"/>
+        </g>
+        <g stroke-width="1" stroke="#000" transform="translate(912, 1216)">
+            <path d="m -0.5,0 17,0"/>
+        </g>
+        <g stroke-width="1" stroke="#000" transform="translate(896, 1216)">
+            <path d="m -0.5,0 17,0"/>
+        </g>
+        <g stroke-dasharray="1.5 2 2 2 2 2 2 2 1.5 " stroke-width="1" 
stroke="#000" transform="translate(944, 1232)">
+            <path d="m -0.5,0 17,0"/>
+        </g>
+        <g stroke-dasharray="1.5 2 2 2 2 2 2 2 1.5 " stroke-width="1" 
stroke="#000" transform="translate(928, 1232)">
+            <path d="m -0.5,0 17,0"/>
+        </g>
+        <g stroke-dasharray="1.5 2 2 2 2 2 2 2 1.5 " stroke-width="1" 
stroke="#000" transform="translate(912, 1232)">
+            <path d="m -0.5,0 17,0"/>
+        </g>
+        <g stroke-dasharray="1.5 2 2 2 2 2 2 2 1.5 " stroke-width="1" 
stroke="#000" transform="translate(896, 1232)">
+            <path d="m -0.5,0 17,0"/>
+        </g>
+        <g stroke-dasharray="2.5 4 4 4 2.5" stroke-width="1" stroke="#000" 
transform="translate(944, 1248)">
+            <path d="m -0.5,0 17,0"/>
+        </g>
+        <g stroke-dasharray="2.5 4 4 4 2.5" stroke-width="1" stroke="#000" 
transform="translate(928, 1248)">
+            <path d="m -0.5,0 17,0"/>
+        </g>
+        <g stroke-dasharray="2.5 4 4 4 2.5" stroke-width="1" stroke="#000" 
transform="translate(912, 1248)">
+            <path d="m -0.5,0 17,0"/>
+        </g>
+        <g stroke-dasharray="2.5 4 4 4 2.5" stroke-width="1" stroke="#000" 
transform="translate(896, 1248)">
+            <path d="m -0.5,0 17,0"/>
+        </g>
+        <g stroke-dasharray="4.5 8 4.5" stroke-width="1" stroke="#000" 
transform="translate(944, 1264)">
+            <path d="m -0.5,0 17,0"/>
+        </g>
+        <g stroke-dasharray="4.5 8 4.5" stroke-width="1" stroke="#000" 
transform="translate(928, 1264)">
+            <path d="m -0.5,0 17,0"/>
+        </g>
+        <g stroke-dasharray="4.5 8 4.5" stroke-width="1" stroke="#000" 
transform="translate(912, 1264)">
+            <path d="m -0.5,0 17,0"/>
+        </g>
+        <g stroke-dasharray="4.5 8 4.5" stroke-width="1" stroke="#000" 
transform="translate(896, 1264)">
+            <path d="m -0.5,0 17,0"/>
+        </g>
+        <g stroke-dasharray="4.5 3 2 3 4.5" stroke-width="1" stroke="#000" 
transform="translate(944, 1280)">
+            <path d="m -0.5,0 17,0"/>
+        </g>
+        <g stroke-dasharray="4.5 3 2 3 4.5" stroke-width="1" stroke="#000" 
transform="translate(928, 1280)">
+            <path d="m -0.5,0 17,0"/>
+        </g>
+        <g stroke-dasharray="4.5 3 2 3 4.5" stroke-width="1" stroke="#000" 
transform="translate(912, 1280)">
+            <path d="m -0.5,0 17,0"/>
+        </g>
+        <g stroke-dasharray="4.5 3 2 3 4.5" stroke-width="1" stroke="#000" 
transform="translate(896, 1280)">
+            <path d="m -0.5,0 17,0"/>
+        </g>
+        <text stroke="none" fill="#000" x="1000" y="1196" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Boxes and borders</text>
+        <g transform="translate(848, 1312)">
+            <circle cy="56" cx="56" r="48"/>
+        </g>
+        <g transform="translate(864, 1328)">
+            <circle cy="40" cx="40" r="40"/>
+        </g>
+        <g transform="translate(864, 1328)">
+            <circle cy="40" cx="40" r="32"/>
+        </g>
+        <g transform="translate(880, 1344)">
+            <circle cy="24" cx="24" r="24"/>
+        </g>
+        <g transform="translate(880, 1344)">
+            <circle cy="24" cx="24" r="16"/>
+        </g>
+        <g transform="translate(896, 1360)">
+            <circle cy="8" cx="8" r="8"/>
+        </g>
+        <text stroke="none" fill="#000" x="1000" y="1356" style="font-size: 
8pt;text-anchor: start;font-weight: normal;">Circles</text>
+    </g>
+</svg>
\ No newline at end of file



reply via email to

[Prev in Thread] Current Thread [Next in Thread]