转自:http://forum.ubuntu.org.cn/viewtopic.php?f=35&t=168940
写在前面的话:目前Texlive2012版本已经发布了,对字体的处理已经很好了,但是中文字体仍然不是很好。现在使用fontspec宏包或者使用xecjk宏包已经可以很方便的处理中文字体。如果想学习LaTex,最方便的方法就是仔细的阅读一本书籍,然后下载一个论文的模板慢慢揣摩里面字体设置。
第一步.安装Texlive
我这里使用的是2008的DVD版(http://www.tug.org/texlive/acquire.html),可以全部安装,也可以挂载ISO文件直接运行。我是全部安装。不推荐Ubuntu 8.10源里的那个2007,它的XeTeX版本有些旧,后面我们要装zhspacing或者xeCJK就有些麻烦:
1.因为要使用图形界面而不是在命令行下倒腾,所以需要首先安装perl-tk包,很小:
sudo apt-get install perl-tk
2.解压下载后的lzma文件并挂载此ISO文件到/mnt上:
sudo mount -o loop texlive2008-20080822.iso /mnt
3.cd到mnt目录,用命令:
sudo ./install-tl --gui
接着,会跳出一个图形窗口供选择安装:
点击第四项“Language Collections“,取消不用的语言包,可以节省300兆的空间:
再选择最后一项“Create symlinks in system directories“,让安装程序自己来给我们创建语法链接:
最后的安装界面是这样的:
点击“Install Tex Live”就可以安装了。当然,也可以挂载ISO文件,从DVD上运行,效果一样,因为它的名字就是Live DVD嘛,不过稍微需要一些配置。如果你像我一样,硬盘大,人又懒,那么还是全部安装的好。
路径在安装过程中已经自动设置好了,如果愿意,还可以在/etc/environment中添加一句/usr/local/texlive/2008/bin/i386-linux,比如我的就是:
PATH="/usr/local/texlive/2008/bin/i386-linux:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"
LANGUAGE="en_US:en"
LANG="en_US.UTF-8"
这一步似乎有些画蛇添足。Anyway,加上也无所谓。以后如果要升级的话,可以在命令行中输入:
sudo tlmgr --gui
第二步.配置中文XeTeX
严格说,这个标题有语病,因为即使不配置,XeTeX还是可以正常处理中文,因为它不像LaTeX,它可以直接调用系统字体。比如:
documentclass{article}
usepackage{fontspec}
setmainfont{SimSun}
begin{document}
Cowards die many times before their deaths.\
懦夫在未死之前,已身历多次死亡的恐怖了。
end{document}
1.安装zhspacing
但问题是,中文是正常了,英文也用宋体渲染就太难看了。所以,这里需要安装一个 zhspacing 宏包,有了它,就可以正常处理中文的断句、断字和使用正确的英文字体。下面是步骤:
(1).到http://code.google.com/p/zhspacing/上下载zhspacing080102.tar.bz2包,顺便把那个 man 文件也下载下来,看看用法。
(2).解压后,把里面的六个文件放到 /usr/local/texlive/texmf-local/tex 中的 xelatex/zhspacing 中去,这里需要有 su 的权限,如果没有这两个嵌套的文件夹,自己新建就是了。其实也可以放到家目录下面的 .texlive2008 里,总之就是放在一个 XeTeX 找得着的地方。
(3).在终端下使用命令:
sudo mktexlsr
这里要提醒的是,其中有一个文件名为 zhfont.sty,默认设置的一些字体是:
newfontfamilywithslantzhrmfont{SimSun}
newfontfamilywithslantzhsffont{SimHei}
newfontfamilywithslantzhttfont{FangSong_GB2312}
else
newfontfamilywithslantandboldzhrmfont{SimSun}{SimHei}
newfontfamilywithslantzhsffont{SimHei}
newfontfamilywithslantandboldzhttfont{FangSong_GB2312}{KaiTi_GB2312}
如果你的系统中没有相应的字体,编译的时候会出错,所以要用 fc-list 看看你的系统中有哪些字体,替换上面代码中的字体名就可以了。另外,那个 zhspacing.sty 里也有几个字体的配置,仔细查看一下自己系统里是否有这些字体。
接下来,测试一下:
documentclass[11pt,a4paper]{article}
%------------------------------------------------------------------------------------------------------
usepackage{fontspec,xltxtra,xunicode} % 这里使用 xetex 相应的宏包
usepackage{zhfont} % 这里调用 zhfont.sty
zhspacing
%------------------------------------------------------------------------------------------------------
%------------------------------------------------------------------------------------------------------
setzhmainfont[BoldFont=LiHei Pro]{KaiTi_GB2312}%这里设置中文粗体和普通字体
setmainfont{TeX Gyre Pagella} %这里设置英文衬线字体
setmonofont{Monaco} %英文等宽字体
setsansfont{Trebuchet MS} %英文无衬线字体
%-------------------------------------------------------------------------------------------------------
begin{document}
Cowards die many times before their deaths.\
懦夫在未死之前,已身历多次死亡的恐怖了。
end{document}
虽然看上去头重脚轻,不过应该不会有问题了,保存为 test.tex,编译:
xelatex test.tex
现在可以看见漂亮的英文字体了,当然楷体不怎么样,可以换成其他字体,比如宋祖德最喜欢的女神徐静蕾 MM 的方正静蕾简体就不错,可惜太淡了。
此外,也可以调用 zhspacing.sty。更简单的办法是直接修改这两个文件(zhspacing.sty 和 zhfont.sty)中的字体,设置成你需要的字体,这样无需再在你的文档里设置字体。
2.安装xeCJK
另外,还有一个中文解决方案是使用xeCJK。可以到 http://bbs.ctex.org/viewthread.php?tid=40232 上去下载(在第 5 页的 66 楼也可以下载附件)。它并不比 zhspacing复杂,安装方式差不多:
下载后,解压xecjk-2.29.zip文件,把压缩包里的 tex/xelatex 下的 xecjk 目录复制到和上面那个zhspacing 目录相同的地方就可以了。不要忘了之后执行:sudo mktexlsr。
xeCJK设置也很灵活,首先,在preamble中加载宏包:
usepackage[slantfont,boldfont]{xeCJK}
然后设置字体:
setCJKmainfont{FZJingLeiS-R-GB} % 设置缺省中文字体
setCJKmonofont{SimSun} % 设置代码或数学公式出现的中文字体
比如:
% !Mode:: "TeX:UTF-8"
documentclass[12pt,a4paper]{article}
usepackage{xltxtra,fontspec,xunicode}
usepackage[slantfont,boldfont]{xeCJK} % 允许斜体和粗体
setCJKmainfont{FZJingLeiS-R-GB} % 设置缺省中文字体
setCJKmonofont{SimSun} % 设置等宽字体
setmainfont{TeX Gyre Pagella} % 英文衬线字体
setmonofont{Monaco} % 英文等宽字体
setsansfont{Trebuchet MS} % 英文无衬线字体
begin{document}
begin{verse}
Stray birds of summer come to my window to sing and fly away. \
And yellow leaves of autumn, which have no songs, \
flutter and fall there with a sign.\
hfill emph{Rabindranath Tagore}
end{verse}
begin{verse}
夏天的飞鸟,飞到我的窗前唱歌,又飞去了。\
秋天的黄叶,它们没有什么可唱,只叹息一声,飞落在那里。\
hfill emph{罗宾德拉纳特·泰戈尔}
end{verse}
end{document}
在 xeCJK 的压缩包里有三个文件:ctex4xetex.cfg、xeCJK.sty 和 xeCJKpunct.spa。第一个是用来导入以前 CTeX 宏包对中文排版专门的设置以及 CTeX 的三个类(ctexart、ctexrep、ctexbook),第二个是 xeCJK 对 xetex 排版时中文标点符号、空格等的规定,第三个是与特定字体相对应的特定的标点符号的设置,默认给出的是 “文鼎pl简报宋”,最好自己生成。
在 xeCJK 的压缩包里有一个 source 目录,作者已经写好了一个脚本,用来为特定字体生成对应的标点符号,默认设置是 Windows 上使用的 gswin32c.exe,只需要按照作者的提示,注释掉它,使用 Linux 常用的 gs。具体的用法,作者的范例和 README 文件已经说地很详细了。
我一般在系统中会安装 Adobe 的四个字体:Adobe Song Std(宋体)、Adobe Kaiti Std(楷体)、Adobe Heiti Std(黑体)、Adobe Fangsong Std(仿宋)。正文使用 Adobe Song Std、斜体字使用 Adobe Kaiti Std、粗体字使用 Adobe Heiti Std、等宽字体使用 Adobe Fangsong Std。这样,对应的设置就是:
documentclass[11pt,a4paper]{report} % 使用 report 类
usepackage{fontspec,xunicode,xltxtra} % 加载 xetex 的宏包
% 以下是英文字体的设置
defaultfontfeatures{Scale=MatchLowercase} % 这个参数保证 serif、sans-serif 和 monospace 字体在小写时大小匹配
setmainfont[Numbers=OldStyle,Mapping=tex-text]{Garamond Premier Pro} % 使用 Garamond 字体,把数字设置为等宽,比较好看
setsansfont[Mapping=tex-text]{Optima LT Std} % 使用 XeTeX 的 text-mapping 方案,正确显示 LaTeX 样式的双引号(`` '')
setmonofont{Monaco}
% 以下是中文字体的设置
usepackage[slantfont,boldfont,CJKnumber,CJKtextspaces]{xeCJK} % 加载 xeCJK,允许斜体、粗体和 CJK 数字以及 CJK 对空格的设置
setCJKmainfont[BoldFont={Adobe Heiti Std}, ItalicFont={Adobe Kaiti Std}]{Adobe Song Std}
setCJKsansfont{YouYuan}
setCJKmonofont{Adobe Fangsong Std}
begin{document}
% 开始码字
end{document}
这里的前提是,上面所有的字体都安装了,其中“Numbers=OldStyle” 这个选项不是对所有英文字体都起作用,有的英文字体没有这个属性,不过对于 TeX Gyre Pagella 系列是适用的。
如果你写的东西基本和英文没什么关系,大可以不用设置英文,甚至无需加载 “usepackage{fontspec,xunicode,xltxtra}” 这一项,而是使用 xeCJK 作者提供的 ctex4xetex.cfg,这样就可以充分利用以前 CTeX 的特性:
input{ctex4xetex.cfg} % 导入 ctex4xetex.cfg
documentclass{ctexbook} % 使用 ctexbook 类
usepackage[boldfont,slantfont,CJKnumber]{xeCJK}
setCJKmainfont[BoldFont={Adobe Heiti Std}, ItalicFont={Adobe Kaiti Std}]{Adobe Song Std}
setCJKsansfont{YouYuan}
setCJKmonofont{Adobe Fangsong Std}
begin{document}
% 开始码字
end{document}
上面代码中没有设置英文,所以默认使用的是计算机现代字体。
第三步,简单的排版
以上安装配置搞定以后,中文英文都不成问题了,就可以来实际地排一排版了,这里祭出偶最喜欢的《金瓶梅》第一回中的几段文字来看看实际效果。
开始之前,有这样一个问题,就是,我们想要 PDF 文件在用 acrobat reader 打开的时候只显示一页,就像幻灯片一样,不多不少就是一页,而且不需要用滚动条就可以看到这一页的全部内容。acrobat reader 会视屏幕大小自动放大页面,显示相应的、更清晰的字体。很适合在在网页中在线浏览。当然,你可以直接用 beamer 来实现,不过这里我们不是做幻灯,所以可以用另一种办法。
首先,需要考虑一下页面的大小,也就是适合在什么样尺寸的显示器上表现。我的本本是 13.3 寸的,所以就假定是十四英寸的显示器,宽高比大致保持为 3:2 这样一个比例,这样,在 preamble 区中设置如下命令:
代码:
setlength{textwidth}{4.166in}
setlength{textheight}{3in}
(这里的 4.166in 来源于图像处理时的 300dpi 下 300×300 像素的一英寸图像在导出为 72dpi 解析度后的实际大小,也就是 4.166in。这个解释好费劲,你可以直接忽略掉,用 Photoshop 的人应该知道。)
这样就可以了,需要的文字会被显示在一个长宽适中的范围内。但是,页面周围的空白太多了,很不好看,所以要剪裁掉多余的 margins,怎么办呢,使用 Texlive2008 自带的一个小工具 pdfcrop 就可以了,用法很简单,我这里使用的是:
pdfcrop --margins '20 20 20 12.36' --clip jpm.pdf jpm_new.pdf
上面的四个数字代表的是左、顶、右、底的 bp(big points),这是 pdfcrop 的单位(1 in = 72 bp) 。
到这里,我们的文章就排好了,效果如下:
PS:剪裁这一步,如果你有 acrobat 9 的话,可以很直观地调节,Document / Crop Pages。调整好后保存,然后用 vim 之类的编辑器打开 PDF 文件,查找 /Cropbox 这个语句,它后面会有一个参数表,比如:[72.0 441.0 478.28 769.89]。复制下来,然后在 preamble 中添加一句:
引用:
usepackage[dvipsone,pdfpagescrop={72.0 441.0 478.28 769.89},]{hyperref}
以后编辑的时候就无须再用pdfcrop来剪裁了。
另外,楼下的 milksea 说应该使用 geometry 宏包,的确,那才是正统的方式。中文说明可以看 CTeX 上的文档 http://www.ctex.org/documents/packages/layout/geometry.htm(要设置一下驱动选项)。此外还有简单一些的 zwgetfdate 宏包等,都可以对页面进行调整。上面使用的只是能实现效果的一种途径(可能很蹩脚),所谓 there is more than one way to do it。如有不当或没说清楚,请见谅,仅仅是个演示,重要的是 XeTeX 的安装和中文字体的设置。
Recent Comments