knitr中的波斯语字符

时间:2016-08-05 10:29:00

标签: r character-encoding knitr

我在R 3.3.1和RStudio中使用knitr 1.13,并且在knitr识别波斯语字符时遇到问题。我保存在test.Rnw文件中的代码下方,然后运行knit("test.Rnw"),但输出中的波斯语字符更改为?????

\documentclass{article}
\usepackage{xepersian}%package for type Farsi in LaTex
\begin{document}
این یک متن آزمایشی است
<<model>>=
fit <- lm(dist ~ speed, data = cars)
@
برای آزمایش داریم:
\Sexpr{coef(fit)[2]}
\end{document}

1 个答案:

答案 0 :(得分:1)

  1. 确保文件以UTF-8编码保存
  2. 在大多数操作系统上,这已经足够了,因为UTF-8无论如何都是系统的默认编码。特别是在Windows上,您还需要在编织时指定编码,例如:

    knit('filename.rnw', encoding = 'UTF-8')
    
  3. 此外,您需要明确处理文本的阅读方向:波斯语是从右到左,但(西方)源代码需要从左到右的文本方向。这需要使用例如代码在代码中明确设置。 \(un)setLTR

    \documentclass{article}
    \usepackage{xepersian}
    % Set a font for the text
    \settextfont{XB Niloofar}
    
    \begin{document}
    این یک متن آزمایشی است
    \setLTR
    <<model>>=
    fit <- lm(dist ~ speed, data = cars)
    @
    \unsetLTR
    برای آزمایش داریم:
    \Sexpr{coef(fit)[2]}
    \end{document}
    

    你也可以使用Knitr钩子为每个代码块自动设置它。您可能会为此example 74调整:

    <<setup, include=FALSE>>=
    library(knitr)
    knit_hooks$set(ltr = function(before, options, envir) {
        if (before) '\\setLTR' else '\\unsetLTR'
    })
    @
    

    现在您可以按如下方式编写代码块:

    <<model, ltr=TRUE>>
    fit <- lm(dist ~ speed, data = cars)
    @
    

    不再需要手动\setLTR ... \unsetLTR