【问题标题】:Improve positioning of subscript and superscript on node labels改进节点标签上下标和上标的定位
【发布时间】:2017-01-13 01:39:32
【问题描述】:

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

例子:

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?) 使用stylesheet = "styles.css";(回复:Using CSS classes in HTML labels on Graphviz)到我的dot 脚本,但是,它返回一个错误

错误:第 1 行上的未知 HTML 元素 &lt;span&gt;

【问题讨论】:

    标签: graphviz dot


    【解决方案1】:

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

    因此,我建议您查看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,因此您应该能够轻松调整它以满足您的确切要求。

    【讨论】:

    • 再次感谢 Gene,imo 这提供了最好的解决方案。 [如果需要,对齐数字的一种方法是使用 \phantom : texlbl="$X_{\phantom{(}1}^{(2)}$" ]
    【解决方案2】:

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

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

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

    1) 使用带有类似 html 的表格的标签,这确实允许自定义样式(并且可以很好地处理垂直放置的文本)。

    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 中。它将数字直接集中在彼此下方,这很好,但它确实在子/上标和节点标签之间增加了一点额外的空间。我会稍微看看我是否可以调整它。
    • 是的,使用style 属性调整布局应该会有所帮助。按照下面的建议使用 full tex 可能更适合您,但对其他人来说,摆弄表格可能就足够了。
    【解决方案3】:

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

    【讨论】:

    • 我期望的一件事是可能的,但阅读文档时感到惊讶的是,在使用 svg/raster 输出时直接将 svg 用于节点。我想这是因为执行 svg 不泄漏到区域外比使用 postscript 更难?
    • 感谢斯蒂芬的评论。是的,我认为更改 graphviz 源对于标签位置的微小变化来说有点远!
    • 我刚刚注意到这条评论。实际上,我有点惊讶我们不支持 SVG 导入(这不是所有 expat ghostscript 等机器的重点吗?)文档总是最新的。我们真的可以使用帮助来重新审视它。我认为渲染器可以找出导入代码的边界框,或者,只信任声明的边界框或信任 graphviz 用户声明正确的节点大小。从哲学上讲,这将是我们的一般方法。
    【解决方案4】:

    为了完整起见,我添加了一个使用 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];
    }
    

    结果*

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

    【讨论】:

      【解决方案5】:

      您可以创建一个独立的 SVG 文件(例如,使用 Inkscape 或类似文件),将上标直接放在下标上,然后将该 SVG 文件包含为节点的内容 (https://graphviz.org/docs/attrs/image/)

      【讨论】:

        猜你喜欢
        • 2019-10-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-07
        • 1970-01-01
        • 1970-01-01
        • 2015-02-11
        • 2012-05-27
        • 2015-11-24
        相关资源
        最近更新 更多