「Graphviz」- 绘制表格 @20210129

问题描述

我们经常需要绘制网络报文、内存数据结构等等的示意图。这些示意图,多半是种“表格“结构:

我们需要使用标记语言绘制这种表格(比如,在 Zim 中(总之我们有这种需求))。

该笔记将记录:如何使用 Graphviz 绘制表格,以及整理相关文档。

解决方法

我们这里以绘制在 x86 Protected Mode 下的 GDT 段描述符为例。

如下为绘制”GDT 段描述符表格“的 DOT 代码:

digraph G {

    graph [pad="0.5", nodesep="0.5", ranksep="2", fontsize=10];
    node [shape=plain, fontsize=10, 
        fontname="Microsoft YaHei"];

    Foo [label=<
        <table border="0" cellborder="1" cellspacing="0" cellpadding="2">
            <tr>
                <td colspan="0" width="10" >00</td>
                <td colspan="0">01</td>
                <td colspan="0">02</td>
                <td colspan="0">03</td>
                <td colspan="0">04</td>
                <td colspan="0">05</td>
                <td colspan="0">06</td>
                <td colspan="0">07</td>
                <td colspan="0">08</td>
                <td colspan="0">09</td>
                <td colspan="0">10</td>
                <td colspan="0">11</td>
                <td colspan="0">12</td>
                <td colspan="0">13</td>
                <td colspan="0">14</td>
                <td colspan="0">15</td>
                <td colspan="0">16</td>
                <td colspan="0">17</td>
                <td colspan="0">18</td>
                <td colspan="0">19</td>
                <td colspan="0">20</td>
                <td colspan="0">21</td>
                <td colspan="0">22</td>
                <td colspan="0">23</td>
                <td colspan="0">24</td>
                <td colspan="0">25</td>
                <td colspan="0">26</td>
                <td colspan="0">27</td>
                <td colspan="0">28</td>
                <td colspan="0">29</td>
                <td colspan="0">30</td>
                <td colspan="0">31</td>
            </tr>
            <tr>
                <td colspan="8">Base address (31-24)</td>
                <td colspan="1">G</td>
                <td colspan="1">D/B</td>
                <td colspan="1">L</td>
                <td colspan="1">A</td>
                <td colspan="4">Segment Limit (19-16)</td>
                <td colspan="1">P</td>
                <td colspan="2">DPL</td>
                <td colspan="1">S</td>
                <td colspan="4">Type</td>
                <td colspan="8">Base Address (23-16)</td>
            </tr>
            <tr>
                <td port="2" colspan="16">Base Address (15-0)</td>
                <td port="2" colspan="16">Segment Limit(15-0)</td>
            </tr>
        </table>
    >];
}

如下是使用该 DOT 代码生成的图片:

已知问题

我们发现:1)我们无法固定格子(Cell)的大小。当文本过长时,格子会变宽(失去比例);2)编写 HTML 也算不上便捷;

针对该问题(绘制这种“字节插图”),我们可以使用 bytefield 处理

相关链接

Graphviz - label attribute
Graphviz (dot) examples
Graphviz: HTML like labels

参考文献

WikiNotes/绘制表格
Creating Table Relationship Diagrams with GraphViz
Graphviz (dot) examples


posted @ 2021-01-29 11:04  研究林纳斯写的  阅读(276)  评论(0编辑  收藏  举报