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

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

Ответ 1

В этом решении для создания номеров строк используется пакет листинга 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 помещает каждую строку кода в свой листинг.

И вот результат:

enter image description here

Если вы хотите, чтобы каждый блок кода начинал нумерацию с 1, добавьте к reset счетчик:

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
@

Ответ 2

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

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

\usepackage{lineno}

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

{\internallinenumbers \resetlinenumber[13]

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

}

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

Ответ 3

Для использования в HTML вы можете установить опцию chunk class.source для передачи пользовательских css в вывод:

'''{r class.source = c("numCode", "R", "numberLines")}
# your code
'''