Я работаю с Emacs 24 на Mac OS X 10.7.3 с R 2.14.0. У меня есть файл foo.Rnw
содержащийEmacs, R, Sweave: кодировка UTF-8 не распознается при запуске Sweave через Emacs
\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}
Мои .emacs
для работы с Sweave выглядит следующим образом:
(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.Rnw, содержащая символ не ASCII ×
заменяется на NA
. Я мог бы понять, что это связано с локализацией, в котором R
работает (см также вывод locale: [1] C
. Я мог бы включать заявления о форме export LC_MESSAGES="en_US.UTF-8"
в моем .bashrc
так что R
получает правильный locale
. Я также прекрасно использовать R CMD Sweave foo.Rnw
от терминала (который, конечно же, загружает .bashrc
и таким образом устанавливает locale
). Вопрос в следующем: как я могу заставить его работать через Emacs, чтобы я мог запускать Sweave через C-c C-c Sweave
? Я знаю, что Emacs не знает о переменных, установленных в .bashrc
, но как я могу гарантировать, что R CMD Sweave
, выпущенный Emacs, работает с той же локализацией, что и при его выполнении с терминала?
Я нашел несколько сообщений по этой проблеме, но не было решения для Mac и из Emacs. Еще раз отметим, что я отлично могу запустить R CMD Sweave foo.Rnw
с терминала (из-за моих настроек в .bashrc
) - большинство сообщений ссылаются на эту проблему - она просто не работает из Emacs (что довольно неприятно).
UPDATE:
Мои ~/.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"))
Это решило проблему.
Если вы уверены, что все ваши документы закодированы в UTF8, вы можете использовать 'Sys.setlocale()' в вашем '~/.Rprofile' (я не совсем рекомендую это, хотя). Проблемы с кодированием сложны. Мне интересно, как работает мой пакет knitr в этом случае (у меня нет Mac, поэтому я не могу сказать). –
Большое спасибо, Yihui. Как вы можете видеть из моего ** ОБНОВЛЕНИЯ ** выше, это решило проблему. –
@MariusHofert: даже если он решен сейчас: 'Sweave (" foo.Rnw ", encoding =" utf8 ")' help? – cbeleites