使用knitr用latex装饰.Rmd代码块
我试图在r-markdown(使用knitr用latex装饰.Rmd代码块,r,latex,knitr,r-markdown,R,Latex,Knitr,R Markdown,我试图在r-markdown(.Rmd)代码块周围添加latex代码。我可以手动编辑knitr生成的.tex文件,如下所示: \usepackage{fancyvrb} \usepackage{xcolor} \usepackage{changepage} { \color{gray} \footnotesize \begin{adjustwidth}{2cm}{2cm} \noindent\rule{1cm}{1.5pt} R code \noindent\rule{8cm}{0.3p
.Rmd
)代码块周围添加latex代码。我可以手动编辑knitr
生成的.tex
文件,如下所示:
\usepackage{fancyvrb}
\usepackage{xcolor}
\usepackage{changepage}
{
\color{gray}
\footnotesize
\begin{adjustwidth}{2cm}{2cm}
\noindent\rule{1cm}{1.5pt} R code \noindent\rule{8cm}{0.3pt}
\begin{verbatim}
\end{verbatim}
\noindent\rule{8cm}{0.3pt}
\end{adjustwidth}
}
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
def.chunk.hook <- knitr::knit_hooks$get("chunk")
knitr::knit_hooks$set(chunk = function(x, options) {
x <- def.chunk.hook(x, options)
paste0(
"{\n\\color{gray}\n\\footnotesize\n\\begin{adjustwidth}{1cm}{1cm}\n\\noindent\\rule{1cm}{1.5pt} R code \\noindent\\rule{8cm}{0.3pt}\n",
x,
"\n\n\\noindent\\rule{8cm}{0.3pt}\n\\end{adjustwidth}\n}\n"
)
}
)
```
其中,\begin{verbatim}
开始一个代码块,该代码块依次以\end{verbatim}
结束。我希望避免每次编织时手动重新编码这个乳胶装饰
似乎我可以将包信息放在.Rmd
的YAML
标题中:
---
header-includes:
- \usepackage{fancyvrb}
- \usepackage{xcolor}
- \usepackage{changepage}
---
但是我没有把钩子安装好。我试图修改描述的钩子,如下所示
\usepackage{fancyvrb}
\usepackage{xcolor}
\usepackage{changepage}
{
\color{gray}
\footnotesize
\begin{adjustwidth}{2cm}{2cm}
\noindent\rule{1cm}{1.5pt} R code \noindent\rule{8cm}{0.3pt}
\begin{verbatim}
\end{verbatim}
\noindent\rule{8cm}{0.3pt}
\end{adjustwidth}
}
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
def.chunk.hook <- knitr::knit_hooks$get("chunk")
knitr::knit_hooks$set(chunk = function(x, options) {
x <- def.chunk.hook(x, options)
paste0(
"{\n\\color{gray}\n\\footnotesize\n\\begin{adjustwidth}{1cm}{1cm}\n\\noindent\\rule{1cm}{1.5pt} R code \\noindent\\rule{8cm}{0.3pt}\n",
x,
"\n\n\\noindent\\rule{8cm}{0.3pt}\n\\end{adjustwidth}\n}\n"
)
}
)
```
因此,我认为没有必要使用knitr hook函数。也许我忽略了一种更干净的方法,它允许我制作任何我喜欢的mod。当从Rnw运行时,knir hook是不同的
> def.chunk.hook
function (x, options)
{
ai = output_asis(x, options)
col = if (!ai)
paste0(color_def(options$background), if (!is_tikz_dev(options))
"\\color{fgcolor}")
k1 = paste0(col, "\\begin{kframe}\n")
k2 = "\\end{kframe}"
x = .rm.empty.envir(paste0(k1, x, k2))
size = if (options$size == "normalsize")
""
else sprintf("\\%s", options$size)
if (!ai)
x = sprintf("\\begin{knitrout}%s\n%s\n\\end{knitrout}",
size, x)
if (options$split) {
name = fig_path(".tex", options, NULL)
if (!file.exists(dirname(name)))
dir.create(dirname(name))
cat(x, file = name)
sprintf("\\input{%s}", name)
}
else x
}
<environment: namespace:knitr>
>def.chunk.hook
功能(x,选项)
{
ai=输出(x,选项)
col=if(!ai)
粘贴0(颜色定义(选项$background),如果(!is_tikz_dev(选项))
“\\color{fgcolor}”)
k1=paste0(列“\\begin{kframe}\n”)
k2=“\\end{kframe}”
x=.rm.empty.envir(粘贴0(k1,x,k2))
大小=如果(选项$size==“normalsize”)
""
else sprintf(“\\%s”,选项$size)
如果(!ai)
x=sprintf(\\begin{knitrout}%s\n%s\n\\end{knitrout}),
尺寸(x)
如果(选项$split){
名称=图路径(“.tex”,选项,空)
如果(!file.exists(dirname(name)))
目录创建(目录名(名称))
cat(x,文件=名称)
sprintf(“\\input{%s}”,名称)
}
其他x
}
从运行Rmd>md>tex(pandoc)时获得的数据
函数(x,选项)
{
x=gsub(粘贴0([\n]{2,}(,fence,“|”)”),“\n\n\\1”,
十)
x=gsub(“[\n]+$”,“”,x)
x=gsub(“^[\n]+”,“\n”,x)
如果(isTRUE(选项$collapse)){
x=gsub(粘贴0(“\n([”,fence_char,”]){3,})\n+\\1(“,
tolower(选项$engine),“?\n”),“\n”,x)
}
如果(is.null)(s)看起来像是将(Rmd)knitr hook从tex中分离出来,我想包装块。函数如何调用tex内容。它应该在单独的文件中并包含在YAML或其他文件中吗?还有,通过“不容易传输到pdf”,你的意思是,当呈现为PDF时,解决方案最终不会正确地装饰块吗?也许我完全采取了错误的方法,我应该做一些类似于放弃Rmd而支持Rnw的事情…希望不是这样,因为降价对于人们来说是如此干净。Rmd中的挂钩不会集成正确的方法我将尝试测试是否集成了来自另一个函数(使用.Rnw生成的函数)的代码在Rmd中工作。我尝试过调整其他功能,但不起作用。我真的认为latex的knitr挂钩应该与.Rnw一起使用,而不是.Rmd。对不起……但我不是专家,只是想帮你。你可能很快会得到谢一辉的确认。既然你试图使用latex代码进行装饰,也许你应该切换生成LATEX报告。这取决于您是否还想生成其他格式,而.Rnw不允许。
{
\color{gray}
\footnotesize
\begin{adjustwidth}{1cm}{1cm}
\noindent\rule{1cm}{1.5pt} R code \noindent\rule{8cm}{0.3pt}
\begin{knitrout}
\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\color{fgcolor}\begin{kframe}
\begin{alltt}
\hlstd{data} \hlkwb{<-} \hlnum{1}
\end{alltt}
\end{kframe}
\end{knitrout}
\noindent\rule{8cm}{0.3pt}
\end{adjustwidth}
}
{
\color{gray}
\footnotesize
\begin{adjustwidth}{1cm}{1cm}
\noindent\rule{1cm}{1.5pt} R code \noindent\rule{8cm}{0.3pt}
```r
data <- 1
```
\noindent\rule{8cm}{0.3pt}
\end{adjustwidth}