我想使用minted
重新定义 Sweave 环境Sinput
和Soutput
(参见下面的示例)。这样,我就可以minted
格式化我的R
代码了。还剩下两个问题:
1) 是否可以通过 minted 将其他命令(例如\par
或\vspace
)传递给Sinput
和Soutput
?如您所见,我尝试过Soutput
但失败了。如果能够传递命令/参数就太好了,因为这样可以调整Sinput
和Soutput
环境之间的间距。注意:这适用listings
于lstnewenvironment
。
2) 是否可以对下面定义的和使用不同的 minted 突出显示样式(例如emacs
和bw
)?这样,输入和输出可以采用不同的颜色,这将非常好。注意:这适用于可用于调整样式相关设置的命令。Sinput
Soutput
listings
\lstset
\documentclass{scrartcl}
\usepackage[T1]{fontenc}
\usepackage[american]{babel}
\usepackage{xcolor}
\usepackage{fancyvrb}
\usepackage{Sweave}
\usepackage{minted}
\xdefinecolor{lightgray}{RGB}{247, 247, 247}
\xdefinecolor{semilightgray}{RGB}{235, 235, 235}
\renewenvironment{Schunk}{\par\vspace{0.3\baselineskip}}{\\[-0.5\baselineskip]}
\expandafter\let\csname Sinput\endcsname\relax
\expandafter\let\csname endSinput\endcsname\relax
\expandafter\let\csname Soutput\endcsname\relax
\expandafter\let\csname endSoutput\endcsname\relax
\expandafter\let\csname Sinput*\endcsname\relax
\expandafter\let\csname endSinput*\endcsname\relax
\expandafter\let\csname Soutput*\endcsname\relax
\expandafter\let\csname endSoutput*\endcsname\relax
\usemintedstyle{emacs}
% redefine Sweave's Sinput
\newminted[Sinput]{r}{%
linenos,% line numbers
bgcolor=semilightgray% background color
}
% redefine Sweave's Soutput
\newminted[Soutput]{r}{%
bgcolor=lightgray% background color
% \protect\vspace{\baselineskip}
}
\begin{document}
<<label=preliminaries, echo=FALSE, results=hide>>=
options(width=74, useFancyQuotes="UTF-8", prompt="> ", continue=" ")
options(SweaveHooks=list(fig=function() par(mar=c(4, 4, 0.4, 0.7))))
@
Just before the Schunk, to see the spacing.
<<foo>>=
(x <- rnorm(20))
3!=4
@
Just after the Schunk, to see the spacing.
\end{document}
答案1
这是使用我的解决方案PythonTeX包,它使用相同的 Pygments 突出显示库minted
。我不使用 Sweave,所以这只是一个如何获取Sinput
并Soutput
执行所需操作的示例;它不是真正的 Sweave 文档。
我已设置Sinput
为使用rconsole
lexer, with emacs
style,以及Soutput
使用text
lexer, with bw
style。所有这些都很容易更改。您应该能够通过更改 、 和 环境来获得所需的任何间距Schunk
,Sinput
方法Soutput
是硬编码空格,或者添加会产生空格的可选参数。
\documentclass{scrartcl}
\usepackage{xcolor}
\usepackage{pythontex}
\usepackage{mdframed}
\xdefinecolor{lightgray}{RGB}{247, 247, 247}
\xdefinecolor{semilightgray}{RGB}{235, 235, 235}
\newenvironment{Schunk}{\vspace{10pt}}{\vspace{10pt}}
\newenvironment{Sinput}{%
\VerbatimEnvironment
\begin{mdframed}[backgroundcolor=semilightgray]%
\begin{pygments}{rconsole}}{\end{pygments}\end{mdframed}\vspace{10pt}}
\setpygmentspygopt{rconsole}{style=emacs}
\newenvironment{Soutput}{%
\VerbatimEnvironment
\begin{mdframed}[backgroundcolor=lightgray]%
\begin{pygments}{text}}{\end{pygments}\end{mdframed}}
\setpygmentspygopt{text}{style=bw}
\begin{document}
Just before the Schunk, to see the spacing.
\begin{Schunk}
\begin{Sinput}
> 2 + 2
\end{Sinput}
\begin{Soutput}
[1] 4
\end{Soutput}
\end{Schunk}
Just after the Schunk, to see the spacing.
\end{document}
答案2
正如您在评论中提到的,这个问题可以通过 轻松解决knitr
,并且您不必使用Sweave.sty
——请随意重新定义Schunk
、Sinput
和Soutput
。
\documentclass{scrartcl}
\usepackage[T1]{fontenc}
\usepackage[american]{babel}
\usepackage{xcolor}
\usepackage{minted}
\xdefinecolor{lightgray}{RGB}{247, 247, 247}
\xdefinecolor{semilightgray}{RGB}{235, 235, 235}
\usemintedstyle{emacs}
\newenvironment{Schunk}{\par\vspace{0.3\baselineskip}}{\\[-0.5\baselineskip]}
% define Sinput
\newminted[Sinput]{r}{%
linenos,% line numbers
bgcolor=semilightgray% background color
}
% define Soutput
\newminted[Soutput]{r}{%
bgcolor=lightgray% background color
% \protect\vspace{\baselineskip}
}
\begin{document}
<<label=preliminaries, echo=FALSE, results='hide'>>=
options(width=74, useFancyQuotes="UTF-8")
knit_hooks$set(fig.keep=function(before, options, envir) {
if (before) par(mar=c(4, 4, 0.4, 0.7))
})
render_sweave()
set_header(highlight = '')
@
Just before the Schunk, to see the spacing.
<<foo>>=
(x <- rnorm(20))
3!=4
@
Just after the Schunk, to see the spacing.
\end{document}