改进下标和上标在节点标签上的定位

Improve positioning of subscript and superscript on node labels

在节点标签上同时使用下标和上标时,是否可以更改定位,使它们直接位于彼此之上。

示例:

digraph G {
        x11[label=<X<SUB>1</SUB><SUP>(1)</SUP>>];   
        x21[label=<X<SUB>2</SUB><SUP>(1)</SUP>>];
        x11 -> x21 
    }

产生

是否可以让 (#) 直接位于 # 上方而不是稍微靠右?谢谢


我尝试添加自定义 css 脚本(回复:HTML: can I place subscript text right under the superscript?) 我的 dot 脚本 stylesheet = "styles.css"; (回复:Using CSS classes in HTML labels on Graphviz),然而,它 returns 一个错误

Error: Unknown HTML element <span> on line 1

根据 Graphviz 文档,它们的 'HTML-Like Labels' 不包含 span 元素,并且字体样式标签不允许样式属性(或任何其他):

<SUB
  <!-- No attributes -->
>

<SUP
  <!-- No attributes -->
>

精确文本布局的两个最佳选择似乎是:

1) 使用带有 html-like table 的标签,它允许自定义样式(无论如何都可以很好地处理垂直放置的文本)。

x11[label=<
    <TABLE border="0" cellborder="0" cellspacing="0">
    <TR><TD rowspan="2" style="...">X</TD><TD style="...">(1)</TD></TR>
    <TR>                                  <TD style="...">1</TD></TR>
    </TABLE>>];

2) 如果使用 PostScript 驱动程序,override the node generation entirely 并提供一个 ps 文件来准确绘制您想要的内容。

Graphviz 的原生 HTML 类节点渲染非常有限。 Graphviz 文档清楚地说明了这一点。我不相信有办法哄它做你想做的事。即使有办法调整,例如一个<table>定义去做,结果很可能看起来很糟糕。

因此,我建议你看看dot2tex。它的全部目的是让 LaTeX 的全部功能用于渲染节点。设置并不简单,但结果是值得的。

Here's a page 显示节点中包含 LaTeX 集数学的图形示例。

你没有说输出应该是什么。但是有多种方法可以将 LaTeX 转换为许多不同的形式。最简单的是 Postscript 和 PDF。但是图片格式也是可以的。

加法

好的,我安装了 dot2tex,结果如下:

对应的dot代码如下:

digraph G {
  a_1 [texlbl="$X_{1}^{(1)}$"];
  a_2 [texlbl="$X_{1}^{(2)}$"];
  a_3 [texlbl="$X_{1}^{(3)}$"];
  a_1-> a_2 -> a_3 -> a_1;
}

我用

编译
$ dot2tex foo.gv -f tikz > foo.tex
$ pdflatex foo.tex

由于您已经在使用 LaTeX,因此您应该能够毫不费力地对其进行调整以满足您的具体要求。

也许我们可以引入一个更强大的 HTML 渲染器(我刚刚注意到 litehtml 和非开源的 sciter),它可能有自己的制作系统、潜在的安全问题、自己的字体和颜色名称管理、共享字符串、C++ 编译器依赖项、内存泄漏和 litehtml 例如只有 16K 行代码,这些天几乎没有为我们移动仪表,只是当我看到关于构建 graphviz 比如何更难的推文时,我总是感到有点内疚linux 内核。斯蒂芬·诺斯

为了完整起见,我添加了一个使用 C 生成 Graphviz 代码并利用 HTML 标签的示例示例:

C代码

for (i = 1; i <= numco; i++)
    printf("  c%d [label= <%s<FONT COLOR=\"red\"><SUP>%d</SUP></FONT>&nbsp;(c%d)> shape=circle];\n",
            i,plname[co2pl[i]],tokens[i],i);

点码

digraph test {
    c1 -> e1;
    c1 [label= <P2<FONT COLOR="red"><SUP>0</SUP></FONT>&nbsp;(c1)> shape=circle];
    e1 [label="T0 (e1)" shape=box];
}

结果*

*请忽略不完整的箭头,我从一个更大的例子中提取了这个样本。

您可以创建一个独立的 SVG 文件(e.g.using Inkscape 或类似文件),上标直接位于下标上方,然后将该 SVG 文件作为节点的内容包含在内(https://graphviz.org/docs/attrs/image/