我想知道是否有任何功能将line numbers
与knitr
放在.Rnw
。我找到了this discussion和一些文件(现在从网上删除)但找不到放置行号的方法。
此解决方案使用LaTeX列表包来创建行号。我只能通过累积所有代码块来让它们工作,但我想有一个类似的解决方案,它将枚举每个块中的行。这是.Rnw来源:
\documentclass{article}
\usepackage{listings}
\begin{document}
<<setup, echo=FALSE>>=
knit_hooks$set(source = function(x, options) {
paste("\\begin{lstlisting}[numbers=left, firstnumber=last]\n", x,
"\\end{lstlisting}\n", sep = "")
})
@
<<a, results='hold'>>=
1:2
3:4
5:6
@
<<b>>=
"test1"
"test2"
"test3"
@
\end{document}
关键部分是源钩which is basically copied from here。 firstnumber=last
告诉列表在列表中累积行号。没有它,所有行都编号为1,因为knitr将每个代码行放在它自己的列表中。
这是结果:
如果您希望每个代码块从1开始编号,请添加一个钩子来重置计数器:
knit_hooks$set(reset = function(before, options, envir){
if(before){
return("\\setcounter{lstnumber}{1}")
}
})
然后使用reset=TRUE
激活你想要的每个块中的钩子:
<<a, results='hold', reset=TRUE>>=
1:2
3:4
@
当使用带有Lyx或Latex的knitr时,我发现将lineno包添加到pre-amble的文档然后用\internallinenumbers \resetlinenumber[13]
封装块是有帮助的。
这是一个最小的例子:
\usepackage{lineno}
然后在正文中,在代码块之前添加以下内容:
{\internallinenumbers \resetlinenumber[13]
然后在代码块之后:
}
使用LyX(我用于快速生成LaTeX),我只需转到文档菜单,然后选择Settings-> LaTeX Preamble,然后添加\usepackage{lineno}
,单击Apply,OK,然后关闭。然后在我的代码块之前的主文档中,通过单击“TEX”按钮菜单按钮或按键盘上的“Ctrl + L”插入LaTeX源。然后我粘贴在{\internallinenumbers \resetlinenumber[13]
。最后,我将光标放在代码块之后,并执行相同的操作。只有我用花括号关闭行编号:}
。
这是一个最小的例子,当代码到位时粘贴在下面:
\documentclass[english]{article}
\usepackage{lineno}
\begin{document}
First line in main document before code chunk.
{\internallinenumbers \resetlinenumber[13]
<<CodeBlock1, highlight=TRUE, eval=FALSE, size="small">>=
x<-rnorm(10)
mean(x)
@
}
\end{document}
要在HTML中使用,您可以设置块选项class.source
以将自定义css传递给输出:
```{r class.source = c("numCode", "R", "numberLines")}
# your code
```