7

我尝试根据分组变量生成一个 PDF 报告拆分部分,使用brewknitr。我的分组变量可能包含特殊字符(变音符号),例如 å æ ø。

仅文档标题中的变音符号可以很好地处理\usepackage[utf8]{inputenc}(参见下面的示例)。但是,分组变量中的变音符号会产生错误\usepackage[utf8]{inputenc}

另一方面,当我尝试时\usepackage[T1]{fontenc},分组变量中的变音符号得到了正确处理。但是现在标题没有正确编码。

我正在努力在标题和分组变量中正确编码。

这是一个示例,我尝试生成一份 PDF 报告,其中包含 iris 数据集中每个物种的汇总统计小节。我希望它可以说明我的问题。

用于准备没有变音符号的数据的 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.rnwfrombrew用作输入文件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_pdfR 脚本中函数的输入。

\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 的“变音变音版本”后,我在与上述相同的 .rnw 文件上运行 brew_knit_pdf 函数,除了我使用不同的编码包(inputenc 和/或 fontenc)。

结果

这是迄今为止四次尝试的总结;使用不带或带变音符号的数据集,并在 .rnw 文件中使用不同的编码包。

    • R 数据:iris_tbl 用非变音符号准备
    • .rnw 文件: 中的变音符号\title{ }\usepackage[utf8]{inputenc}

在标题中输出变音符号 OK

    • R 数据: iris_tbl 用变音变音版本的 Species 准备
    • .rnw 文件: 中的变音符号\title{ }\usepackage[utf8]{inputenc}

输出

错误:在“iris_umlaut_tbl_out.tex”上运行“texi2dvi”失败 LaTeX 错误:...Package inputenc 错误:Unicode char \u8:æve 未设置为与 LaTeX 一起使用。

    • R 数据: iris_tbl 用变音变音版本的 Species 准备
    • .rnw 文件:umlauts in \title{ }, \usepackage[T1]{fontenc},\usepackage[utf8]{inputenc}

输出

错误:在“iris_umlaut_tbl_out.tex”上运行“texi2dvi”失败 LaTeX 错误:...Package inputenc 错误:Unicode char \u8:æve 未设置为与 LaTeX 一起使用。

    • R 数据: iris_tbl 用变音变音版本的 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 包维护者 Jeffrey Horner 的“off-SO”​​输入。在使用 Ubuntu 和命令行 R 运行我的脚本时,他没有遇到编码问题。这给了我一些新的希望。我没有机会自己运行Ubuntu,但是今天我更新了RStudio(0.97.449)并将默认编码设置为ISO8859-1(感谢易辉!)。\usepackage[latin1]{inputenc}现在,特殊字符在 .rnw 文件中的标题和分组变量中都已正确编码。也\usepackage[ansinew]{inputenc}有效。我不确定我最初的尝试出了什么问题。可能是 RStudio 没有将选项中设置的默认编码应用到我重新打开脚本文件时,我按照 Yihui 的建议更改了这些编码。但这只是一种猜测。

4

1 回答 1

3

由于您使用UTF-8的不是操作系统的本机编码,因此您需要明确告知knitr输入文档的编码。例如,您必须调用

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

但我不确定是否brew可以处理非本地字符编码。如果没有,我建议您使用系统默认编码(ISO8859-1在这种情况下应该是),并且

\usepackage[latin9]{inputenc}

或者knitr如果您必须使用,请执行所有操作UTF-8(这也使您可以单击按钮来编译文档);有关示例,请参见075-knit-expand.Rnw

于 2013-04-24T09:36:21.680 回答