我在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),所以我不能说。