SVG mit Element-IDs generieren

SVG mit Element-IDs generieren

Ich erstelle einen Stammbaum mit demGenealogiebaumPaket. Ich beabsichtige, die Ausgabe sowohl zum Drucken als auch für eine interaktive Webseite zu verwenden.

Für die Webseite kann ich mithilfe von dvilualatexund ein SVG generieren dvisvgm, das ich anzeigen und den Namen im Baum Klickhandler hinzufügen kann, um weitere Informationen auf der Seite anzuzeigen.

Die generierten Textelemente im SVG sind jedoch sehr spärlich und enthalten nur den inneren Text und alle befinden sich auf derselben Ebene im Dokument, zum Beispiel:

<text class='f2' transform='matrix(1 0 0 1 951.279 373.834)' x='-37.0118' y='-2.45512'>
    <tspan>N</tspan>
    <tspan x='-28.5655'>a</tspan>
    <tspan x='-23.9577'>m</tspan>
    <tspan x='-20.3533'>e</tspan>
</text>

Ich möchte die Datenbank-ID für jede Person irgendwie in diesen Knoten einbinden.

Ich konnte dieses Ergebnis erzielen, indem ich für jede Person eine eindeutige Farbe verwendet und das SVG nachbearbeitet habe, um es wieder in die entsprechenden IDs umzuwandeln. Dies ist jedoch etwas schwierig zu handhaben.

Gibt es einen natürlicheren Weg, dies zu erreichen?

Ein minimales Beispieldokument:

\documentclass[9pt]{article}
\usepackage[all]{genealogytree}

\newcommand{\traditional}{
    \begin{minipage}[c][\gtrNodeMinHeight]{\gtrNodeMinWidth}
        \begin{center}
            \gtrBoxContent
        \end{center}
    \end{minipage}
}

\begin{document}
    \begin{tikzpicture}
        \genealogytree[node processor=\traditional]{
            child{
                g{Alice}
                p{Bob}
                c{Charlie}
            }
        }
    \end{tikzpicture}
\end{document}

Führen Sie es durch und erstellen Sie dvilualatexanschließend dvisvgmdas SVG.

Antwort1

Der Vorschlag zur VerwendungdvisvgmBesonderheitenermöglicht eine sehr elegante Lösung, indem jeder Knoten einfach in ein „rohes“ <g>Tag mit den gewünschten Attributen eingebunden wird. Wenden wir dies auf das obige Beispieldokument an:

\documentclass[9pt]{article}
\usepackage[all]{genealogytree}

\newcommand{\traditional}{
    \begin{minipage}[c][\gtrNodeMinHeight]{\gtrNodeMinWidth}
        \begin{center}
            \gtrBoxContent
        \end{center}
    \end{minipage}
}

\begin{document}
    \begin{tikzpicture}
        \genealogytree[node processor=\traditional]{
            child{
                g{\special{dvisvgm:raw <g id='alice'>}Alice\special{dvisvgm:raw </g>}}
                p{\special{dvisvgm:raw <g id='bob'>}Bob\special{dvisvgm:raw </g>}}
                c{\special{dvisvgm:raw <g id='charlie'>}Charlie\special{dvisvgm:raw </g>}}
            }
        }
    \end{tikzpicture}
\end{document}

Ich bin sicher, dass dies in einem Makro zusammengefasst werden könnte. In meinem Fall erstelle ich das Latex-Dokument bereits über eine Vorlagensprache, daher ist diese Art von Inline-Code sehr praktisch.

verwandte Informationen