2016-10-26 20 views
7

यह प्रश्न consistent code html inline and in chunks with knitr के समान है। आरएचटीएमएल दस्तावेजों के बजाय, मैं आर मार्कडाउन दस्तावेजों में इनलाइन आर कोड को हाइलाइट करना चाहता हूं, उदाहरण के लिए, `r "plot(cars, main = 'A scatterplot.')"`रैमार्कडाउन के माध्यम से संकलित किया गया है, plot जैसे टोकन को हाइलाइट किया जाना चाहिए। डिफ़ॉल्ट रूप से, आर कोड भाग सिंटैक्स हाइलाइट किए जाते हैं, लेकिन इनलाइन आर कोड को हाइलाइट करने का कोई तरीका नहीं है।आर मार्कडाउन में इनलाइन आर कोड को हाइलाइट करने के लिए कैसे करें?

+0

यह भी देखें http://stackoverflow.com/questions/16405536/knitr-inline-chunk-options-no-evaluation-or-just-render-highlighted-code/16406120#16406120 – baptiste

उत्तर

16

यहाँ highr पैकेज (devtools::install_github('yihui/highr')) की development version का उपयोग कर एक समाधान है। मूल रूप से आप टोकन को हाइलाइट करने के लिए बस अपने कस्टम लाटेक्स कमांड को परिभाषित करते हैं। highr:::cmd_pandoc_latex लाटेक्स कमांड का डेटा फ्रेम है जो पांडोक सिंटैक्स हाइलाइटिंग करने के लिए उपयोग करता है।

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

तो फिर तुम knitr की inline हुक को फिर से परिभाषित कर सकते हैं:

--- 
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 
``` 

मैं वाक्य रचना सामान्य चरित्र तार से प्रकाश डाला होने के लिए चरित्र तार बताने के लिए एक सुविधाजनक मार्कर के रूप में I() इस्तेमाल किया। यह सिर्फ एक मनमाना विकल्प है। पीडीएफ उत्पादन:

syntax highlighted inline code

यह एक आदर्श समाधान है, हालांकि नहीं है। आपको कुछ मामलों में इसे ट्विक करने की आवश्यकता होगी। उदाहरण के लिए, अधिकांश विशेष लाटेक्स वर्ण बच नहीं पाएंगे, जैसे ~। आपको hi_pandoc() द्वारा gsub() द्वारा लाए गए लाटेक्स कोड को संसाधित करने की आवश्यकता हो सकती है।

व्यक्तिगत रूप से मुझे इनलाइन आउटपुट विचलन में कई रंग मिलते हैं, इसलिए मैं इसे हाइलाइट करना सिंटैक्स नहीं करता, लेकिन यह पूरी तरह से व्यक्तिगत स्वाद है।

+0

कोई मानता है कि यह अपेक्षाकृत होगा उसी तरह पाठ में हाइलाइटिंग सिंटैक्स की बजाय ग्रे पृष्ठभूमि रंग को कार्यान्वित करना आसान है। मुझे अक्सर पता चलता है कि इनलाइन कोड के साथ पाठ पढ़ने वाले छात्रों को यह पता लगाना मुश्किल होता है कि वास्तव में आर कोड क्या है क्योंकि फ़ॉन्ट्स समान हैं। भूरे रंग की पृष्ठभूमि होने से यह स्पष्ट हो जाएगा, उदाहरण के लिए मुझे आपके जीथब उत्तर में एचटीएमएल आउटपुट की तरह लगता है। – jamieRowen

+0

अच्छा समाधान! कोई सुझाव है कि मैं इनलाइन कोड 'i %% 5' को कैसे हाइलाइट कर सकता हूं? प्रतिशत संकेत बच नहीं पाएंगे जो एक त्रुटि फेंकता है ('# टिप्पणी' जैसी टिप्पणी को हाइलाइट करने में इनलाइन भी काम नहीं करता है)। –

संबंधित मुद्दे