跟 Asymptote 认识了一下
MkIV 会错误的吃掉中文字符与半角标点之间的空白

使用 gnuplot 的 ConTeXt 终端

Garfileo posted @ 2010年6月19日 17:31 in ConTeXt 笔记 with tags ConTeXt MkIV gnuplot terminal gentoo , 6701 阅读

gnuplot 针对许多图形格式提供了相应的输出终端,可这样查看到它们:

$ gnuplot
gnuplot> set term

Available terminal types:
           canvas  HTML Canvas object
              cgm  Computer Graphics Metafile
          context  ConTeXt with MetaFun (for PDF documents)
            corel  EPS format for CorelDRAW
           dpu414  Seiko DPU-414 thermal printer [small medium large]
             dumb  ascii art for anything that prints text
              dxf  dxf-file for AutoCad (default size 120x80)
            eepic  EEPIC -- extended LaTeX picture environment
              emf  Enhanced Metafile format
            emtex  LaTeX picture environment with emTeX specials
         epslatex  LaTeX picture environment using graphicx package
... ...

上面所列举的只是部分输出终端,其中“context”终端是本文所讲述的重点内容。

首先要感谢 ConTeXt 社区的 Mojca Miklavec 所实现的这个 gnuplot 的 context 终端,不过该终端尚未被 gnuplot 集成。在 Unix-like 系统中,需要将 Mojca Miklavec 写的 context.trm 文件添加到 gnuplot 源码中。对此,这里有详细记载。

我是 Gentoo Linux 用户,那种 “configure && make && make install” 的源码编译安装方式显然有违 Portage 之道。既然入乡,还是随俗吧,所付出的代价不过修改一下 gnuplot 的 ebuild 而已。

在 Gentoo 中建立属于自己的 overlay

Gentoo 的包管理器——Portage 可以通过 PORTDIR_OVERLAY 这个环境变量去寻找用户个人建立的 overlay。可将个人的 overlay 所在目录定位在 /usr/local/portage/myebuilds(下文为叙述简便,以环境变量 MY_EBUILDS 指代该目录),然后在 /etc/make.conf 文件中添加:

PORTDIR_OVERLAY="/usr/local/portage/myebuilds $PORTDIR_OVERLAY"

这样,属于自己的 overlay 便建立完毕。个人所建的 overlay 中软件包的 ebuild 优先级要高于官方提供的。我们可以利用这一特性,从 Gentoo 官方的 portage 树中将 gnuplot 的 ebuild 文件所在的目录复制到个人 overlay 中,然后对 ebuild 脚本进行一些修改,用它安装 gnuplot。

首先用“eix -e gnuplot”命令查看 gnuplot 在官方 portage 树中对应的分支,结果显示“sci-visualization/gnuplot”。我们在 $MY_EBUILDS 中创建这一分支,即 $MY_EBUILDS/sci-visualization/gnuplot,然后将官方 portage 树中 gnuplot 分支所包含的文件(/usr/portage/sci-visualization/gnuplot/*)复制到 $MY_EBUILDS/sci-visualization/gnuplot 目录中。这时,运行 "emerge -pv gnuplot" 命令,如果显示以下信息:

$ emerge -pv gnuplot

These are the packages that would be merged, in order:

Calculating dependencies... done!
[ebuild   R   ] sci-visualization/gnuplot-4.4.0  USE="..." [0=>1]

Total: 1 package (1 reinstall), Size of downloads: 0 kB
Portage tree and overlays:
 [0] /usr/portage
 [1] /usr/local/portage/myebuilds

则说明个人 overlay 构建成功。上述信息提示我们,gnuplot 正由官方 portage 树过渡到个人 overlay 中。

Hacking gnuplot 的 ebuild 脚本

首先,从这里获得 context.trm 文件,并将其置于 $MY_EBUILDS/sci-visualization/gnuplot/files 目录,然后用文本编辑器并以超级用户权限打开 gnuplot-4.4.ebuild(最新版的 gnuplot 对应的 ebuild 脚本),寻找到 "src_prepare" 所在的代码块:

src_prepare() {
	# Add special version identification as required by provision 2
	# of the gnuplot license
	sed -i -e "1s/.*/& (Gentoo revision ${PR})/" PATCHLEVEL || die
}

