2016-10-26 19 views
7

Câu hỏi này tương tự như consistent code html inline and in chunks with knitr. Thay vì tài liệu .Rhtml, tôi muốn làm nổi bật mã R nội tuyến trong các tài liệu R Markdown, ví dụ: sau `r "plot(cars, main = 'A scatterplot.')"` được biên dịch qua rmarkdown, các mã thông báo như plot sẽ được đánh dấu. Theo mặc định, các đoạn mã R được đánh dấu cú pháp, nhưng không có cách nào để làm nổi bật mã R nội tuyến.Làm thế nào để cú pháp làm nổi bật mã R nội tuyến trong R Markdown?

+0

cũng xem http://stackoverflow.com/questions/16405536/knitr-inline-chunk-options-no-evaluation-or-just-render-highlighted-code/16406120#16406120 – baptiste

Trả lời

16

Dưới đây là một giải pháp sử dụng development version của gói highr (devtools::install_github('yihui/highr')). Về cơ bản bạn chỉ cần xác định các lệnh LaTeX tùy chỉnh của bạn để làm nổi bật các mã thông báo. highr:::cmd_pandoc_latex là một khung dữ liệu của lệnh LaTeX mà Pandoc sử dụng để làm nổi bật cú pháp.

head(highr:::cmd_pandoc_latex) 
##     cmd1 cmd2 
## COMMENT \\CommentTok{ } 
## FUNCTION \\NormalTok{ } 
## IF  \\NormalTok{ } 
## ELSE  \\NormalTok{ } 
## WHILE  \\NormalTok{ } 
## FOR  \\NormalTok{ } 

Sau đó, bạn có thể xác định lại móc inline của knitr:

--- 
output: 
    pdf_document: 
    keep_tex: yes 
--- 

```{r include=FALSE} 
local({ 
    hi_pandoc = function(code) { 
    if (knitr:::pandoc_to() != 'latex') return(code) 
    if (packageVersion('highr') < '0.6.1') stop('highr >= 0.6.1 is required') 
    res = highr::hi_latex(code, markup = highr:::cmd_pandoc_latex) 
    sprintf('\\texttt{%s}', res) 
    } 
    hook_inline = knitr::knit_hooks$get('inline') 
    knitr::knit_hooks$set(inline = function(x) { 
    if (is.character(x) && inherits(x, 'AsIs')) hi_pandoc(x) else hook_inline(x) 
    }) 
}) 
``` 

Test inline R code: `r I("plot(cars, main = 'A scatterplot.')")`. 
Normal inline code `r pi`. 

A code block: 

```r 
plot(cars, main = 'A scatterplot.') 
1 + 2 # a comment 
``` 

tôi đã sử dụng I() như một dấu hiệu thuận tiện để nói với chuỗi ký tự là các câu lệnh của bố từ sợi nhân vật bình thường. Nó chỉ là một sự lựa chọn tùy ý. đầu ra PDF:

syntax highlighted inline code

Đây không phải là một giải pháp hoàn hảo, mặc dù. Bạn sẽ cần phải tinh chỉnh nó trong một số trường hợp. Ví dụ: hầu hết các ký tự LaTeX đặc biệt không được thoát, chẳng hạn như ~. Bạn có thể cần xử lý mã LaTeX được trả về bởi hi_pandoc() bởi gsub().

Cá nhân tôi tìm thấy nhiều màu trong đầu ra nội dòng mất tập trung, vì vậy tôi sẽ không làm nổi bật cú pháp, nhưng đây là hoàn toàn là sở thích cá nhân.

+0

Giả sử sau đó nó sẽ tương đối dễ triển khai màu nền xám hơn là tô sáng cú pháp trong văn bản theo cách tương tự. Tôi thường thấy rằng học sinh đọc văn bản với mã nội tuyến trong việc tìm thấy khó khăn để chọn ra những gì thực sự là mã R vì các phông chữ rất giống nhau. Có nền màu xám sẽ làm cho nó rõ ràng hơn, tương tự như tôi đoán đầu ra html như trong câu trả lời github của bạn chẳng hạn. – jamieRowen

+0

Giải pháp tuyệt vời! Bất kỳ đề xuất làm thế nào tôi có thể làm nổi bật mã nội tuyến 'i %% 5'? Các dấu hiệu tỷ lệ phần trăm không được thoát mà ném một lỗi (cũng inline làm nổi bật một bình luận như '# Comment' không hoạt động). –

Các vấn đề liên quan