答案1
大多数词云生成器只是根据文本中的相对频率生成一个缩放的单词,然后以一种很好的方式将所有内容打包在一起。Wordle 真正出色的地方在于使用形状每个字母的宽度,而不是边界框。这就是生成的词云中空白空间非常小的原因。
据我所知,TeX 只知道单词的边界框。因此,即使知道 wordle 算法(是吗?),我们也需要更多钩子来在 TeX 中实现它。也许可以使用 luatex+mplib 来访问字形的形状,但我不知道细节。
更简单的选择是使用 worldle 生成 png,然后将 png 包含在您的 tex 文件中。支持 wordle 的引擎的 java 文件可从以下位置获取http://www.alphaworks.ibm.com/tech/wordcloud(您需要先注册)。然后,只需提供一些管道,以便
\begin{wordle}
lots of text
\end{wordle}
将文本存储在外部文件中,通过 wordle 运行,并包含生成的 png。例如,如果您想在 ConTeXt 中执行此操作
下载 IBM Word Cloud 引擎。解压文件后,我删除了文件夹名称中的空格,并将其重命名为“IBM-Word-Cloud”。
下载外部过滤器模块
然后你可以按如下方式创建词云
\usemodule[过滤器] \定义外部过滤器 [词云] [filtercommand=/opt/java/jre/bin/java -jar $HOME/IBM-Word-Cloud/ibm-word-cloud.jar -c $HOME/IBM-Word-Cloud/示例/configuration.txt -w 800-h 600 -o \外部过滤器输出文件\空间 -i \外部过滤器输入文件, 输出=\externalfilterbasefile.png, 读取命令=\ExternalFigure, 继续=是, ] \def\外部图#1{\外部图[#1]}
然后使用
\startwordcloud
lots of words
\stopwordcloud
看到这个博客文章更多细节。
答案2
这是我的第一篇帖子。昨天我看到了这个问题,并编写了一些 PERL 代码。我知道这与你想要的并不完全相同,而且我知道用 TeX 来做会更好,但也许这对某些人来说很有用。它有两个选项:
制作索引条目的词云:
./latextotagcloud.pl index file.tex > file.html
制作引用作者的词云:
./latextotagcloud.pl citea file.tex > file.html
制作引用文档的词云:
./latextotagcloud.pl cited file.tex > file.html
新代码 (v 2.0) 更新于 2011 年 10 月 18 日 这个新代码允许彩色图像 我喜欢它们,因为小单词可以通过其颜色突出显示。我在单色云中看到长单词因其宽度而引人注目。
#!/usr/bin/perl -w
#v. 2.0
#(c) Xavier de Blas, 2011. This code is GPL 2.0.
use HTML::TagCloud_colors;
#recommended:
$background = "#ffffff"; $color_small ="#333333"; $color_big ="#ff0000";
#alternatives
#$background = "#000066"; $color_small ="white"; $color_big ="red";
#$background = "#ffffff"; $color_small ="#333333"; $color_big ="blue";
if( @ARGV != 2 or ( $ARGV[0] ne "index" and $ARGV[0] ne "citea" and $ARGV[0] ne "cited") ) {
print STDERR "Usage:\n ./latextotagcloud.pl option file.tex > file.html \n(option: index or citea or cited)\n";
exit(0);
}
$option = shift(@ARGV);
open(IN,shift(@ARGV));
undef $/;
while(<IN>) {
if($option eq "index") {
while($_ =~ /\\index{([^@!}\|]*)([^}]*)}/g) {
# while($_ =~ /\\index{([^!}\|]*)([^}]*)}/g) {
$matched = $1;
unless ($2 =~ m/^\|see/) { #don't use the "see other concept" entries
$matched =~ s/ /-/g; #Converts: Index A B -> Index-A-B
# if($matched =~ m/@/) { ($matchedSorting, $matched)=split(/@ /,$matched); }
$seen{$matched}++;
}
}
} elsif($option eq "citea") {
#next line gets "Bosco" in "Bosco1993", but "W3Schools" is written to match "W3Schools2001"
while($_ =~ /\\cite[^{]*{(W3Schools|[A-Za-z'\-]+)[^}]*}/g) {
$seen{$1}++;
}
} elsif($option eq "cited") {
while($_ =~ /\\cite[^{]*{([A-Za-z0-9'\-]+)[^}]*}/g) {
$seen{$1}++;
}
}
}
print "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
print "<style type=\"text/css\">\n \@import url(latextotagcloud.css);\n</style>";
$maxLevels = 1;
foreach(keys %seen) {
if($seen{$_} > $maxLevels) { $maxLevels = $seen{$_}; }
}
my $cloud = HTML::TagCloud->new(levels=>$maxLevels);
foreach(sort keys %seen) {
$latinized = $_;
$latinized =~ s/'a/á/g;
$latinized =~ s/'e/é/g;
$latinized =~ s/'i/í/g;
$latinized =~ s/'o/ó/g;
$latinized =~ s/'u/ú/g;
$cloud->add("$latinized", "", $seen{$_});
}
print $cloud->html_and_css();#if put a value, limit to that number of tags
open RFILE,">colors.R";
print RFILE "as.data.frame(colorRampPalette(c('$color_small', '$color_big'))($maxLevels+1))"; #ELMILLOR
close RFILE;
system("R CMD BATCH --slave --no-timing colors.R latextotagcloud_pre.css");
open CSSFILE1,"latextotagcloud_pre.css";
open CSSFILE2,">latextotagcloud.css";
$/="\n";
$line = 0;
print CSSFILE2 "<style type=\"text/css\">\n
#htmltagcloud {
text-align: center;
line-height: 1;
}
body { background: $background; }
";
while(<CSSFILE1>){
unless($line == 0) {
$_ =~ /#(......)/;
print CSSFILE2 "span.tagcloud" . ($line-1) ." a {text-decoration: none; color: #$1;}\n";
}
$line ++;
}
print CSSFILE2 "</style>";
close CSSFILE1;
close CSSFILE2;
这是旧代码(v 1.0),请勿使用!
#!/usr/bin/perl -w
#(c) Xavier de Blas, 2011. This code is GPL 2.0.
use HTML::TagCloud;
if( @ARGV != 2 or ( $ARGV[0] ne "index" and $ARGV[0] ne "citea" and $ARGV[0] ne "cited") ) {
print STDERR "Usage:\n ./latextotagcloud.pl option file.tex > file.html \n(option: index or citea or cited)\n";
exit(0);
}
$option = shift(@ARGV);
open(IN,shift(@ARGV));
undef $/;
while(<IN>) {
if($option eq "index") {
while($_ =~ /\\index{([^@!}\|]*)[^}]*}/g) {
($underscored = $1) =~ s/ /_/g; #Converts: Index A B -> Index_A_B
$seen{$underscored}++;
}
} elsif($option eq "citea") {
#next line gets "Bosco" in "Bosco1993", but "W3Schools" is written to match "W3Schools2001"
while($_ =~ /\\cite[^{]*{(W3Schools|[A-Za-z\-]+)[^}]*}/g) {
$seen{$1}++;
}
} elsif($option eq "cited") {
while($_ =~ /\\cite[^{]*{([A-Za-z0-9\-]+)[^}]*}/g) {
$seen{$1}++;
}
}
}
my $cloud = HTML::TagCloud->new();
foreach(sort keys %seen) { $cloud->add("$_", "", $seen{$_}); }
print "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
print $cloud->html_and_css();
保存在名为的文件中:
latextotagcloud.pl
然后执行:
chmod +x latextotagcloud.pl
您需要安装 libhtml-tagcloud-perl(显然还有 perl)。
使用新的 2.0 代码,您将需要安装 R(例如在 debian/ubuntu 系统上安装 r-base)使用新的 2.0 代码,您还需要修改 libtagcloud。Debian/Ubuntu 说明:
- dpkg -L libhtml-tagcloud-perl
- 查找:TagCloud.pm
- 在 Linux Mint(Debian/Ubuntu)中位于:/usr/share/perl5/HTML/TagCloud.pm
- 转到 /usr/share/perl5/HTML 并复制文件:
- sudo cp TagCloud.pm TagCloud_colors.pm
- 在 TagCloud_colors 中更改此项:
foreach my $level (0 .. $self->{levels}) {
my $font = 12 + $level;
对此:
my $fontMin = 12;
my $fontMax = 36;
my $fontRang = $fontMax - $fontMin;
foreach my $level (0 .. $self->{levels}) {
#my $font = 12 + $level;
my $font = $fontMin + ( $fontRang * $level / $self->{levels} );
这样,您将拥有一个 html 云,为了让它在您的文档中看起来更美观,您可以:
- 在浏览器中打开,打印为 PDF。
- 在 Inkscape 中打开 PDF,选择所有单词(截断空白纸)、属性(调整到选择),打印为 PDF。
- 在您的 LaTeX 或 LyX 文档中包含 PDF。
这是今天我的博士论文(v1.0)中引用的作者的结果:
(v2.0)的结果:
也许您可以使用相同的方法并连接到 Wordle,我没有这样做,因为 Worlde 不是免费软件。
希望能帮助到你
答案3
由于 wordle 似乎很难找到,所以这里是另一个(非 LaTeX)工具创建可供下载的精美图像。它非常可定制(您可以为文本定义多个方向,并选择字体、大小动态、螺旋形状、字数……)
它基于开源d3-云算法原理解释这里,以防有人想尝试在 Tikz 中实现它 ^^
例子: