2008年7月16日星期三

OpenSUSE 11.0 下Latex中文


Linux下LATEX中文一直是件头疼的事情,不同发行版解决办法不尽相同,有时甚至同一发行版的前后两个版本也有差别,OpenSUSE就是如此!

现把OpenSUSE 11.0下texlive中文解决方案记录如下:

由于电脑是双系统,windows下已经安装了最新的CTeX和ctex-fonts,所以解决方案以此为基础。

1. 把windows 下$LOCALTEXMF/tex/latex 拷贝到/usr/share/texmf/tex/latex,然后mktexlsr,这样可以安装CJK等大部分宏包;

2. 这时用LATEX编译中文TEX文件会提示找不到tfm字体,需要把$LOCALTEXMF/fonts/tfm/chinese 拷贝到/usr/share/texmf/fonts/tfm/chinese,但是此时xdvi无法预览生成的dvi文件,这是因为xdvi 没有找到相应的map文件,这时需要把$LOCALTEXMF/dvips/chinese拷贝到/usr/share/texmf/map/dvips/chinese,然后mktexlsr、“updmap-sys --edit”把拷贝过来的几个t1-gbk*.map添加进去;

3. 为了实现dvipdfm 需要把$LOCALTEXMF/fonts/type1/chinese 拷贝到/usr/share/texmf/fonts/type1/chinese,把$LOCALTEXMF/pdftex/chinese 拷贝到/usr/share/texmf/fonts/enc/pdftex/chinese,其中的map文件拷贝到/usr/share/texmf/fonts/map/pdftex/chinese下面,最后mktexlsr就可以了;

4. 最困难的是实现dvipdfmx,首先是把simsun等几个字体拷贝到/usr/share/texmf/fonts/truetype下面,然后添加/var/lib/texmf/fonts/map/dvipdfm/cid-x.map文件,内容如下:

gbksong@UGBK@ unicode :0:simsun.ttf
gbksongsl@UGBK@ unicode :0:simsun.ttf -s .167
gbkhei@UGBK@ unicode :0:simhei.ttf
gbkheisl@UGBK@ unicode :0:simhei.ttf -s .167
gbkkai@UGBK@ unicode :0:simkai.ttf
gbkkaisl@UGBK@ unicode :0:simkai.ttf -s .167
gbkfs@UGBK@ unicode :0:simfang.ttf
gbkfssl@UGBK@ unicode :0:simfang.ttf -s .167
gbkli@UGBK@ unicode :0:simli.ttf
gbklisl@UGBK@ unicode :0:simli.ttf -s .167
gbkyou@UGBK@ unicode :0:simyou.ttf
gbkyousl@UGBK@ unicode :0:simyou.ttf -s .167
unisong@Unicode@ unicode :0:simsun.ttf
unisongsl@Unicode@ unicode :0:simsun.ttf -s .167
unihei@Unicode@ unicode :0:simhei.ttf
uniheisl@Unicode@ unicode :0:simhei.ttf -s .167
unikai@Unicode@ unicode :0:simkai.ttf
unikaisl@Unicode@ unicode :0:simkai.ttf -s .167
unifs@Unicode@ unicode :0:simfang.ttf
unifssl@Unicode@ unicode :0:simfang.ttf -s .167
unili@Unicode@ unicode :0:simli.ttf

然后,修改/usr/share/texmf/dvipdfm/dvipdfmx.cfg只使用cid-x.map文件;最后把/usr/share/ghostscript/Resource/CMap下面的所有文件拷贝到/usr/share/texmf/font/cmap下面后mktexlsr即可。

经过上述操作后,使用LATEX和dvipdfmx就可以编译utf-8和GBK两种编码的TEX文档,而且得到的pdf文件都支持中文拷贝,哈哈!GBK编码的TEX文档还可以使用latex->dvips->ps2pdf得到不可拷贝的pdf,UTF-8的文档则需要simsun等字体的tfm和pfb字体以及enc文件(均可用fontforge生成),才能通过dvips和ps2pdf得到pdf文档,得到的pdf是可拷贝的,呵呵!

说明:配置dvipdfmx最诡异的就是cid-x.map文件,如果使用网上的方法设置为:
gbksong@UGBK@ UniGB-UTF16-H(或UniGB-UCS2-H ) :0:simsun.ttf
GBK编码的TeX文档得到的pdf文档无法拷贝,改成前面的格式就可以,不明白原因,哪位大侠给解释一下?

2008年7月2日星期三

Show 一下我的硕士答辩beamer!

把我硕士论文答辩的beamer贴出来供各位参考一下。模板是网上搜到的,我做了一些修改。由于这里不能上传附件,所以把模板链接贴出来:

http://www.newsmth.net/bbsanc.php?path=%2Fgroups%2Fcomp.faq%2FTeX%2Fslides%2Fbeamer%2FM.1167373299.g0

把附件中的themes.zip在beamer的目录下面解压缩,然后mktexlsr刷新就可以了。在Debian Sid下beamer的目录是/usr/share/texmf/tex/latex/beamer,其它系统类似。模板左下角的ETIRS在$BEAMER/themes/theme/IAS/ias_text.tex里面修改。附件中的yisl04.zip就是我的beamer的源文件。其中的图片大部分是用metapost画的。文件pdflatex编译即可,呵呵!




Metapost 个人总结

接触metapost是因为latex,到现在metapost的手册也看了几遍了,但真正熟练运用metapost还是因为毕业论文。我的毕业论文是用latex写的,而且是在linux下完成的。linux下有两个比较好的latex编辑器:emacs和kile,但是数据图形的处理却缺乏比较顺手的工具。gnuplot和labplot试用了一下,感觉不是很满意,而以前也学过一段时间的metapost,所以最后决定用metapost来画论文中的数据图。使用metapost一个多月下来才真正发现其强大之处,现总结一下。

一、metapost的编译方式

metapost文件不同的编译可以得到不同的图片格式:eps和pdf。

eps格式编译:mpost foo.mp
pdf格式编译:mptopdf foo.mp

eps图片可以直接插入到latex中,与latex无缝融合。有时需要在eps中插入汉字和特殊字符,这些字符可以使用latex和tex来编译。为了插入汉字,mp文件需要添加相应的设置,如下例:
verbatimtex
%&latex
\documentclass[10pt,a4paper]{article}
\usepackage{CJK,amssymb}
\begin{document}
\begin{CJK}{GBK}{song}
etex;
draw btex 这里是中文宋体 etex;
verbatimtex
\end{CJK}
\end{document}
etex;
end
文件中verbatimtex...etex和btex...etex中间的部分由指定的编译方式来编译,"%&latex"指明了用latex来编译。

latex方式编译:mpost -tex=latex foo.mp

插入汉字后得到的eps图片gv等工具是无法浏览的,因为gv等不支持中文字体。为了能够浏览生成的eps图片,一般在文件的开始加入"prologues :=1"(在linux可能要加入"prologues :=2"),当然也可以"mptopdf foo.mp"编译生成pdf文件浏览。

二、画笔

涉及到画图就要说说画笔,metapost自带了两种画笔:pencircle和pensquare,也可以自己定义画笔:

pen mypen[];
mypen1 = makepen((0, 0.7)--(0.5, 0)--(0, -0.7)--(-0.5, 0)--cycle); %菱形
mypen2 = makepen((-0.5, -0.3)--(0, 0.7)--(0.5, -0.3)--cycle); %三角

画笔必须是封闭图形,划线时按颜色填充画笔。画线时可以根据需要选用画笔,可以设置线条颜色,宽度等:

pickup pencircle scaled 1pt;
draw (0,0)--(1cm,1cm) withcolor red;

或者:

draw (0,0)--(1cm,1cm) withpen mypen1 scaled 1pt withcolor (1,0,0)%支持rgb颜色格式


三、线型

画笔的线型有多种,还可以自己设置独特的线性。如虚线:

darw (0,0)--(1cm,1cm) dashed evenly scaled 2;

自定义线型可以看metapost手册。

四、曲线

metapost除了可以画直线之外,还可以自动画出曲线。上面的例子中(0,0)--(1cm,1cm)表示是直线,而(0,0)..(1cm,1cm)表示是曲线,为贝赛尔曲线。还可以指定曲线经过某点时的方向:

draw (0,0){dir 30}..{dir 45}(1cm,1cm}

五、图形处理

metapost对图形进行处理,如旋转(rotated)、移动(shifted)、缩放(xscaled, yscaled)等。

六、graph宏包

metapost的强大还体现在很多地法,下面主要讲一下graph宏包,因为论文要处理数据曲线,所以要经常用到这个宏包。下面是一个使用graph宏包画数据曲线的例子。

verbatimtex
%&latex
\documentclass[10pt,a4paper]{article}
\usepackage{CJK,amssymb}
\begin{document}
\begin{CJK}{GBK}{song}
\Large
etex;
input graph;
beginfig(1);
draw begingraph(12cm,8cm);%设置图片大小
init_numbers(btex$-$etex, btex$1$etex, btex${\times}$etex, btex${}^-$etex, btex${}^2$etex);%设置坐标轴数字格式,使用latex来处理数字。
setrange(0,5,18,15);%设置横纵坐标范围
path p[];
picture lab[];
pen mypen[];
mypen1 = makepen((0, 0.7)--(0.5, 0)--(0, -0.7)--(-0.5, 0)--cycle); %菱形
mypen2 = makepen((-0.5, -0.3)--(0, 0.7)--(0.5, -0.3)--cycle); %三角
lab1 = btex 温度线膨胀系数/$(10^{-6}/K)$ etex rotated 90;
glabel.lft(image(draw lab1),OUT);
glabel.bot(btex 含水率/\% etex, OUT);
gdata("7-days.txt", $, augment.p1($1, $2););
for x = 0 step 3 until 18:
grid.bot(format("%g", x), x) withcolor 0.80white;
endfor;
for y = 5 step 2.5 until 15:
grid.lft(format("%g", y), y) withcolor 0.80white;
endfor;
gdraw (point 0 of p1
for i= 1 upto length p1:
..point i of p1
endfor) withpen pencircle scaled 1.5pt withcolor red;
for i = 0 step 1 until length p1:
gdraw point i of p1 withpen mypen1 scaled 6pt withcolor red;
endfor;
gdata("14-days.txt", $, augment.p2($1, $2););
gdraw p2 withpen pencircle scaled 1.2pt withcolor green;
for i = 0 step 1 until length p2:
gdraw point i of p2 withpen mypen2 scaled 6pt withcolor green;
endfor;
gdata("28-days.txt", $, augment.p3($1, $2););
gdraw p3 withpen pencircle scaled 1.2pt withcolor blue;
for i = 0 step 1 until length p3:
gdraw point i of p3 withpen pensquare scaled 6pt withcolor blue;
endfor;
gdata("56-days.txt", $, augment.p4($1, $2););
gdraw p4 withpen pencircle scaled 1.2pt withcolor (0.8, 0.3, 0);
for i = 0 step 1 until length p4:
gdraw point i of p4 withpen pencircle scaled 6pt withcolor (0.8, 0.3, 0);
endfor;
lab9 = image(
draw (-25pt, 9pt)--(-3pt, 9pt) withpen pencircle scaled 1.2pt withcolor (0.8, 0.3, 0);
draw (-14pt, 9pt) withpen pencircle scaled 6pt withcolor (0.8, 0.3, 0);
draw btex 56天龄期 etex;
draw (-25pt, 27pt)--(-3pt, 27pt) withpen pencircle scaled 1.2pt withcolor blue;
draw (-14pt, 27pt) withpen pensquare scaled 6pt withcolor blue;
draw btex 28天龄期 etex shifted (0, 18pt);
draw (-25pt, 45pt)--(-3pt, 45pt) withpen pencircle scaled 1.2pt withcolor green;
draw (-14pt, 45pt) withpen mypen2 scaled 6pt withcolor green;
draw btex 14天龄期 etex shifted (0, 36pt);
draw (-25pt, 63pt)--(-3pt, 63pt) withpen pencircle scaled 1.2pt withcolor red;
draw (-14pt, 63pt) withpen mypen1 scaled 6pt withcolor red;
draw btex 7天龄期 etex shifted (0, 54pt););
glabel(image(unfill bbox lab9; draw bbox lab9 withpen pencircle scaled 0.5pt; draw lab9), (15.5,13));
endgraph;
endfig;
verbatimtex
\end{CJK}
\end{document}
etex;
end

上面的例子中需要重点说明的是:

(一)坐标轴的设置

1.标签(label)
"lab1 = btex 温度线膨胀系数/$(10^{-6}/K)$ etex rotated 90;"是定义纵坐标label,然后"glabel.lft(image(draw lab1),OUT);"画出此标签,定义标签时用到了旋转"rotated 90"。

2.stick

for x = 0 step 3 until 18:
grid.bot(format("%g", x), x) withcolor 0.80white;
endfor;
for y = 5 step 2.5 until 15:
grid.lft(format("%g", y), y) withcolor 0.80white;
endfor;

画出网格,指出stick方向,网格线为0.80white颜色。

(二)曲线

1.数据读入
曲线的数据点通过文件读入:

gdata("7-days.txt", $, augment.p1($1, $2););

"augment.p1($1, $2);"表示将数据文件"7-days.txt"中第一、第二列数据组成的点作为path p1曲线上的点,即第一列各点为x值,第二列各点为y值。

2.数据点标记

有时需要标记数据点,方法如下:

for i = 0 step 1 until length p1:
gdraw point i of p1 withpen mypen1 scaled 6pt withcolor red;
endfor;

这是在曲线p1的每个数据点画上直径为6pt的红色小点。

3.曲线格式

由augment得到的曲线draw得到的各点之间是直线连接的,如果想曲线连接,可以做如下处理:

gdraw (point 0 of p1
for i= 1 upto length p1:
..point i of p1
endfor) withpen pencircle scaled 1.5pt;

(三)图例

图例是一个pic,内容可以自己定义:

lab9 = image(
draw (-25pt, 9pt)--(-3pt, 9pt) withpen pencircle scaled 1.2pt withcolor (0.8, 0.3, 0);
draw (-14pt, 9pt) withpen pencircle scaled 6pt withcolor (0.8, 0.3, 0);
draw btex 56天龄期 etex;
draw (-25pt, 27pt)--(-3pt, 27pt) withpen pencircle scaled 1.2pt withcolor blue;
draw (-14pt, 27pt) withpen pensquare scaled 6pt withcolor blue;
draw btex 28天龄期 etex shifted (0, 18pt);
draw (-25pt, 45pt)--(-3pt, 45pt) withpen pencircle scaled 1.2pt withcolor green;
draw (-14pt, 45pt) withpen mypen2 scaled 6pt withcolor green;
draw btex 14天龄期 etex shifted (0, 36pt);
draw (-25pt, 63pt)--(-3pt, 63pt) withpen pencircle scaled 1.2pt withcolor red;
draw (-14pt, 63pt) withpen mypen1 scaled 6pt withcolor red;
draw btex 7天龄期 etex shifted (0, 54pt););

定义完后画出即可:

glabel(image(unfill bbox lab9; draw bbox lab9 withpen pencircle scaled 0.5pt; draw lab9), (15.5,13));

其中"draw bbox lab9"是给图例加一个框。


(四)双坐标轴

有时需要定义双坐标轴,下面是一个例子:

verbatimtex
%&latex
\documentclass[10pt,a4paper]{article}
\usepackage{CJK}
\begin{document}
\begin{CJK}{GBK}{song}
etex;
input graph;
beginfig(1);
draw begingraph(10cm,7cm);
init_numbers(btex$-$etex, btex$1$etex, btex${\times}$etex, btex${}^-$etex, btex${}^2$etex);
path p[];
picture lab[];
lab1 = btex 大气温度/$\,^{\circ}\mathrm{C}$ etex rotated 90;
lab2 = btex 太阳散射辐射照度/($W/m^2)$ etex rotated -90;
lab3 = btex 大气温度 etex;
lab4 = btex 散射辐射照度 etex;
setrange(0,26,24,38);
glabel.bot(btex 时间/$h$ etex,OUT);
glabel.lft(image(draw lab1),OUT);
gdata("rad-temp.txt", $, augment.p1($1,$2); augment.p2($1,$3););
for x = 0 step 3 until 24:
grid.bot(format("%g", x), x) withcolor 0.80white;
endfor;
for y = 26 step 2 until 38:
grid.lft(format("%g", y), y) withcolor 0.80white;
endfor;
gdraw (point 0 of p1
for i= 1 upto length p1:
..point i of p1
endfor) withpen pencircle scaled 1pt;
setcoords(linear, linear);
setrange(0,0,24,180);
for y = 0 step 30 until 180:
itick.rt(format("%g", y), y) withcolor 0.8white;
endfor;
gdraw p2 withpen pencircle scaled 1pt;
glabel.rt(image(draw lab2), OUT);
pickup pencircle scaled 5pt;
for i = 0 step 1 until length p2:
gdraw point i of p2;
endfor;
pickup defaultpen;
p3 = (0, 0)--(3.2cm, 0)--(3.2cm, 1.5cm)--(0, 1.5cm)--cycle;
glabel.urt(image(unfill p3; draw p3), 0, 135);

glabel.urt(image(draw (-0.2cm,0.2cm)--(-0.9cm,0.2cm) withpen pencircle scaled 1.0pt;
draw lab3),(0,157));
glabel.urt(image(draw (-0.2cm,0.2cm)--(-0.9cm,0.2cm) withpen pencircle scaled 1.0pt;
draw (-0.6cm,0.2cm) withpen pencircle scaled 5pt; draw lab4),(0,142));

endgraph;
endfig;
verbatimtex
\end{CJK}
\end{document}
etex;
end

其中重要的设置为:setcoords和setrange这两个函数。



祭出我的第一文——OpenSUSE 下的生活

参加工作一年半了,突然发现生活有些无聊,总得有点追求吧,所以决定学点东西。刚开始想学3DMAX,资料买了一堆,学着学着就没意思了,书也扔在了一边。

工作一段时间,手头上有点银子,刚好同事的一台电脑因工作变动想卖掉,我就把它拿下了,还送一电脑桌。电脑搬到家第一天,就着手搞双系统。由于家里没有网线,想了想,还是装SuSE得了,刚好手头上有SuSE10.3的DVD盘,装好后简单设置一下,装几个字体,一会儿搞个Compiz,一会儿折腾中文Latex,用得还不亦乐乎!但是碰到要安装非系统盘里面的软件时还是比较郁闷的,一堆的依赖关系,幸好家离单位不远,实在U盘搞不定了就把电脑机箱搬到单位来折腾一下,呵呵!

SuSE10.3总体上而言还是不错的,就是安装软件时反应慢了点,网上对Yast2这个东东也是一堆意见啊,呵呵!其实如果只是工作或是简单的娱乐,系统没有必要频繁升级,也没有那么多软件要装,用SuSE比用Debian要好一点,基本上日常的需要一张DVD安装盘就能搞定。我在单位的电脑上装的是Debian unstable,每次"apt-get update"后总有一堆的软件要升级,有时安装一个软件也要升级一堆软件,考虑过用stable的,但软件都太老了,呵呵!

