LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1123|回复: 3

en_US.UTF8 环境下 latex 对中文的处理

[复制链接]
发表于 2008-9-28 22:55:07 | 显示全部楼层 |阅读模式
之所以要写下这份东西,原因是这个问题浪费了我好几个小时!!
系统环境
Debian stable
en_US.UTF8

[size=+1]一、错误再现和分析
在此环境下,编辑一个 tex 输入文件,使用中文 CJK 宏包,并选用 GBK/GB 字符集。

  1. \documentclass[a4paper,12pt]{article}
  2. \usepackage{CJK}
  3. \begin{document}
  4. \begin{CJK*}{GB}{gbsn}
  5. 你好!
  6. \end{CJK*}
  7. \end{document}
复制代码

然后保存退出,用 pdflatex GB_sample.tex 一下,会发现系统报错,说什么“未定义的字体”之类(当然原文是英文的)。
出现这一错误的原因是,系统环境是 en_US.UTF8,因此编辑文件时所用的字符都默认为 UTF-8 字符集
中的文字,而不是 GBK 字符。因此用 pdflatex 想要得到正确的 pdf 文件是不可能的!

[size=+1]二、解决之道
知道了产生错误的原因,就可以很容易地解决它了。一共有两种方法可以解决这个问题。

[size=+1]法1.把文件中的字符从 UTF-8 转换成 gb2312 就可以了。使用的工具是 iconv,这个工具大多数 Linux 发行版都有的。

  1. iconv -f utf8 -t gb2312 GB_sample.tex > test.tex
  2. pdflatex test.tex
复制代码

这样就能得到正确的 pdf 文件

[size=+1]法2.直接使用 CJKutf8 宏包。由于我的环境是 en_US.UTF8 的环境,所以用 CJKutf8 是最适合我的。这样就免去了再进行编码转化的麻烦。
而且如果你的 latex 中需要出现一点繁体的话,用这个宏包就再好不过了。

范例

  1. \documentclass[a4paper,12pt]{article}
  2. \usepackage{CJKutf8}
  3. \begin{document}
  4. \begin{CJK*}{UTF8}{gbsn}
  5. 你好!
  6. \CJKfamily{bsmi}
  7. 中國!
  8. \end{CJK*}
  9. \end{document}
复制代码


然后保存为 UTF8_sample.tex,再用 pdflatex UTF8_sample.tex 就可以得到正确的 pdf 文件了。
而且 pdf 文件中,还能看到繁体中文。

在默认安装 latex-cjk 的情况下,latex 中只有四个免费的中文字体可以用,分别是
gbsn(简体宋)、gkai(简体楷)、bsmi(繁体宋)、bkai(繁体楷)
如果想得到黑体输出之类的话,就要自己添加字体了。这个我以后有空会研究一下的,网上也有方法,有兴趣的话可以自己先用 google 搜索着看看。


[size=+1]三、写在最后
总体来讲,我个人觉得繁体字的显示效果比简体字好看多了。

    \begin{CJK} 和 \begin{CJK*} 的差异


来自 /usr/share/doc/latex-cjk-common/CJK.txt

{CJK} 环境下,中文字符后面会自动加上空格和 newline(换行符),
而 {CJK*} 环境则不会这么做。
这两种环境,可以用

  1. \CJKspace      CJK*---->CJK
  2. \CJKnospace    CJK----->CJK*
复制代码

来临时切换。一般推荐使用 CJK* 环境。否则在排版一些比较复杂的文档,比如数学公式时,可能会出现莫名其妙的错误。

   
    \CJKtilde


这个用于把‘~’的定义从一个不可打断的空格变为一个 CJK 字符的 1/4 大小的空格。这样就能在中文字符之间插入英文字符或者其它非中文字符,而又不会引起中文字体的变形、错位等情形。尤其是在 \hbox 这种命令中成为重要。
在 BibTex 中,要用‘{~}’代替‘~’。
用 \standardtilde 可以让‘~’恢复原来的定义。不过一般而言没有必要这么做的。你可以用 \nbs(non-breakabel space,LaTex 命令 \nonbreakspace 的缩写)来生成一个不可打断的空格。

我的意见是,一定要在开头使用上 \CJKtilde,这样把英文放在两个‘~’之间。用‘~’来代替原来想要输入的空格,


  1. “你好~China~,这样在中英文混排时,就不至于出现字符错位之类的问题。”
复制代码


[size=+1]主要参考
/usr/share/doc/latex-cjk-common/
发表于 2008-9-29 11:23:42 | 显示全部楼层
原来还有 CJKutf8 这样的宏包,下次写文档时试试。

另外,'中文你好~China~,' 中 China 后的那个 ~ 还是不要加比较好吧,毕竟后接的是标点,与文字部分隔的太远的话,总感觉不够美观
回复 支持 反对

使用道具 举报

发表于 2008-9-30 15:50:25 | 显示全部楼层
其实我倾向于使用 TeXLive 这个套件(现在有 TeXLive2008 了),而不是发行版里面的。http://www.tug.org/
还有就是可以用 XeTeX 或 XeLaTeX,直接使用系统中已经装有的任意字体,再也不需要像 LaTeX + CJK 那样繁琐的配置字体的过程,如果你经常用 TeX 的话,可以上 http://bbs.ctex.org/ 看看那里的讨论
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-9-30 17:22:53 | 显示全部楼层
TO remote_fish:
如果不加那个 ~,的确看上去更美观。但就怕出现字体变形

TO wazup:
bbs.ctex.org 上的应用大多是在 windows 下的,我用 linux 的时候要
“转个弯”才行。

还有,我已经习惯用 latex+CJK 了。不过,你说 XeLaTex 和 XeTex
不用复杂的中文配置就可以使用,我有时间会去试试的。多谢提醒。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表