S式をdot形式に変換し、graphvizで画像を生成する。以前の試みと比較すれば*1、今回は見栄えを改善できたと言って良いだろう。
以下のS式をまず入力する。
(defparameter *subgraphs* '( ( (:style filled) (:fontname "APJapanesefont") (:label blechmusik) ((node) (:style filled) (:fontname "APJapanesefont")) (:color blue) ((nuri kuro kiri)) ) ( (:style filled) (:fontname "APJapanesefont") (:label kouy) ((node) (:style filled) (:fontname "APJapanesefont")) (:color red) ((geta new)) ((geta jis)) ) ( (:style filled) (:fontname "APJapanesefont") (:label mogy) ((node) (:style filled) (:fontname "APJapanesefont")) (:color brown) ((hiyori)) ) )) (defparameter *options* '( (graph (:label "下駄配列の派生図") (:fontname "APJapanesefont") (:labelloc t) (:rankdir "LR") ) (node (:fontname "APJapanesefont") ) ((kuro hiyori)) )) (defparameter *nodes* '( (geta ("下駄配列")) (nuri ("塗り下駄配列")) (jis ("新JIS下駄配列")) (hiyori ("日和下駄配列")) (new ("新下駄配列")) (kuro ("黒塗り下駄配列")) (kiri ("黒塗り桐下駄配列")) )) (defparameter *edges* '( (geta ;; (new) (nuri) ;; (jis) (hiyori) ) (nuri ;; (kuro) ) (kuro (hiyori) ;; (kiri) ) (kiri (kuro) ) ))
これをもとにdot形式の文字列を出力する。
(digraph->dot *nodes* *edges* *options* *subgraphs*)
これによって出力されるdot形式の内容はつぎのとおりである。
digraph G { subgraph cluster_0 { fontname="APJapanesefont"; label=blechmusik; node [style=filled, fontname="APJapanesefont"]; color=blue; nuri -> kuro -> kiri; } subgraph cluster_1 { fontname="APJapanesefont"; label=kouy; node [style=filled, fontname="APJapanesefont"]; color=red; geta -> new; geta -> jis; } subgraph cluster_2 { fontname="APJapanesefont"; label=mogy; node [style=filled, fontname="APJapanesefont"]; color=brown; hiyori; } graph [label="下駄配列の派生図", fontname="APJapanesefont", labelloc=t, rankdir="LR"]; node [fontname="APJapanesefont"]; kuro -> hiyori [label=""]; geta [label="下駄配列"]; nuri [label="塗り下駄配列"]; jis [label="新JIS下駄配列"]; hiyori [label="日和下駄配列"]; new [label="新下駄配列"]; kuro [label="黒塗り下駄配列"]; kiri [label="黒塗り桐下駄配列"]; geta -> nuri [label=""]; geta -> hiyori [label=""]; kiri -> kuro [label=""]; }
S式をdot形式に変換する処理のソースはsoftware:sbcl:example:graphvizを参照のこと。