2016-10-26 60 views
7

Bu soru consistent code html inline and in chunks with knitr benzer. Bunun yerine .Rhtml belgeler, I `r "plot(cars, main = 'A scatterplot.')"` rmarkdown yoluyla derlenmiş sonra, örneğin R Markdown belgelerinde içi R kodu, vurgulamak istiyoruz plot gibi belirteçleri vurgulanır. Varsayılan olarak, R kod parçaları, sözdizimi vurgulanır, ancak satır içi R kodunu vurgulamanın bir yolu yoktur.Sözdizimi vurgulama R işaretlemede satır içi R kodu nasıl?

+0

ayrıca bkz. Http://stackoverflow.com/questions/16405536/knitr-inline-chunk-options-no-evaluation-or-just-render-highlighted-code/16406120#16406120 – baptiste

cevap

16

Burada içki, paketi (devtools::install_github('yihui/highr')) arasında development version kullanılarak bir çözümdür. Temel olarak, belirteçleri vurgulamak için özel LaTeX komutlarınızı tanımlarsınız. highr:::cmd_pandoc_latex Latex'in bir veri çerçevesi Pandoc dizim yapmak için kullandığı komutları olup.

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

Sonra knitr ait inline kanca yeniden tanımlayabilirsiniz:
--- 
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 
``` 

Ben sözdizimi, normal karakter dizeleri vurgulanan olmaya karakter dizeleri anlatmak için uygun bir işaretleyici olarak I() kullandı. Bu sadece keyfi bir seçimdir. PDF çıkışı:

syntax highlighted inline code

Bu da, mükemmel bir çözüm değildir. Bazı durumlarda onu düzeltmeniz gerekecek. Örneğin, en özel LaTeX karakterler böyle ~ olarak, çıkışı yapılmaz. Sen gsub() tarafından hi_pandoc() tarafından döndürülen LaTeX kodunu işlemek gerekebilir.

Şahsen ben rahatsız edici inline çıkışında birden çok renk bulmak, bu yüzden vurgulayarak sözdizimi olmaz, ama bu tamamen kişisel tadı.

+0

Daha sonra göreceli olarak, metinde sözdizimi vurgulamak yerine gri arka plan rengini de aynı şekilde uygulamak kolaydır. Çoğu zaman, inline kodlu metinleri okuyan öğrencilerin, fontlar çok benzer olduğu için aslında R kodunun ne olduğunu bulmakta zorlandığını görüyorum. Gri arkaplanın daha net hale gelmesi, benzer şekilde, örneğin github cevabındaki html çıktısını tahmin ediyorum. – jamieRowen

+0

Güzel çözüm! "I %% 5" satır içi kodunu nasıl vurgulayabileceğime dair herhangi bir öneriniz var mı? Yüzde işaretleri bir hata fırlatmaz (aynı zamanda '# Yorum' gibi bir yorumu vurgulamayan satır içi çizgi). –