2015-09-30 3 views
2

Я хотел бы включить списки кода, нарисованного из внешних файлов в файле Rmarkdown. Я бы очень хотел (подсветка синтаксиса, автоотчет и т. Д.).включить списки кодов из внешнего файла в knitr/markdown

  • Код не R-код (в противном случае я мог бы использовать некоторые из существующих хитростей pretty-print R functions) - в частности, это BUGS и Stan код.
  • Я не обязательно нацелен на выход LaTeX/PDF: в противном случае я мог бы использовать пакет listings.
  • Я хотел бы иметь возможность включать файлы без громоздкой внешней системы cat firstpart.rmd codefile.rmd lastpart.rmd >wholefile.rmd и без этапа предварительной обработки: this question предполагает, что процессоры Markdown, такие как Multimarkdown и Marked 2, имеют синтаксис включения файла, но я думаю, m застрял с pandoc.
  • В настоящее время я использую куски кода, как этот
```{r jagsmodel, echo=FALSE, results="markup", comment=""} 
cat(readLines("logist.bug"),sep="\n") 
``` 

, который работает нормально, но не поймите меня подсветка синтаксиса ...

+0

На каком языке используются внешние файлы? –

+0

ОШИБКИ и СТАН; последний выглядит в основном как C++. Выделение определений может существовать где-то для них, или я хотел бы написать их сам в крайнем случае. –

ответ

6

Вот один подход. Вам нужно установить pygments (pip install pygments), и он должен уметь (он должен сам по себе) «pygmentize где-то в вашей системе. Если у вас нет питона или вы не можете установить этот модуль, тогда этот ответ явно не будет ответом для вас.

следующие куски knitr (все, кроме последнего, который является чистым R) называют pygmentize, чтобы создать HTML-разметку для кода. должна быть возможность изменить https://github.com/hrbrmstr/knitrengines, чтобы сделать это более «срабатывает само "но это не в моем краткосрочном TODO

--- 
title: "lexers" 
output: 
    html_document: 
    css: code.css 
    keep_md: true 
--- 

```{r setup, include=FALSE} 
knitr::opts_chunk$set(echo = TRUE) 
``` 

### Bugs 

```{r bugs1, echo=FALSE, results="asis"} 
tf <- tempfile(fileext=".html") 
system(sprintf("/usr/local/bin/pygmentize -o %s incl.bug", tf)) 
cat(readLines(tf), sep="\n") 
unlink(tf) 
``` 

### Elixir 

```{r elixir1, echo=FALSE, results="asis"} 
tf <- tempfile(fileext=".html") 
system(sprintf("/usr/local/bin/pygmentize -o %s incl.ex", tf)) 
cat(readLines(tf), sep="\n") 
unlink(tf) 
``` 

### Python 

```{r py1, echo=FALSE, results="asis"} 
tf <- tempfile(fileext=".html") 
system(sprintf("/usr/local/bin/pygmentize -o %s incl.py", tf)) 
cat(readLines(tf), sep="\n") 
unlink(tf) 
``` 

### Plain ol' R 

```{r} 
summary(mtcars) 
``` 

Это делает:.

enter image description here

Вы можете использовать любой pygments CSS файл, который вы хотите для другой схемы, это то, что в code.css:

