Emacs, R, Sweave: кодировка UTF-8 не распознается при запуске Sweave через Emacs - PullRequest
5 голосов
/ 29 февраля 2012

Я работаю с Emacs 24 на Mac OS X 10.7.3 с R 2.14.0. У меня есть файл 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}

Мой .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:

My ~/.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"

Следуя совету Ии Хуэй, я вставил в свой ~/.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"))

Это решило проблему.

1 Ответ

0 голосов
/ 22 мая 2012

Окончательный ответ можно найти под ОБНОВЛЕНИЕ .

@ cbeleites: я больше не работаю с Mac OS X (ни R 2-14), поэтому не могу сказать.

...