2017-11-27 19 views
1

r-markdown(.Rmd)コードチャンクを囲むラテックスコードを追加しようとしています。次のように私は、手動でknitrによって生成された.texファイルを編集して\begin{verbatim}が順番に、\end{verbatim}で終わる、コードチャンクを開始しますknitrを使ったラテックスの.Rmdコードチャンク

\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} 
} 

これを行うことができます。手動でこのラテックスデコレーションを手作業で再編成するのを避けるために、手動でニットする必要があります。

私が.RmdYAMLヘッダにパッケージ情報を置くことができることが表示されます:

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

しかし、私はフックの設定権を取得していませんよ。私は、次のように、hereを説明フックを修正するために、エラーを投げた

```{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" 
) 
} 
) 
``` 

を試してみました。任意の提案が高く評価されました。

UPDATE

私はYAMLヘッダに以下を追加することにより、Rチャンクフォントの色、サイズ、およびインデントを変更することができる午前:それと

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

、私はする必要はありませんだと思いますknitrフック関数を使用します。多分、私はより洗練されたアプローチを見落としてしまいましたが、これは私が好きなモッズを作ることができます。

答えて

1

RNWから実行する場合、knirフックがTEXファイルがOKに構成されている間RMD> 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> 

を実行したときに得られることから

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

異なる

{ 
\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} 
} 

期待される出力が得られます。 code decoration .mdはpdf(tex経由)には簡単には転送されません。

{ 
\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

あなたは、私はチャンクをラップしたいtexから(RMD)knitrフックを分けるように見えます。関数はどのようにしてtexを呼び出しますか?それは別のファイルにあり、YAMLなどに含まれていなければなりませんか? – ssp3nc3r

+0

また、「pdfには簡単には転送できません」という意味で、PDFにレンダリングしたときに、ソリューションが最終的にチャンクを正しく装飾しないことを意味しますか?おそらく私は間違ったアプローチを取っているのですが、Rnwを支持してRmdを捨てるようなやり方をしなければなりません。 – ssp3nc3r

+0

rmdのフックは正しいコードを統合しないので、チャンクを正しく装飾しません。他の関数(.Rnwで生成されたもの)からのコードをRmdで統合するかどうかをテストしようとします。 – Cedric

関連する問題