13

我想知道是否有任何功能可以放入line numbers. 我找到了这个讨论和一些文档(现已从网络上删除),但找不到放置行号的方法。knitr.Rnw

4

3 回答 3

12

此解决方案使用 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}

这其中的关键部分在 source hook 中,基本上是从这里复制过来的。告诉列表在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
@
于 2014-12-24T08:18:50.987 回答
2

在将 knitr 与 Lyx 或 Latex 一起使用时,我发现将 lineno 包添加到文档前导码中然后用\internallinenumbers \resetlinenumber[13].

这是一个最小的例子:

\usepackage{lineno}

然后在正文中,在代码块之前添加以下内容:

{\internallinenumbers \resetlinenumber[13]

然后在代码块之后:

}

使用 LyX(我用于快速生成 LaTeX 的工具),我只需转到文档菜单,然后单击 Settings->LaTeX Preamble 并添加\usepackage{lineno},单击 Apply、OK,然后单击 Close。然后在我的代码块之前的主文档中,我通过单击“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}
于 2019-02-13T18:17:27.680 回答
1

为了在 HTML 中使用,您可以设置 chunk 选项class.source以将自定义 css 传递给输出:

```{r class.source = c("numCode", "R", "numberLines")}
# your code
```
于 2018-11-13T11:59:53.127 回答