<style> 
.gl .hll { background-color: #ffffcc } 
.highlight { background: #f8f8f8; } 
.highlight .c { color: #408080; font-style: italic } /* Comment */ 
.highlight .err { border: 1px solid #FF0000 } /* Error */ 
.highlight .k { color: #008000; font-weight: bold } /* Keyword */ 
.highlight .o { color: #666666 } /* Operator */ 
.highlight .cm { color: #408080; font-style: italic } /* Comment.Multiline */ 
.highlight .cp { color: #BC7A00 } /* Comment.Preproc */ 
.highlight .c1 { color: #408080; font-style: italic } /* Comment.Single */ 
.highlight .cs { color: #408080; font-style: italic } /* Comment.Special */ 
.highlight .gd { color: #A00000 } /* Generic.Deleted */ 
.highlight .ge { font-style: italic } /* Generic.Emph */ 
.highlight .gr { color: #FF0000 } /* Generic.Error */ 
.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ 
.highlight .gi { color: #00A000 } /* Generic.Inserted */ 
.highlight .go { color: #808080 } /* Generic.Output */ 
.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ 
.highlight .gs { font-weight: bold } /* Generic.Strong */ 
.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ 
.highlight .gt { color: #0040D0 } /* Generic.Traceback */ 
.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ 
.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ 
.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ 
.highlight .kp { color: #008000 } /* Keyword.Pseudo */ 
.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ 
.highlight .kt { color: #B00040 } /* Keyword.Type */ 
.highlight .m { color: #666666 } /* Literal.Number */ 
.highlight .s { color: #BA2121 } /* Literal.String */ 
.highlight .na { color: #7D9029 } /* Name.Attribute */ 
.highlight .nb { color: #008000 } /* Name.Builtin */ 
.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ 
.highlight .no { color: #880000 } /* Name.Constant */ 
.highlight .nd { color: #AA22FF } /* Name.Decorator */ 
.highlight .ni { color: #999999; font-weight: bold } /* Name.Entity */ 
.highlight .ne { color: #D2413A; font-weight: bold } /* Name.Exception */ 
.highlight .nf { color: #0000FF } /* Name.Function */ 
.highlight .nl { color: #A0A000 } /* Name.Label */ 
.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ 
.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ 
.highlight .nv { color: #19177C } /* Name.Variable */ 
.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ 
.highlight .w { color: #bbbbbb } /* Text.Whitespace */ 
.highlight .mf { color: #666666 } /* Literal.Number.Float */ 
.highlight .mh { color: #666666 } /* Literal.Number.Hex */ 
.highlight .mi { color: #666666 } /* Literal.Number.Integer */ 
.highlight .mo { color: #666666 } /* Literal.Number.Oct */ 
.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ 
.highlight .sc { color: #BA2121 } /* Literal.String.Char */ 
.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ 
.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ 
.highlight .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */ 
.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ 
.highlight .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */ 
.highlight .sx { color: #008000 } /* Literal.String.Other */ 
.highlight .sr { color: #BB6688 } /* Literal.String.Regex */ 
.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ 
.highlight .ss { color: #19177C } /* Literal.String.Symbol */ 
.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ 
.highlight .vc { color: #19177C } /* Name.Variable.Class */ 
.highlight .vg { color: #19177C } /* Name.Variable.Global */ 
.highlight .vi { color: #19177C } /* Name.Variable.Instance */ 
.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ 
</style> 
#

UPDATE

Если вы готовы поместите код (который не будет выполнен, но будет отформатирован) inline, я только что сделал обновление вышеупомянутого пакета knitrengines, который позволяет вам сделать это:

--- 
title: "pygtest" 
output: html_document 
--- 

```{r setup, include=FALSE} 
knitr::opts_chunk$set(echo = TRUE) 
library(knitrengines) 
``` 

```{pygments test, pyg.ext="py", pyg.sty="github"} 
import something.please 

print("Hello, world!") 
``` 

```{pygments test2, pyg.ext="go", pyg.sty="github"} 
package main 

import "fmt" 

func main() { 

    s := make([]string, 3) 
    fmt.Println("emp:", s) 

    s[0] = "a" 
    s[1] = "b" 
    s[2] = "c" 
    twoD := make([][]int, 3) 
    for i := 0; i < 3; i++ { 
     innerLen := i + 1 
     twoD[i] = make([]int, innerLen) 
     for j := 0; j < innerLen; j++ { 
      twoD[i][j] = i + j 
     } 
    } 
    fmt.Println("2d: ", twoD) 
} 
``` 

```{pygments test3, pyg.ext="ex", pyg.sty="github"} 
defmodule Math do 
    def sum(a, b) do 
    a + b 
    end 
end 

IO.puts "The answer is #{ Math.sum(4,3) }"  
``` 

и производит это:

enter image description here

я могу сделать это использовать различные стили на код блока, но я едва циклы провернуть это. Это не должно быть слишком много работы.

+1

Кажется, некоторые люди попытались [сделать это возможным] (https: //gist.github.com/fizruk/6620756), чтобы сделать 'pygments' опцией фильтра pandoc' (которая также может работать). – hrbrmstr

+0

Добавлен альтернативный способ включения неисполняемого, но все еще помеченного кода через новое обновление в мой пакет 'knitrengines'. – hrbrmstr

Смежные вопросы