在家玩SuSE一段时间后决定还是要学点东西,但是学习语言太枯燥,我又没有恒心,我的Python是扔了捡,捡了扔(汗!)。仔细想想,自己学的专业和从事的工作和电脑基本没有联系,我还是要靠专业吃饭,学点东西也就是消磨一下时光。看着家里3DMAX的教材,决定还是学习Maya,主要是它有Linux版的,哈哈! 在网上下载了Maya2008 X86_64,在单位电脑的Debian系统下安装了一下,运行成功。等回家在SuSE10.3上一试,总是在启动的最后时刻莫名的挂掉。在网上查了一些资料,折腾了几天,最后怀疑是显卡驱动的问题,从网上下载了最新的N卡驱动安装,Maya运行成功。

问题并没有就此解决,Maya启动没多久就频繁报错"fail to open iff file",网上有人说要关掉ViewCube,我试了一下可以,但是不能使用ViewCube我总感觉不爽,接下来的几天里都在为这个问题烦恼。最后不得不怀疑是系统的问题,SuSE10.3有问题!于是我下载了SuSE10.2的DVD安装,覆盖掉原来的SuSE10.3,运行Maya2008果然一点问题都没有。不过我的声卡一直不响,没办法只有用SuSE10.3的内核把SuSE10.2的内核换掉。而且Latex的中文又要重新弄了,呵呵!(不过后来看到网上有人说把10.3的glibc升级就可以了)

5月份就听说OpenSuSE11.0快出来了,6月19日在网上守候了大半天,有事没事刷新一下http://download.opensuse.org/distribution/11.0/,终于比官方发布时间提前了7个小时下载了OpenSUSE 11.0 DVD,是用迅雷下载的,不得不服迅雷的下载速度,呵呵!

把OpenSUSE DVD下载下来后马上刻录成光盘,下班后在家里的电脑上把原来的OpenSUSE 10.2覆盖安装,安装界面很漂亮,安装速度比10.2和10.3要快很多,硬件支持也很好,我电脑的所有的硬件都自动识别出来了。与前面的版本相比分区比较智能化,不需要象10.3那样要手动修改,整个安装过程很顺利,就象网上说的,也就20分钟安装完毕。

其实安装OpenSUSE11.0最担心的就是我的MAYA 2008能否正常运行。11.0安装完毕后首先安装显卡驱动,用以前的N卡驱动总是编译失败,当时估计是11.0的内核太新了,所以到网吧下载了最新的N卡驱动,安装成功!接着安装Maya 2008 X86_64,安装完毕后启动没有问题,但是启动后发现标签栏的标题部分全是框框,包括一些“OK”,“Apply"等按钮上的字体。唉!问题又来了,郁闷啊!

在网上搜索了一下,发现有人遇到了相同的问题,但是没有解决。根据网上的回复以及自己的判断,应该是字体出了问题,首先要确定Maya标签栏标题使用了什么字体。正好我在单位电脑的Debian系统下也安装的Maya 2008,我把标签栏字体截屏下来,在系统字体里面一个一个的对比查找,找了半天费了老大劲终于发现是fixed[rfx]字体。之所以这么难找主要是因为fixed[rfx]不同字号的字体有很大的不同,刚开始没注意,找了好久都没有找到,呵呵!

确定了出问题的字体,后面的事就好解决多了。我发现OpenSUSE 11.0没有fixed[rfx]字体,于是我把Debian /usr/share/fonts/X11/misc下对应-rfx-fixed的几个字体拷贝到OpenSUSE 11.0的/usr/share/fonts/misc下面,root下运行mkfontsdir,重启X,Maya 2008就又恢复正常了,哈哈!

还发现OpenSUSE 11.0的一个问题,就是有两个SCIM,呵呵!一个是user的,一个是root的,网上有人说是libqt4的问题,升级libqt4到最新版本就可以了。还可以把kdm4换成kdm3,我采取的就是这种办法,呵呵!