我正在使用 knitr 和 pandoc 生成 pdf 文档。转换主要是从 R markdown -> markdown -> latex -> pdf 自动完成的。但是,我的文档结合了 R 源代码及其输出,我想直观地区分这两种代码。
举个例子,这里是生成的文本:
\documentclass[]{article}
\usepackage{listings}
\usepackage[usenames,dvipsnames]{color}
\lstset{backgroundcolor=\color[gray]{0.95},
frame=single,columns=fixed,basicstyle=\ttfamily,
keepspaces=true,showstringspaces=false,numbers=none}
\begin{document}
Here's some regular text.
\begin{lstlisting}[language=R]
summary(cars)
\end{lstlisting}
\begin{lstlisting}
## speed dist
## Min. : 4.0 Min. : 2
## 1st Qu.:12.0 1st Qu.: 26
## Median :15.0 Median : 36
## Mean :15.4 Mean : 43
## 3rd Qu.:19.0 3rd Qu.: 56
## Max. :25.0 Max. :120
\end{lstlisting}
\end{document}
在输出的 PDF 中,本例中的两个列表都以灰色阴影显示。我希望只将其中一个列表加阴影,即 language=R 块或另一个。我可以使用模板轻松地将代码添加到标题中,但修改单个块对于自动生成的文档来说并不实用。
是否有某种方法可以告诉列表将一种颜色应用于具有已知语言(在本例中为 R)的环境,而将不同的颜色(或不颜色)应用于没有设置语言的环境?
澄清
由于代码是由其他程序生成的,我无法轻易修改 '\begin{document }' 行之后的任何内容。是否有仅修改标题的解决方案?我试图避免在编写初始 .Rmd 文件后手动更改文本。
跟进 到目前为止,我还没有找到使用 knitr 和 pandoc 的内置功能来实现我需要的功能的方法。我最接近的方法是后处理 pandoc 生成的 tex 文件,以添加我需要的样式选项来实现 @GonzaloMedina 提供的答案。
#!/bin/bash
fullname=$(basename "$1")
extension="${fullname##*.}"
filename="${fullname%.*}"
pandoc $fullname -o $filename.tex --template=ty --listings
sed -i 's/\\begin{lstlisting}\[language=R\]/\\begin{lstlisting}[language=R,style=myRstyle]/g' $filename.tex
pdflatex $filename.tex
从命令行运行此脚本:
convert.sh my-source.md
这会将样式属性附加到所有将语言选项设置为 R 的块。样式本身在 中定义~/.pandoc/templates/ty.latex
。该文件的基本布局可以从 的输出中压接pandoc -D latex
,并且应该包括\lstdefinestyle{myRstyle}{...}
,如 Gonzalo 的示例所示。
脚本继续生成 pdf 输出,所以现在问题基本解决了。与直接使用 pandoc 或 knitr 而不是 sed 相比,它的可移植性较差,但也许这是不可能的。
答案1
您\lstdefinestyle
可以根据需要定义任意数量的样式;然后您可以使用\lstnewenvironment
这些新样式定义新的列表环境;这样,您就可以根据需要轻松更改列表的样式。您仍然可以使用 \lstset
来设置常规设置(适用于所有列表)。一个简单的例子:
\documentclass[]{article}
\usepackage{listings}
\usepackage[dvipsnames]{xcolor}
\lstset{ %<- general settings
columns=fixed,
basicstyle=\ttfamily,
frame=single,
keepspaces=true,
showstringspaces=false,
numbers=none}
\lstdefinestyle{myRstyle}{
backgroundcolor=\color[gray]{0.95},
}
\lstdefinestyle{mySstyle}{
backgroundcolor=\color{red!30},
}
\lstnewenvironment{myR}
{\lstset{language=R,style=myRstyle}}
{}
\lstnewenvironment{myS}
{\lstset{language=R,style=mySstyle}}
{}
\begin{document}
Here's some regular text.
\begin{lstlisting}
## speed dist
## Min. : 4.0 Min. : 2
## 1st Qu.:12.0 1st Qu.: 26
## Median :15.0 Median : 36
## Mean :15.4 Mean : 43
## 3rd Qu.:19.0 3rd Qu.: 56
## Max. :25.0 Max. :120
\end{lstlisting}
\begin{myR}
## speed dist
## Min. : 4.0 Min. : 2
## 1st Qu.:12.0 1st Qu.: 26
## Median :15.0 Median : 36
## Mean :15.4 Mean : 43
## 3rd Qu.:19.0 3rd Qu.: 56
## Max. :25.0 Max. :120
\end{myR}
\begin{myS}
## speed dist
## Min. : 4.0 Min. : 2
## 1st Qu.:12.0 1st Qu.: 26
## Median :15.0 Median : 36
## Mean :15.4 Mean : 43
## 3rd Qu.:19.0 3rd Qu.: 56
## Max. :25.0 Max. :120
\end{myS}
\end{document}
最好使用 loadxcolor
而不是color
;usenames
的选项xcolor
已被弃用,并且没有必要使用它。