• R语言
  • R中sweave中文无法识别问题

我在利用Sweave处理包含中文的.Rnw文件(谢益辉提供的)时总是显示

"has unknown encoding: assuming Latin-1"

不通过.后来查到要在Rprofile.site中增加 options(encoding='UTF-8')

可是我加了以后还是问题依旧。

我的是xp sp3, r 2.13.1.而我的另一台同样的系统的本本却可以通过Sweave[s:12]

我卸掉R后重装问题依旧,就差重做系统了,太费时间,不敢!

问题何在?各位给个建议,如何处理!

另强烈建议高手(如谢益辉同学等[s:13])抽时间给大家做个windows下ctex版本的带中文的sweave的beamer模板。毕竟windows用的更多!

试过lyx,但是最后还是选择winedt。

我一台也没成功过,连对比都没得。

2.13.1是有这个问题的,换2.13.0

回复 第3楼 的 刘思喆:

多谢刘版,现在我已经成功编译出了一份中文的结果,看来2.13.1确实有问题。

不过新的问题是,我使用CTeX的默认编码,也就是gbk时,可以得到正确的结果

但如果将文档改成UTF-8编码,并且使用options(encoding='UTF-8'),pdf.options(family='GB1'),与R相关的中文虽然可以读写,但似乎编码方面有问题(LaTeX部分的中文可以被正确处理)。

查看生成的.tex文件,两个问题:

1. 里面与R代码相关的中文出现乱码;

2. 生成的tikz文件是gbk编码,其中的中文倒是被正确识别,但由于这个文件是gbk的,我手工改成utf-8以后,再编码,才能得到结果。

编码问题在Linux下一般不成问题,因为一直都是UTF-8编码。Windows下待我切换过去再测试一下。

这些事情需要更多懂行的人参与进来,我个人精力实在有限。

大家都努力试试吧,可能由于专业原因,CTeX论坛那边的大部分人对 pgfSweave 之类不是特别感兴趣。

我自己专业偏经管,由于导师偏好,不太方便将工作转到 Linux 下来。目前而言,其实很少遇到需要使用 pgfSweave 的情况,更多时候只要能生成结果图片即可,大不了自己用 pdfcrop 裁剪一下再插入图片;或者直接使用 tikzDevice 包生成结果了再插入。

但这问题不真正完善解决总是感觉不舒服,这种黑箱子式的操作让自己对许多细节都不能够自行控制,有时候真有再尝试写一个 pgfSweave 类的东东的冲动(只是功力和时间都不够哇)。

这个事情确实可以做一些事情,现在网上关于latex中文实现还停留在CJK包的阶段,按照Yuwei Yu兄的说法“那都是五年前的技术了。”

咱们确实整理一下相关的东西,主要牵扯xelatex lyx beamer pgfSweave。

具体如何做,确实还需要再探讨。

回复 第7楼 的 G_will:

CJK 已经不是问题,接触 LaTeX 早一些的基本都转向 XeLaTeX 或者 ConTeXt 啦,新人往往并不容易找到比较好用的关于 XeLaTeX 的入门系统资料,才会有觉得迷茫在 CJK 中。

就我自己而言,已经完全在 XeLaTeX 下工作。XeLaTeX + PSTricks + pgf/tikz + Beamer + BiBTeX + fixbbl + UTF-8,这些问题我都已经全部实现了自己的模版,甚至附带的比如 visio+ aurora,pdfCrop 之类的解决,都不是问题。

我得在 Windows 下工作,现在就差 pgfSweave 的 utf-8 版本。

编码的问题解决起来真的麻烦,记得去年过年的时候,差不多花了 1 个月左右的时间,加上以前的各种积累,才勉强解决了 utf-8 下 fixbbl 对 bib 的排序,真心麻烦。

问题我应该已经查明:目前Sweave对编码信息的获取不是通过options('encoding')来的,而是通过检测Rnw文档中的声明\usepackage[foo]{inputenc},如果有这么一行,则使用foo编码,参见帮助文档?Sweave。所以楼主的问题有两种解决方式:

1. 在Rnw文档中加入一行\usepackage[utf8]{inputenc};或者

2. 用Sweave(..., encoding = 'UTF-8')的方式运行Sweave

关于pgfSweave,它没有跟上官方Sweave的变化,所以Windows下的编码问题暂时还无法克服,这个我得看看源代码并联系作者。

Sweave这事儿我说过几遍了,它的代码写得非常不灵活,极难扩展,在90年代可能的确是个很NB的成果,但现在来看,每看一遍都有一次想重写它的冲动。以前在R-help里讨论过几次,貌似有点得罪作者和R core,挨了几次骂,现在我也不吱声了。

嗯,不行就先用 Sweave 吧,难为谢老大也会受到这种待遇。

或者幻想将来新版本的 Windows 要是如 Linux 一样,直接使用 utf-8 的话,这个问题也会自然不存在。

我对 PostScript 和 PGF/Tikz 有一点了解,希望对 R 的了解足够以后,俺自己写一个类 Sweave 包来哈。

看了上面各位的讨论,受益不少!谢谢你们!

确实用R2.13.0编译中文没有问题,但是仍然希望哪位高人能给几个比较理想的详细的模板(如windows下中文xetex+加sweave+article;中文xetex+加sweave+beamer等)!

想学ubuntu的,担心太费时间。

回复 第10楼 的 PHoward:可以看看这个 https://github.com/hadley/decumar 我觉得可能会是一个很好的Sweave替代品,我比较喜欢这样的设计。我认为Sweave在设计上的一个重大缺陷就是自己发明了很多非驴非马的东西,比如\SweaveOpts{a=b},这既不是合法的LaTeX命令,也不是合法的R代码,类似的还有\SweaveInput{}等等。我一直比较推崇的程序杰作是WordPress,例如它就把一些元信息以注释的形式写在PHP文件起始处(比如主题模板),这样不干扰正常的PHP程序,又能让系统知道这个文件的信息。decumar也是采取这种设计。另外一个替代品就是brew包(CRAN上有),它的设计极其简单,但缺憾是不支持图形的插入。

回复 第11楼 的 Delbule:只要中文article/beamer能运行,相应的中文Sweave文档就能运行,真的需要模板吗?

Ubuntu已经很傻瓜了,下载ISO光盘映像刻张盘,找台破电脑装上,捣鼓一下午,要是有人教你的话,捣鼓两小时就差不多上路了,没那么可怕。

3 个月 后

回复 第1楼 的 Delbule:我今天也遇到这个毛病了,后来把options(encoding="native.enc")改回来就好了,之前设置了utf-8,没想到弄巧成拙。

此外,我还设置了 Sys.setlocale("LC_CTYPE", "CHS") ,不知这个有没作用。总体来说,觉得问题出得很诡异,解决的也很诡异。

自从2.13.0以后,需要增加以下参数

Sweave("Sweave.Rnw", encoding = 'GBK')

回复 第14楼 的 刘思喆:我加的还是Sweave("Sweave.Rnw", encoding = 'UTF-8'), 可以的;我的Rnw文件是utf-8无BOM编码的

强烈建议使用UTF-8,其它编码的唯一作用就是让程序员发疯。

1 个月 后

回复 第9楼 的 谢益辉:现在终于把Sweave重写了…… http://yihui.github.com/knitr 欢迎各位测试(如果要用中文而且是Windows的话,暂时不要测试,这要命的一关我暂时还不想过;其它平台或英语应该没问题)

回复 第17楼 的 谢益辉:正在看呢。强烈、急切期待支持中文+WIN的版本放出啊,希望能在下次作业就用上。

我觉得中文应该不难吧,如果xelatex的话。

此外,highlight得到的Tex文件惨不忍睹,如果能像listing那样排版就很可读了。

中文的难度不在于LaTeX怎么编译,而在从读入文件到输出文件的一系列过程中都要小心,Windows这神奇的系统很难伺候,冷不丁哪个环节编码就乱了。

highlight怎么惨不忍睹法?

listings只需要用一个简单的钩子函数(hook)就搞定了,knitr有着无以伦比的可定制性。

回复 第19楼 的 谢益辉:highlight得到的tex文件的代码完全没有可读性啊。