2016-08-05 79 views
1

我在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} 
+0

我甚至無法編譯你的文檔:你需要包含'\ settextfont'來加載一個Farsi字體,比如「XB Niloofar」。然後它應該工作(儘管模型代碼被錯誤地排版,因爲您沒有將文本方向重置爲從左到右)。只是爲了驗證:你在哪個操作系統上? R的Windows版本在字符編碼方面存在問題。另外,請確保您的文檔使用knitr的正確編碼加載。你可以看看正在生成的tex文件嗎?它是否包含正確的字符? –

+0

好吧,我設置波斯語字體,但輸出TeX文件包含????我的操作系統是Windows 7 64bit –

+0

在這種情況下,請確保您的Rnw文件編碼爲UTF-8,並在編織文件時明確設置該編碼。 –

回答

1
  1. 確保文件被保存在UTF-8編碼
  2. 在大多數的操作系統,這就足夠了,因爲UTF-8是系統的默認編碼反正。特別是在Windows上,您還需要指定編碼針織,例如,當:

    knit('filename.rnw', encoding = 'UTF-8') 
    

Futhermore,你需要明確處理閱讀文本的方向:波斯語是從右到左,但(西方)源代碼需要從左到右的文本方向。這需要在使用例如代碼的代碼中明確設置。 \(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了。

+0

我有另一個問題:(代碼塊是從右到左的輸出,雖然它應該從左到右 –

+0

@aminroshani正如我以前的評論中提到的,你需要明確地設置 - 請參閱更新後的答案 –

+0

非常感謝。 –