Генерация SVG с идентификаторами элементов

Генерация SVG с идентификаторами элементов

Я создаю генеалогическое древо, используягенеалогическоедеревопакет. Я намерен использовать вывод как для печати, так и для интерактивной веб-страницы.

Для веб-страницы я могу сгенерировать SVG-файл с помощью dvilualatexи dvisvgm, который я могу отобразить и добавить обработчики щелчков к именам в дереве, чтобы отобразить больше информации на странице.

Однако сгенерированные текстовые элементы в SVG очень разрежены, содержат только внутренний текст и все находятся на одном уровне в документе, например:

<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>

Я хотел бы каким-то образом включить идентификатор базы данных для каждого человека в этот узел.

Мне удалось добиться этого результата, используя уникальный цвет для каждого человека и выполняя постобработку SVG, чтобы преобразовать его обратно в соответствующие идентификаторы, но это довольно сложно осуществить.

Есть ли более естественный способ добиться этого?

Минимальный пример документа:

\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}

Выполните dvilualatexследующие действия dvisvgmдля создания SVG.

решение1

Предложение использоватьdvisvgmспециальные предложенияпозволяет очень элегантное решение, просто обернув каждый узел в «сырой» <g>тег с любыми желаемыми атрибутами. Применяем это к примеру документа выше:

\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}

Я уверен, что это можно было бы привести в порядок в макросе. В моем случае я уже генерирую документ latex через язык шаблонов, поэтому такой встроенный код очень практичен.

Связанный контент