Ввод номера строки для R-кода с knitr

Интересно, есть ли какая-либо функция, чтобы поставить line numbers с knitr в .Rnw, Я нашел это обсуждение и эти документы ( здесь и здесь), но не смог найти способ поставить номера строк. Любая помощь будет высоко оценена. Спасибо

2 ответа

Решение

Это решение использует пакет списков 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}

Ключевые части этого находятся в хуке источника, который в основном скопирован отсюда. 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
@

При использовании knitr с Lyx или Latex я обнаружил, что полезно добавить пакет lineno в документ pre-amble, а затем заключить фрагмент в \internallinenumbers \resetlinenumber[13],

Вот минимальный пример:

\usepackage{lineno}

затем в основной текст добавьте следующее перед фрагментом кода:

{\internallinenumbers \resetlinenumber[13]

а затем это после фрагмента кода:

}

С LyX (что я использую для быстрой генерации LaTeX), я просто захожу в меню документа, затем Настройки-> Преамбула LaTeX и добавляю \usepackage{lineno}нажмите Применить, OK, а затем Закрыть. Затем в основной документ перед блоком кода я вставляю исходный текст LaTeX, нажимая кнопку меню кнопки "TEX" или нажимая "Ctrl+L" на клавиатуре. Затем я вставляю {\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
```
Другие вопросы по тегам