默认列表和特定语言列表使用不同颜色

默认列表和特定语言列表使用不同颜色

我正在使用 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}

enter image description here

最好使用 loadxcolor而不是colorusenames的选项xcolor已被弃用,并且没有必要使用它。

相关内容