Интересно, есть ли какая-нибудь функция для помещения line numbers
с knitr
в .Rnw
. Я нашел это обсуждение и некоторые документы (теперь удаленные из Интернета), но не смог найти способ поставить номера строк.
Ввод номера строки для R-кода с knitr
Ответ 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 помещает каждую строку кода в свой листинг.
И вот результат:
Если вы хотите, чтобы каждый блок кода начинал нумерацию с 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
'''