改进下标和上标在节点标签上的定位
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> (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> (c1)> shape=circle];
e1 [label="T0 (e1)" shape=box];
}
结果*
*请忽略不完整的箭头,我从一个更大的例子中提取了这个样本。
您可以创建一个独立的 SVG 文件(e.g.using Inkscape 或类似文件),上标直接位于下标上方,然后将该 SVG 文件作为节点的内容包含在内(https://graphviz.org/docs/attrs/image/)
在节点标签上同时使用下标和上标时,是否可以更改定位,使它们直接位于彼此之上。
示例:
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> (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> (c1)> shape=circle];
e1 [label="T0 (e1)" shape=box];
}
结果*
*请忽略不完整的箭头,我从一个更大的例子中提取了这个样本。
您可以创建一个独立的 SVG 文件(e.g.using Inkscape 或类似文件),上标直接位于下标上方,然后将该 SVG 文件作为节点的内容包含在内(https://graphviz.org/docs/attrs/image/)