Ввод номера строки для 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
```