我正在使用Graphviz绘制一些图表。我在节点上使用标签,我可以放入"\n"
强制它将标签分成2行。有没有办法让Graphviz(或我正在使用的dot
)自动看到它应该拆分一些节点标签,并为它自己做出最佳的自动选择?
答案 0 :(得分:11)
是的,类似HTML的标签(<...>
)支持
标签,使用它可以打破线条。 E.g。
"A" -> "B"
[label = <1. <br/>
2. <br/>
3. <br/>
4. <br/>
.... <br/>
> color="blue" style="dashed"];
将这些Graphviz嵌入LaTeX时也可以使用,\n
不会。
答案 1 :(得分:10)
我也搜索了这个,但我不认为它在当前版本中是可能的。当前的“解决方案”是编写代码,根据节点之间的最小距离(nodesep
属性,如果我没有弄错的话),每隔几个字符自动添加“\ n”。
答案 2 :(得分:1)
(不确定我们应该如何处理重复的问题吗?)
dot2tex(胶乳+ graphviz)处理文字换行, 以及针对graphviz的排版限制的其他解决方法。 您会在this重复问题中找到一个简短示例, 具有规定的固定线宽。
答案 3 :(得分:1)
有人编写了一个 Perl 脚本来实现这一点。我在他的博客中找到了它:Text wrapping with dot (graphviz)。
Perl 脚本:
#!/usr/bin/perl
use strict;
my $usage = "setdotlabelwidth [char-width] < [dotfile]";
my $width = shift() or die("Usage: $usage $!");
while(<STDIN>)
{
if(m/label="(.*?)"/)
{
my $labeltext = $1;
my @words = split(/ /, $labeltext);
my @newtext = ();
my $newline = "";
foreach my $word(@words)
{
if( length($newline) > 0 and
length($newline) + length($word) > $width )
{
push(@newtext, $newline);
$newline = "";
}
$newline .= " " if( length($newline) > 0 );
$newline .= $word;
}
push(@newtext, $newline) if( length($newline) > 0 );
my $newlabel = join("\\n", @newtext);
s/label=".*?"/label="$newlabel"/;
}
print;
}
将此程序保存为 setdotlabelwidth,然后只需将输出通过管道传输到 GraphViz。比如你想设置宽度为35个字符,那么命令是:
<块引用>./setdotlabelwidth 35 < tile-error-correction.dot | dot -Tpng -o tile-error-correction.png
之前: 之后: