2017-04-04 30 views
4

使用knitr和Rmarkdown,我使用的代碼來讀取一個文件(一個分析的輸出)的含量,用代碼如下所示:定義字體爲單個塊輸出

{r comment='', echo=FALSE} 
cat(readLines('/filepath/filename.out'), sep = '\n') 

我想內容的filename.out將被複製爲字體Courier New,但希望在編織Rmarkdown文檔時使用Times New Roman作爲普通文本。

我無法弄清楚如何做到這一點(我不想爲整個文檔要求新的Courier)。

+0

大概是這樣的:http://stackoverflow.com/questions/37944197/add-a-css-class-to-single-code-chunks-in-rmarkdown –

回答

2

您可以在YAML中使用in_header調用的css文件或tex文件中創建所需的樣式,具體取決於您的輸出。 然後你創建一個R函數,將這個樣式應用到你的文本中。

CSS文件來定義所需的樣式

.Courier { 
    font-family: Courier New, Courier, monospace; 
} 

乳膠文件來定義所需的樣式

如果你的產量只有乳膠,您可以將文檔直接把這些命令。

\newenvironment{Courier}{\ttfamily}{\par} 
% Trick to avoid pandoc escaping texte between \begin and \end 
\newcommand{\nopandoc}[1]{#1} 

長文本輸出樣式格式功能塊

這些功能HTML或乳膠/ PDF輸出工作,包括:

```{r, echo=FALSE} 
    beginStyleFmt <- function(textstyle, type = "span") { 
    outputFormat <- knitr:::pandoc_to() 
    if (outputFormat %in% c('latex', 'beamer')) { 
    if (type %in% c("div", "p")) { 
     paste0("\\nopandoc{\\begin{", textstyle, "}}\n") 
    } else { 
     paste0("\\nopandoc{\\", textstyle, "{") 
    } 
    } else if (outputFormat == 'html') { 
     paste0("<", type, " class='", textstyle, "'>") 
    } else { 
    "" 
    } 
} 

endStyleFmt <- function(textstyle, type = "span") { 
    outputFormat <- knitr:::pandoc_to() 
    if (outputFormat %in% c('latex', 'beamer')) { 
    if (type %in% c("div", "p")) { 
     paste0("\n\\nopandoc{\\end{", textstyle, "}}") 
    } else { 
     paste0("}}") 
    } 
    } else if (outputFormat == 'html') { 
     paste0("</", type, ">") 
    } else { 
    "" 
    } 
} 
``` 

代碼爲您大塊文檔中

如果在文本文件中有類似標記的語法(如# Title),它將作爲標記語法讀取。但標題之間的文本將在Courier中。如果你不希望你的閱讀文本降價語法,則可以在beginStyleFmt去除\\nopandoc{endStyleFmt功能相應}

`r beginStyleFmt("Courier", type = "div")` 
```{r comment='', echo=FALSE, results='asis'} 
cat(readLines('/filepath/filename.out'), sep = '\n') 
``` 
`r endStyleFmt("Courier", type = "div")` 
+0

感謝。一些快速嘗試使這項工作沒有成功(使用降價代碼,輸出格式爲PDF)。我會從你的博客開始進一步研究。 – cibr

+0

是的。我修改了'begin'和'end'函數,以及你的代碼塊的語法,你現在應該能夠使它工作。順便說一句,對於你來說,LateX代碼可以直接寫入你的Rmd文件。 –