定义单个块输出的字体

时间:2017-04-04 08:58:29

标签: r knitr r-markdown

使用knitr和Rmarkdown,我使用代码获取文件内容(分析输出),代码如下:

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

我希望使用字体Courier New复制filename.out的内容,但是在编写Rmarkdown文档时希望将普通文本用于Times New Roman。

我无法弄清楚如何做到这一点(我不想在整篇文档中要求Courier New)。

1 个答案:

答案 0 :(得分:2)

您可以在YAML中使用in_header调用的css文件或tex文件中创建所需的样式,具体取决于您的输出。 然后创建一个R函数,将此样式应用于文本。

css文件,用于定义所需的样式

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

latex文件定义所需的样式

如果输出只是LateX,则可以将这些命令直接放在文档中。

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

样式格式函数,用于将长文本输出包含在块

这些功能适用于HTML或LateX / 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,则会将其读作markdown语法。但标题之间的文字将在Courier中。如果您不希望将文字读作markdown语法,则可以删除\\nopandoc{中的beginStyleFmt以及}函数中相应的endStyleFmt

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