Oct 16

转自:http://seckcoder.wordpress.com/2011/09/07/

之前在OpenSuSE 11.2上为xelatex安装中文字体设置, 非常顺利, 参考的是http://tech.techweb.com.cn/thread-272484-1-9.html, 将系统升级到11.4后, 再
利用先前的方法时, 则出现了一些莫名其秒的错误。 下面是详细的安装过程及错误解决方法:

1. 安装xelatex

zypper install texlive-xetex

2. 配置

sudo mkdir /usr/share/texmf/tex/xelatex/zhfontcfg
sudo vim /usr/share/texmf/tex/xelatex/zhfontcfg/zhfontcfg.sty

按照之前给的链接中的方法, 需要在该文件中加入一段代码。 对于texlive2010, 由于newfontinstance不可用, 因此应该做一些适当的修改, 如下是我的:

ProvidesPackage{zhfontcfg}
usepackage{fontspec,xunicode}
defaultfontfeatures{Mapping=tex-text}

XeTeXlinebreaklocale “zh”
XeTeXlinebreakskip = 0pt plus 1pt minus 0.1pt

newcommandfontnamehei{Adobe Heiti Std} %使用我自己带的字体
newcommandfontnamesong{Adobe Song Std}
newcommandfontnamemono{DejaVu Sans Mono}
newcommandfontnameroman{Times New Roman}

setmainfont[BoldFont=fontnamehei]{fontnamesong}
setsansfont[BoldFont=fontnamehei]{fontnamesong}
setmonofont{fontnamemono}

newfontfamilyHEI{fontnamehei} %new command 改为newfontfamily
newcommand{hei}[1]{{HEI #1}}

newfontfamilyENF{fontnameroman}
newcommand{en}[1]{,{ENF #1},}
newcommand{EN}{,ENF,}

这里需要说明一下, 我在openSUSE 11.2上, 安装acroread后, 通过fc-cache -fv能够顺利检测到adobe的字体, 但在11.4上不行, 不知道是什么原因。 于是我直接将acroread中的相应字体拷贝到了$HOME/.fonts目录下。同时, 上面的配置文件最好不要直接粘贴。 我第一次直接粘贴后, 运行测试程序总是出一些奇怪的错误。另外, latex给出的错误信息往往很奇怪, 在http://www.tex.ac.uk/cgi-bin/texfaq2html?label=errstruct中有提到这一点。 在这里尝到一个技巧, 如果看不懂错误信息, 就输入h, 这会提供一些额外的信息。

Oct 16

发信人: jjgod (while(!asleep()) sheep++;), 信区: TeX
标 题: TeX Live 2009 的 LaTeX 中文支持
发信站: 水木社区 (Sat Nov 21 22:38:11 2009), 站内

最近刚发布的 TeX Live 2009 [1] 是对中文支持有较大改进的一个版本,这里简单介绍一下。

首先,一如 2007, 2008 版本,TeX Live 2009 有中文版本的安装使用指南 [2],强烈建议在提问前把相关章节好好看看,这份指南主要叙述的是和中文无关的一些通用的问题。

然后 TeX Live 2009 的中文支持主要分为两部分,基于 XeTeX 的,和基于传统 CJK 宏包的。(我这里只讨论 LaTeX的,如果你希望尝试 ConTeXt 和 luatex,可以参考 Li Yanrui 的 blog [3],他有很详细的介绍。)

1.基于 XeTeX 的方案

这是我们推荐的方案,又可分为高层与低层两种,分别适用于不同需求的用户。

首先,安装所需的宏包:

sudo tlmgr install xecjk ctex

高层的方案是使用 ctex 宏包自带的文档类,例如原来用 article 文档类的就改用 ctexart 文档类,原来用 book文档类的就改用 ctexbook 文档类,这样绝大部分你会遇到的中文问题,比如字体设置、hyperref的调用、章节标题的设置等等,都自动为你解决了。详情可以看 ctex 宏包的文档 [4]。下面是一个小例子:

documentclass{ctexart}
begin{document}
你好,TeX Live 2009!
end{document}

默认情况 (winfonts) 下,你需要宋体 (SimSun)、仿宋 (simfang)、黑体 (simhei)、楷体 (simkai)、隶书(LiSu)、幼圆 (YouYuan) 这六套 Windows 字体,如果你的字体不全,可以编辑ctex-xecjk-winfonts.def 文件 (用 kpsewhich 来找) 来修改设置,也可以选择 Adobe Reader等软件所带的 Adobe Song Std, Adobe Heiti Std, Adobe Kaiti Std, Adobe FangsongStd 四款字体,这时需要给 ctexart 加上 [adobefonts] 选项。又或者,你可以不用这些预置的字体,使用 [nofonts]选项,然后参考 ctex-xecjk-winfonts.def 文件,自己定义对应各个 CJK 字体族的字体。

低层的方案则是用原来你自己的宏包,结合 xeCJK 宏包来配置字体,下面是一个小例子:

documentclass{article}
usepackage{xeCJK}
setCJKmainfont{SimSun}
begin{document}
你好,TeX Live 2009!
end{document}

当然,你得有 SimSun 这个字体。

不管选用高层的还是低层的,都可以直接用 xelatex 命令直接编译你的文档。

2.传统 CJK 方案

传统 CJK 方案主要是为了方便使用以前的文档存在的。也分为两种,高层方案也是使用 ctex 宏包,低层方案和原来的文档一样,直接用 CJK 宏包。

使用 ctex 宏包的例子和前面用 ctexart 的那个完全一样:

documentclass{ctexart}
begin{document}
你好,TeX Live 2009!
end{document}

不过需要注意的是,你还得安装 zhmetrics 宏包。另外,如果文档保存的编码是 GBK,必须添加 [GBK] 选项,否则用 UTF-8 编码的也建议用 [UTF8] 选项。

可以看出,用高层方案最大的好处是文档代码可以最大限度地不修改就能换用不同的 TeX 引擎。

低层方案与原来的做法的区别是,需要载入 zhwinfonts,使用 zhwinfonts 定义的字体,而不是原来自己去生成字体的映射文件,这样要简便很多:

documentclass{article}
usepackage{CJK}
input zhwinfonts
begin{document}
begin{CJK}{zhsong}
你好,TeX Live 2009!
end{CJK}
end{document}

注意,这里用了 zhsong 这个字体族而不是 song,为了避免和 CJK 宏包原来定义的冲突,我们定义的所有字体族都带 zh 前缀。

对于上述这两种情况,你都可以使用 latex 编译,用 dvipdfmx 生成 pdf。

除了上述的 zhmetrics, ctex, xeCJK 宏包以外,我们还在 CTAN/TeX Live 中提交了 zhspacing,CJKpunct, zh-luatex 等宏包,ctex-faq, lshort 中文翻译等文档,以上工作都需要感谢参与维护 ctex-kit[5] 的全体开发者,为 ctex-doc [6] 贡献内容的全体作者,也欢迎你参加到我们的工作中来,帮助进一步改进 TeX 的中文支持。

[1] http://www.tug.org/texlive
[2] http://www.tug.org/texlive/doc/texlive-zh-cn/texlive-zh-cn.pdf
[3] http://liyanrui.is-programmer.com/
[4] http://tug.ctan.org/tex-archive/language/chinese/ctex/doc/ctex.pdf
[5] http://code.google.com/p/ctex-kit
[6] http://code.google.com/p/ctex-doc

Oct 16

转自: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 的安装和中文字体的设置。