问题描述
我们经常需要绘制网络报文、内存数据结构等等的示意图。这些示意图,多半是种“表格“结构:
我们需要使用标记语言绘制这种表格(比如,在 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
参考文献
Creating Table Relationship Diagrams with GraphViz
Graphviz (dot) examples