在其中添加以下代码:

	cp ${FILESDIR}/context.trm ${S}/term
	sed -i 's:\#endif /\* \!SHORT_TERMLIST \*/:\
	    \#include "context.trm"\n#endif /\* \!SHORT_TERMLIST */:g' ${S}/src/term.h

然后在 $MY_EBUILDS/sci-visualization/gnuplot 目录中输入以下命令(让修改后的 ebuild 文件合法):

$ sudo ebuild gnuplot-4.4.ebuild manifest

然后就可以像普通的 gentoo 包那样安装 gnuplot:

$ sudo emerge gnuplot

测试数据图绘制

我对 gnuplot 不是很熟悉,这里仅给出一个较小的示例用以说明 ConTeXT 终端的使用方法。

首先,准备一份数据文件,例如两种算法运行时间的统计数据:

# file name: performance.dat
1.1    3    8
2.0    4    16
4.0    5    19
5.3    9    25
6.8    8    34
7.5    11   50
8.0    14   61
10.2   20   79

第一列数值是两种算法所处理的数据量,以万为单位,譬如“1.1”表示两种算法处理的三维数据点数为 1.1 x 10^4 个。第二列与第三列数值分别为两种算法的数据处理时间,以秒为单位。

下面尝试使用 gnuplot 的 ConTeXt 终端绘制上述数据文件的图形。

gnuplot 的 ConTeXt 终端有两种使用方式。第一种方式是可将 gnuplot 绘图代码嵌入到 ConTeXt 文稿中,第二种方式是在 gnuplot 程序运行时输出 ConTeXt 文稿;前者主要用于 gnuplot 图形内嵌于 ConTeXt 的文档排版结果之中,后者用于生成单独的图形文件(pdf 格式)。这两种方式的具体用法详见这里,本文只涉及后者的应用。下面是绘制上述数据文件的图形的 gnuplot 脚本:

set term context standalone size 15cm,10cm
set output 'test.tex'
plot "performance.dat" using 1:2 title "al-1" with lines, \
     "performance.dat" using 1:3 title "al-2" with linespoints

在 gnuplot 运行环境中 load 这一脚本,可在当前目录生成 test.tex 文件,然后使用 context 命令编译该文件,即可得到载有 gnuplot 所绘图形的 pdf 文档,如下图所示。

若上面的 gnuplot 脚本运行正常,继续尝试是否可在 gnuplot 图形中采用中文进行标注,如下:

set term context standalone size 15cm,10cm header '\usemodule[zhfonts]'
set output 'test.tex'
set title "算法性能测试"
set xlabel "数据点数(万)"
set ylabel "算法运行时间(秒)"
plot "performance.dat" using 1:2 title "算法 1" with lines, \
     "performance.dat" using 1:3 title "算法 2" with linespoints

脚本中出现的"header '\usemodule[zhfonts]"表示将 "header" 之后引号包含的代码插入到所生成的 ConTeXt 文稿的导言区,而 "\usemodule[zhfonts]" 则是使用我写的一个 ConTeXt 中文字体加载模块,详见这里

上面的 gnuplot 脚本所生成的 ConTeXt 文稿的编译结果如下图所示。

转载时,希望不要链接文中图片,另外请保留本文原始出处:http://garfileo.is-programmer.com

lxping 说:
2011年6月29日 20:54

谢谢你的网页将我带入context的世界!现在我的电脑上context配置好了,这两天在结合源码看你的《context学习笔记》差不多可以处理日常文档了,不过想做得个性化,比如你有个文档里面有个“悄悄话”的环境,这些如何定义还不知道,所以想请你推荐几个教材关于流程图FLOWcharts、还有就是做“悄悄话”这方面的~最好注目到哪里去下载~感谢~

lxping 说:
2011年6月29日 21:00

这个对我倒是非常有用,以前是在win下破解origin做图,现在可以用gnuplot,这是太高兴了

Avatar_small
Garfileo 说:
2011年6月29日 21:32

@lxping: 悄悄话,在 metafun 手册里,见 http://wiki.contextgarden.net/MetaFun

flowchart 有专门的文档 http://wiki.contextgarden.net/Flow_Charts

多去 wiki.contextgarden.net 上找找,资料很多


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter