Сварите и свяжите один отчет в формате PDF, разделенный по переменной со специальными символами (å æ ø) - проблема с кодировкой

Я пытаюсь создать один отчет в формате PDF, разбитый на разделы на основе переменной группировки, используя brew и knitr. Моя группирующая переменная может содержать специальные символы (умляуты), например å æ ø.

Умляуты только в заголовке документа нормально обрабатываются с помощью \usepackage[utf8]{inputenc} (см. Примеры ниже). Однако умляуты в группирующей переменной генерируют ошибку с \usepackage[utf8]{inputenc}.

С другой стороны, когда я попробовал \usepackage[T1]{fontenc}, умляуты в переменной группировки обрабатывались правильно. Но теперь заголовок закодирован неправильно.

Я изо всех сил пытаюсь получить правильную кодировку как в заголовке, так и в переменной группировки.

Вот пример, в котором я пытаюсь создать один отчет в формате PDF с подразделами сводной статистики по видам в наборе данных ирисов. Я надеюсь, что это может проиллюстрировать мою проблему.

Код R для подготовки данных без умляутов

library(plyr)
library(xtable)
library(knitr)
library(brew)
library(stringr)

Создайте сводную таблицу для каждого вида во встроенном iris наборе данных. Во-первых, используйте оригинальные Species имена без умляутов. Умлаут только в документе \title (см. Код для файла шаблона .rnw). Храните сводные таблицы в виде списка.

 data(iris)
 iris_tbl <- dlply(.data = iris, .variables = .(Species), function(x) xtable(summary(x)))

Определите функцию brew_knit_pdf. Функция преобразует файл латекса шаблона xxx.rnw в новый .rnw файл xxx_out.rnw, в котором есть одна секция для каждого элемента / группы, которая зацикливается. xxx_out.rnw из brew затем используется как входной файл в knit2pdf и преобразуется в PDF.

brew_knit_pdf <- function(template, ...){
  brew_out <- str_replace(string = template, pattern = ".rnw", replacement = "_out.rnw")
  brew(file = template, output = brew_out)
  knit2pdf(input = brew_out, ...)
}

brew_knit_pdf("iris_umlaut_tbl.rnw")

Код для файла шаблона .rnw

В моем примере я назвал файл шаблона следующим кодом iris_umlaut_tbl.rnw. Этот файл используется в качестве входных данных в функции brew_knit_pdf в сценарии R.

\documentclass{article}

% \usepackage[T1]{fontenc}    
\usepackage[utf8]{inputenc}

\usepackage{geometry}
\geometry{tmargin=2.5cm,bmargin=2.5cm,lmargin=2.5cm,rmargin=2.5cm}

\begin{document}

\begin{titlepage}

\title{Using brew and knitr to produce one PDF report split by a grouping variable.\\Problem with å æ ø in grouping variable}

\clearpage\maketitle
\thispagestyle{empty}

\tableofcontents

\end{titlepage}
\newpage


\section{Summary statistics for each species}

% R code loop wrapped in brew syntax, which brews the template file xxx.rnw to a new .rnw file xxx_out.rnw, which has one section for each group that is looped over, i.e. the names of the list iris_tbl produced in the R script.

<% for (Sp in names(iris_tbl)) { -%>

\subsection{<%= Sp %>}
<<sum-<%= Sp %>, echo=FALSE, results='asis'>>=
print(iris_tbl[["<%= Sp %>"]])
@
\newpage
<% } %>

\end{document}

Код R для подготовки данных с умляутами

Чтобы имитировать мои настоящие данные, я заменяю имена видов в данных радужной оболочки (бессмысленные) имена, которые содержат умляуты.

data(iris)
iris$Species <- as.character(iris$Species)

iris$Species[iris$Species == "setosa"] <- "åsetosa"
iris$Species[iris$Species == "versicolor"] <- "æversicolor"
iris$Species[iris$Species == "virginica"] <- "øvirginica"

# create a summary table for each species
iris_tbl <- dlply(.data = iris, .variables = .(Species), function(x) xtable(summary(x)))

Когда подготовлена ​​«умляутская версия» iris_tbl, я запускаю функцию brew_knit_pdf в том же файле .rnw, что и выше, за исключением того, что я использую разные пакеты кодирования (inputenc и / или fontenc).

Результат

Вот краткое изложение четырех попыток на данный момент; с использованием наборов данных без умляутов или с ними, а также с использованием различных пакетов кодирования в файле .rnw.

    • The R data: iris_tbl prepared with non-umlaut Species
    • Файл .rnw: умляуты в \title{ }, \usepackage[utf8]{inputenc}

Вывод умляутов в заголовке ОК

    • The R data: iris_tbl prepared with umlaut version of Species
    • Файл .rnw: умляуты в \title{ }, \usepackage[utf8]{inputenc}

Вывод

Ошибка: запуск texi2dvi на iris_umlaut_tbl_out.tex не удалось ошибки LaTeX: ... Пакет inputenc Ошибка: Unicode char \ u8: не настроен для использования с LaTeX.

    • The R data: iris_tbl prepared with umlaut version of Species
    • Файл .rnw: umlauts in \title{ }, \usepackage[T1]{fontenc}, \usepackage[utf8]{inputenc}

Вывод

Ошибка: запуск texi2dvi на iris_umlaut_tbl_out.tex не удалось ошибки LaTeX: ... Пакет inputenc Ошибка: Unicode char \ u8: не настроен для использования с LaTeX.

    • The R data: iris_tbl prepared with umlaut version of Species
    • Файл .rnw: умляуты в \title{ }, \usepackage[T1]{fontenc}

Вывод

умляуты в заголовке не в порядке, умляуты в группирующей переменной - в порядке


Может ли кто-нибудь указать мне правильное направление, чтобы получить правильную кодировку в обоих заголовках и переменных группировки? Заранее большое спасибо за то, что нашли время.


Информация о сеансе

Кодировка текста по умолчанию в моей R Studio 0.97.336: UTF-8

> sessionInfo()

R version 3.0.0 (2013-04-03)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=Norwegian (Bokmål)_Norway.1252  LC_CTYPE=Norwegian (Bokmål)_Norway.1252   
[3] LC_MONETARY=Norwegian (Bokmål)_Norway.1252 LC_NUMERIC=C                              
[5] LC_TIME=Norwegian (Bokmål)_Norway.1252    

attached base packages:
[1] splines   stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] Hmisc_3.10-1               survival_2.37-4            pastecs_1.3-13             boot_1.3-9                
 [5] pspline_1.0-15             ggplot2_0.9.3.1            lubridate_1.2.0            stringr_0.6.2             
 [9] brew_1.0-6                 knitr_1.1                  xtable_1.7-1               plyr_1.8                  
[13] PerformanceAnalytics_1.1.0 xts_0.9-3                  zoo_1.7-9                  gdata_2.12.0.2            

loaded via a namespace (and not attached):
 [1] cluster_1.14.4     colorspace_1.2-2   dichromat_2.0-0    digest_0.6.3       evaluate_0.4.3     formatR_0.7       
 [7] grid_3.0.0         gtable_0.1.2       gtools_2.7.1       labeling_0.1       lattice_0.20-15    MASS_7.3-26       
[13] memoise_0.1        munsell_0.4        proto_0.3-10       RColorBrewer_1.0-5 reshape2_1.2.2     scales_0.2.3      
[19] tools_3.0.0

> getOption("encoding")

[1] "native.enc"

Обновлять:

Я очень благодарен специалисту по сопровождению пакета brew Джеффри Хорнеру за внеплановый вклад. У него не было проблем с кодированием при запуске моего сценария с Ubuntu и командной строкой R. Это дало мне новую надежду. У меня нет возможности запустить Ubuntu самостоятельно, но сегодня я обновил RStudio (0.97.449) и установил кодировку по умолчанию на ISO8859-1 (спасибо Yihui!). Теперь специальные символы правильно закодированы как в заголовке, так и в группирующей переменной с \usepackage[latin1]{inputenc} в файле .rnw. Также \usepackage[ansinew]{inputenc} работает. Я не уверен, что пошло не так в моей первоначальной попытке. Возможно, RStudio не применил кодировку по умолчанию, установленную в параметрах, которую я изменил, следуя совету Yihui, к файлам сценариев, когда я их повторно открыл. Но это всего лишь предположение.


person Henrik    schedule 23.04.2013    source источник


Ответы (1)


Поскольку вы используете UTF-8, которая не является собственной кодировкой вашей ОС, вам необходимо явно указать knitr кодировку вашего входного документа. Например, вам нужно позвонить

knit2pdf(brew_out, encoding = "UTF-8")

Но я не уверен, что brew может обрабатывать неродные кодировки символов. Если нет, я предлагаю вам использовать кодировку по умолчанию для вашей системы (в данном случае она должна быть ISO8859-1), и

\usepackage[latin9]{inputenc}

Или сделайте все в knitr, если вам нужно использовать UTF-8 (это также позволяет вам щелкнуть кнопку, чтобы скомпилировать документ); см. пример 075-knit-expand.Rnw.

person Yihui Xie    schedule 24.04.2013
comment
Большое спасибо за ваш быстрый ответ. Я попробовал knit2pdf (brew_out, encoding = UTF-8) в сценарии R вместе с \ usepackage [utf8] {inputenc} или \ usepackage [T1] {fontenc} в файле шаблона .rnw - person Henrik; 24.04.2013
comment
Часть моих комментариев была потеряна. Я пробую еще раз: @Yihui: Большое спасибо за быстрый ответ. Я пробовал (1) knit2pdf (brew_out, encoding = UTF-8) в сценарии R и \ usepackage [utf8] {inputenc} или \ usepackage [T1] {fontenc} в файле шаблона .rnw, и (2) knit2pdf ( brew_out, ...) и \ usepackage [latin9] {inputenc} в файле .rnw, но проблема остается. Так что, возможно, это проблема с пивом. Спасибо, что указали мне на пример вязать с расширением. - person Henrik; 24.04.2013
comment
@ Yihui Еще один вопрос к вашему предложению 075-knit-expand. Я хочу называть подразделы только переменной цикла. В файле шаблона 075-template.rnw, Подразделы начинаются с Теперь я есть. Как перевести мою версию пивоварни (\ subsction {‹% = Sp%›}) на вязальщицу? Моя наивная попытка \ subsction {{{i}}} не сработала. Заранее спасибо. - person Henrik; 28.04.2013
comment
@Henrik использует \subsection{ {{i}} } - person Yihui Xie; 29.04.2013
comment
Большое спасибо. Я понимаю, что в версии brew тоже были пробелы, но я думал, что их единственная функция заключалась в улучшении читабельности кода, а не в том, что пробелы действительно требовались для запуска кода. Очевидно, что мне не хватает базовых навыков (в латексе? В вязальщике? И то, и другое?). Спасибо за помощь, Yihui! - person Henrik; 29.04.2013
comment
Где я могу узнать больше о необходимости свободного места вокруг разделителей {{}} в шаблоне? Ваше здоровье. - person Henrik; 29.04.2013
comment
Небольшое примечание о создании имен подразделов из переменной цикла в brew vs knitr. В версии для заваривания пробелы вокруг переменной цикла являются «только» косметическими; например \ subsction {‹% = Sp%›} дает тот же результат, что и \ subsction {‹% = Sp%›}, и пробелы не включаются в результирующие текс и PDF. В шаблоне для вязания, с другой стороны, перед {{Sp}} необходим пробел, например \ subsction {{{Sp}}}. Пространство в шаблоне также включается в результирующие текс и PDF. - person Henrik; 29.04.2013