Emacs,R,Sweave:UTF-8编码在通过Emacs启动Sweave时无法识别



我在Mac OS X 10.7.3和R 2.14.0上使用Emacs 24。我有一个包含的文件foo.Rnw

documentclass[
paper=a4,% 210mm × 297mm
pagesize% write page size to dvi
]{article}
usepackage[american]{babel}
usepackage{fancyvrb}
usepackage[utf8]{inputenc}
SweaveOpts{engine=R}
SweaveOpts{pdf=TRUE}
begin{document}
Some text
<<>>=
sessionInfo()
@
end{document}

我使用Sweave的.emacs如下所示:

(add-hook 'Rnw-mode-hook
  (lambda ()
    (add-to-list 'TeX-command-list
         '("Sweave" "R CMD Sweave %s"
           TeX-run-command nil t :help "Run Sweave") t)
    (add-to-list 'TeX-command-list
         '("Stangle" "R CMD Stangle %s"
           TeX-run-command nil t :help "Run Stangle") t)
    (setq TeX-command-default "Sweave")))

如果我使用C-c C-c,然后选择Sweave,则.tex文件如下所示:

documentclass[
NA
pagesize% write page size to dvi
]{article}
usepackage[american]{babel}
usepackage{fancyvrb}
usepackage[utf8]{inputenc}


usepackage{Sweave}
begin{document}
Some text
begin{Schunk}
begin{Sinput}
> sessionInfo()
end{Sinput}
begin{Soutput}
R version 2.14.0 (2011-10-31)
Platform: x86_64-apple-darwin11.2.0/x86_64 (64-bit)
locale:
[1] C
attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     
loaded via a namespace (and not attached):
[1] tools_2.14.0
end{Soutput}
end{Schunk}
end{document}

正如你所看到的,foo的第二行。包含非ASCII字符CCD_ 6的Rnw被CCD_。我可以发现这与R运行的本地化有关(另请参阅locale: [1] C的输出。我可以在.bashrc中包含形式为export LC_MESSAGES="en_US.UTF-8"的语句,以便R获得正确的locale。我还可以从终端完美地使用R CMD Sweave foo.Rnw(当然,它加载.bashrc,从而正确设置locale)。问题是:如何通过Emacs使其工作,以便通过C-c C-c Sweave运行Sweave?我知道Emacs不知道.bashrc中设置的变量,但我如何保证从Emacs发布的R CMD Sweave以与我在终端执行时相同的本地化运行?

我发现了几个关于这个问题的帖子,但没有针对Mac和Emacs的解决方案。再次注意,我可以从终端完美地运行R CMD Sweave foo.Rnw(由于我在.bashrc中的设置)——大多数帖子都解决了这个问题——它只是不能在Emacs中工作(这很烦人)。

更新:

我的~/.bashrc包含:

export LC_COLLATE="en_US.UTF-8"
export LC_CTYPE="en_US.UTF-8"
export LC_MONETARY="en_US.UTF-8"
export LC_TIME="en_US.UTF-8"
export LC_MESSAGES="en_US.UTF-8"

根据Yihui的建议,我在我的~/.Rprofile中放入了以下内容:

invisible(Sys.setlocale("LC_COLLATE", "en_US.UTF-8"))
invisible(Sys.setlocale("LC_CTYPE", "en_US.UTF-8"))
invisible(Sys.setlocale("LC_MONETARY", "en_US.UTF-8"))
invisible(Sys.setlocale("LC_TIME", "en_US.UTF-8"))
invisible(Sys.setlocale("LC_MESSAGES", "en_US.UTF-8"))

这解决了问题。

最终答案可以在UPDATE下找到。

@cbeleites:我不再运行MacOSX(也不是R2-14),所以我不能说。

最新更新