2017-11-27 2 views
1

Ich versuche, Latex-Code um r-Abschriften (.Rmd) Code-Chunks hinzuzufügen. Ich kann dies tun, indem manuelles Bearbeiten der .tex Datei von knitr wie folgt generiert,Dekorieren von .Rmd-Code-Stück mit Latex mit Knitr

\usepackage{fancyvrb} 
\usepackage{xcolor} 
\usepackage{changepage} 




{ 
\color{gray} 
\footnotesize 
\begin{adjustwidth}{2cm}{2cm} 
\noindent\rule{1cm}{1.5pt} R code \noindent\rule{8cm}{0.3pt} 
\begin{verbatim} 

\end{verbatim} 
\noindent\rule{8cm}{0.3pt} 
\end{adjustwidth} 
} 

wo \begin{verbatim} einen Code Chunk beginnt, die wiederum mit \end{verbatim} endet. Ich möchte vermeiden, diese Latexdekoration jedes Mal, wenn ich stricke, manuell neu zu kodieren.

Es scheint, dass ich die Paketinformationen in der YAML Header des .Rmd platzieren können:

--- 
header-includes: 
    - \usepackage{fancyvrb} 
    - \usepackage{xcolor} 
    - \usepackage{changepage} 
--- 

Aber ich bin nicht der Haken Setup richtig hinzubekommen. Ich habe versucht, den Haken zu modifizieren here beschrieben, wie folgt,

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

def.chunk.hook <- knitr::knit_hooks$get("chunk") 

knitr::knit_hooks$set(chunk = function(x, options) { 
    x <- def.chunk.hook(x, options) 
    paste0(
"{\n\\color{gray}\n\\footnotesize\n\\begin{adjustwidth}{1cm}{1cm}\n\\noindent\\rule{1cm}{1.5pt} R code \\noindent\\rule{8cm}{0.3pt}\n", 
x, 
"\n\n\\noindent\\rule{8cm}{0.3pt}\n\\end{adjustwidth}\n}\n" 
) 
} 
) 
``` 

die einen Fehler warf. Irgendwelche Vorschläge geschätzt.

UPDATE:

Ich bin in der Lage, indem Sie die folgenden meinen YAML Header R chunk Schriftfarbe, Größe und inden zu ändern:

header-includes: 
    - \usepackage{changepage} 
    - \usepackage{xcolor} 
    - \usepackage{etoolbox}\BeforeBeginEnvironment{verbatim}{\begingroup\color{gray}\footnotesize\begin{adjustwidth}{.5cm}{.5cm}}\AfterEndEnvironment{verbatim}{\end{adjustwidth}\endgroup} 

Damit denke ich, es gibt keine Notwendigkeit zu Verwenden Sie die Knitrohr-Hook-Funktion. Vielleicht habe ich einen saubereren Ansatz übersehen, der es mir erlaubt, alle Mods zu machen, die ich mag.

Antwort

1

Wenn von einem Rnw ausgeführt wird, ist die Knir Haken verschiedenen

> def.chunk.hook 
function (x, options) 
{ 
    ai = output_asis(x, options) 
    col = if (!ai) 
     paste0(color_def(options$background), if (!is_tikz_dev(options)) 
      "\\color{fgcolor}") 
    k1 = paste0(col, "\\begin{kframe}\n") 
    k2 = "\\end{kframe}" 
    x = .rm.empty.envir(paste0(k1, x, k2)) 
    size = if (options$size == "normalsize") 
     "" 
    else sprintf("\\%s", options$size) 
    if (!ai) 
     x = sprintf("\\begin{knitrout}%s\n%s\n\\end{knitrout}", 
      size, x) 
    if (options$split) { 
     name = fig_path(".tex", options, NULL) 
     if (!file.exists(dirname(name))) 
      dir.create(dirname(name)) 
     cat(x, file = name) 
     sprintf("\\input{%s}", name) 
    } 
    else x 
} 
<environment: namespace:knitr> 

aus, dass erhalten wird, wenn Rmd Laufen> md> tex (pandoc)

function (x, options) 
{ 
    x = gsub(paste0("[\n]{2,}(", fence, "| )"), "\n\n\\1", 
     x) 
    x = gsub("[\n]+$", "", x) 
    x = gsub("^[\n]+", "\n", x) 
    if (isTRUE(options$collapse)) { 
     x = gsub(paste0("\n([", fence_char, "]{3,})\n+\\1(", 
      tolower(options$engine), ")?\n"), "\n", x) 
    } 
    if (is.null(s <- options$indent)) 
     return(x) 
    line_prompt(x, prompt = s, continue = s) 
} 
<environment: 0x000000003777c250> 

Während die tex Datei ok strukturiert ist

{ 
\color{gray} 
\footnotesize 
\begin{adjustwidth}{1cm}{1cm} 
\noindent\rule{1cm}{1.5pt} R code \noindent\rule{8cm}{0.3pt} 
\begin{knitrout} 
\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\color{fgcolor}\begin{kframe} 
\begin{alltt} 
\hlstd{data} \hlkwb{<-} \hlnum{1} 
\end{alltt} 
\end{kframe} 
\end{knitrout} 

\noindent\rule{8cm}{0.3pt} 
\end{adjustwidth} 
} 

Und produziert einige erwartete Ausgabe. code decoration die .md ist nicht und wird nicht einfach in pdf (via tex) übertragen werden.

{ 
\color{gray} 
\footnotesize 
\begin{adjustwidth}{1cm}{1cm} 
\noindent\rule{1cm}{1.5pt} R code \noindent\rule{8cm}{0.3pt} 

```r 
data <- 1 
``` 

\noindent\rule{8cm}{0.3pt} 
\end{adjustwidth} 

}

+0

Es sieht aus wie Sie die (Rmd) knitr Haken vom tex trennen würde Ich mag den Brocken wickeln. Wie ruft die Funktion das Tex-Zeug auf? Sollte es in einer separaten Datei und in der YAML oder etwas anderem enthalten sein? – ssp3nc3r

+0

Mit "nicht einfach nach PDF übertragen" meinen Sie, dass die Lösung den Chunk letztendlich nicht korrekt dekorieren wird, wenn er in PDF gerendert wird? Vielleicht gehe ich völlig falsch vor, und ich sollte etwas wie Rmd zugunsten von Rnw tun ... in der Hoffnung, dass das nicht der Fall ist, weil Markdown ansonsten so sauber ist, damit die Leute damit arbeiten können. – ssp3nc3r

+0

Der Hook in rmd wird den richtigen Code nicht integrieren, so dass die Chunks nicht korrekt dekoriert werden. Ich werde versuchen zu testen, ob die Integration des Codes von der anderen Funktion (die mit. Rnw erzeugt wird) in Rmd funktioniert. – Cedric

Verwandte Themen